]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libstdio/fdopen.c
Import sources from 2011-03-30 iso image
[plan9front.git] / sys / src / libstdio / fdopen.c
1 /*
2  * Posix stdio -- fdopen
3  */
4 #include "iolib.h"
5 /*
6  * Open the named file with the given mode, using the given FILE
7  * Legal modes are given below, `additional characters may follow these sequences':
8  * r rb         open to read
9  * w wb         open to write, truncating
10  * a ab         open to write positioned at eof, creating if non-existant
11  * r+ r+b rb+   open to read and write, creating if non-existant
12  * w+ w+b wb+   open to read and write, truncating
13  * a+ a+b ab+   open to read and write, positioned at eof, creating if non-existant.
14  */
15 FILE *fdopen(const int fd, const char *mode){
16         FILE *f;        
17         qlock(&_stdiolk);
18         for(f=_IO_stream;f!=&_IO_stream[FOPEN_MAX];f++)
19                 if(f->state==CLOSED)
20                         break;
21         if(f==&_IO_stream[FOPEN_MAX]) {
22                 qunlock(&_stdiolk);
23                 return NULL;
24         }
25         f->fd=fd;
26         if(mode[0]=='a')
27                 seek(f->fd, 0L, 2);
28         if(f->fd==-1) return NULL;
29         f->flags=0;
30         f->state=OPEN;
31         f->buf=0;
32         f->rp=0;
33         f->wp=0;
34         f->lp=0;
35         qunlock(&_stdiolk);
36         return f;
37 }