aboutsummaryrefslogtreecommitdiff
path: root/src/base/io/flush.c
blob: ff970b49f6a5e4295e03528e3a9e5be2808e886b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include "internal.h"

int
io·flush(io·Header *io)
{
    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;
}