diff options
author | Nicholas Noll <nbnoll@eml.cc> | 2021-12-04 14:10:21 -0800 |
---|---|---|
committer | Nicholas Noll <nbnoll@eml.cc> | 2021-12-04 14:10:21 -0800 |
commit | 12e09f9f85ac48ff891adf92f3b2c9a5fea27273 (patch) | |
tree | 60051793885e9978dadf6672ef85cdda216676a2 /src/base/io/init.c | |
parent | b80a3d28ce42be4fdec451f74620b10ee75219dc (diff) |
Chore(REMOVE): finished deprecation of old io functions.
The old methods were simple wrappers of C standard library functions.
We've moved (painfully) over to a new interface that allows for files to
live on the stack. All users of the functionality are ported over.
Diffstat (limited to 'src/base/io/init.c')
-rw-r--r-- | src/base/io/init.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/base/io/init.c b/src/base/io/init.c new file mode 100644 index 0000000..81b26c2 --- /dev/null +++ b/src/base/io/init.c @@ -0,0 +1,102 @@ +#include "internal.h" + +#define MAXHEADERS 20 +static io·Header *tracked[MAXHEADERS]; +static int doexit; + +static void +untrackall(void *arg) +{ + int i; + io·Header *it; + + for(i=0; i < MAXHEADERS; i++){ + it = tracked[i]; + if(it){ + tracked[i] = nil; + io·flush(it); + } + } +} + +static void +untrack(io·Header *io) +{ + int i; + + for(i=0; i<arrlen(tracked); i++){ + if(tracked[i] == io) + tracked[i] = nil; + } +} + +static void +track(io·Header *io) +{ + int i; + + untrack(io); + for(i=0; i<arrlen(tracked); i++){ + if(!tracked[i]){ + tracked[i] = io; + break; + } + } + + if(!doexit){ + doexit = 1; + rt·atexit(untrackall, nil); + } +} + +int +io·initcap(io·Header *io, int fd, int mode, int cap, uchar *buf) +{ + buf += io·BufUngets; + cap += io·BufUngets; + + switch(mode & ~(sys·OCloseExec|sys·OTrunc)){ + default: + /* fmt·fprint(2, "initcap: unknown mode %d\n" , mode); */ + return io·BufErr; + case sys·ORead: + io->state = io·BufRdr; + io->olen = 0; + break; + case sys·OWrite: + track(io); + io->state = io·BufWtr; + io->olen = -cap; + break; + } + + io->b = buf; + io->e = buf+cap; + io->g = io->e; + io->fd = fd; + io->cap = cap; + io->pos = io->runesz = io->flag = io->ilen = io->nread = 0; + return 0; +} + +int +io·init(io·Buffer *io, int fd, int mode) +{ + return io·initcap(header(io), fd, mode, io·BufLen + io·BufUngets, io->bytes); +} + +int +io·close(io·Header *io) +{ + int err; + + untrack(io); + + err = io·flush(io); + if(io->flag == io·BufMagic){ + io->flag = 0; + if((err=sys·close(io->fd))) + return err; + } + return 0; +} |