aboutsummaryrefslogtreecommitdiff
path: root/src/base/io/flush.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/io/flush.c')
-rw-r--r--src/base/io/flush.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/src/base/io/flush.c b/src/base/io/flush.c
index 0f1217a..ff970b4 100644
--- a/src/base/io/flush.c
+++ b/src/base/io/flush.c
@@ -1,7 +1,36 @@
#include "internal.h"
int
-io·flush(io·Stream *s)
+io·flush(io·Header *io)
{
- return fflush(s);
+ intptr ni, no;
+
+ switch(io->state){
+ case io·BufWtr:
+ if((ni = io->cap + io->olen))
+ return 0;
+
+ sys·write(io->fd, ni, io->b, &no);
+
+ if(no!=ni){
+ io->pos += ni;
+ io->olen = -io->cap;
+ return 0;
+ }
+
+ io->state = io·BufNil;
+ io->olen = 0;
+ break;
+
+ case io·BufEof:
+ io->state = io·BufRdr;
+ /* fallthrough */
+ case io·BufRdr:
+ io->ilen = 0;
+ io->g = io->e;
+ return 0;
+ default:
+ ;
+ }
+ return io·BufEof;
}