diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-12-14 20:21:42 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-12-14 20:21:42 +0100 |
commit | 035aacf6f5c23f0513e240046818ef203e8d87cb (patch) | |
tree | 287c703bebdd3566486f8fb0535c5b1d21a5b639 /sys/src/libbio | |
parent | 4afb56f570b3d6943e39bda5c9a2992a3bd139d2 (diff) |
bio: add Bfdopen() from plan9port
Diffstat (limited to 'sys/src/libbio')
-rw-r--r-- | sys/src/libbio/binit.c | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/sys/src/libbio/binit.c b/sys/src/libbio/binit.c index 36ed50ace..9afae5b34 100644 --- a/sys/src/libbio/binit.c +++ b/sys/src/libbio/binit.c @@ -53,7 +53,6 @@ install(Biobufhdr *bp) int Binits(Biobufhdr *bp, int f, int mode, uchar *p, int size) { - p += Bungetsize; /* make room for Bungets */ size -= Bungetsize; @@ -95,28 +94,47 @@ Binit(Biobuf *bp, int f, int mode) } Biobuf* +Bfdopen(int fd, int mode) +{ + Biobuf *bp; + + bp = malloc(sizeof(Biobuf)); + if(bp == nil) + return nil; + if(Binits(bp, fd, mode, bp->b, sizeof(bp->b)) != 0){ + free(bp); + return nil; + } + bp->flag = Bmagic; /* mark bp open & malloced */ + setmalloctag(bp, getcallerpc(&fd)); + return bp; +} + +Biobuf* Bopen(char *name, int mode) { Biobuf *bp; - int f; + int fd; switch(mode&~(OCEXEC|ORCLOSE|OTRUNC)) { default: fprint(2, "Bopen: unknown mode %#x\n", mode); - return 0; + return nil; case OREAD: - f = open(name, mode); + fd = open(name, mode); break; case OWRITE: - f = create(name, mode, 0666); + fd = create(name, mode, 0666); break; } - if(f < 0) - return 0; - bp = malloc(sizeof(Biobuf)); + if(fd < 0) + return nil; + bp = Bfdopen(fd, mode); + if(bp == nil){ + close(fd); + return nil; + } setmalloctag(bp, getcallerpc(&name)); - Binits(bp, f, mode, bp->b, sizeof(bp->b)); - bp->flag = Bmagic; /* mark bp open & malloced */ return bp; } |