summaryrefslogtreecommitdiff
path: root/sys/src/libbio
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2014-12-14 20:21:42 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2014-12-14 20:21:42 +0100
commit035aacf6f5c23f0513e240046818ef203e8d87cb (patch)
tree287c703bebdd3566486f8fb0535c5b1d21a5b639 /sys/src/libbio
parent4afb56f570b3d6943e39bda5c9a2992a3bd139d2 (diff)
bio: add Bfdopen() from plan9port
Diffstat (limited to 'sys/src/libbio')
-rw-r--r--sys/src/libbio/binit.c38
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;
}