13e12c5d1SDavid du Colombier /* 23e12c5d1SDavid du Colombier * Posix stdio -- fdopen 33e12c5d1SDavid du Colombier */ 43e12c5d1SDavid du Colombier #include "iolib.h" 53e12c5d1SDavid du Colombier /* 63e12c5d1SDavid du Colombier * Open the named file with the given mode, using the given FILE 73e12c5d1SDavid du Colombier * Legal modes are given below, `additional characters may follow these sequences': 83e12c5d1SDavid du Colombier * r rb open to read 93e12c5d1SDavid du Colombier * w wb open to write, truncating 103e12c5d1SDavid du Colombier * a ab open to write positioned at eof, creating if non-existant 113e12c5d1SDavid du Colombier * r+ r+b rb+ open to read and write, creating if non-existant 123e12c5d1SDavid du Colombier * w+ w+b wb+ open to read and write, truncating 133e12c5d1SDavid du Colombier * a+ a+b ab+ open to read and write, positioned at eof, creating if non-existant. 143e12c5d1SDavid du Colombier */ 153e12c5d1SDavid du Colombier FILE *fdopen(const int fd, const char *mode){ 163e12c5d1SDavid du Colombier FILE *f; 17*7dd7cddfSDavid du Colombier qlock(&_stdiolk); 183e12c5d1SDavid du Colombier for(f=_IO_stream;f!=&_IO_stream[FOPEN_MAX];f++) 193e12c5d1SDavid du Colombier if(f->state==CLOSED) 203e12c5d1SDavid du Colombier break; 21*7dd7cddfSDavid du Colombier if(f==&_IO_stream[FOPEN_MAX]) { 22*7dd7cddfSDavid du Colombier qunlock(&_stdiolk); 233e12c5d1SDavid du Colombier return NULL; 24*7dd7cddfSDavid du Colombier } 253e12c5d1SDavid du Colombier f->fd=fd; 263e12c5d1SDavid du Colombier if(mode[0]=='a') 273e12c5d1SDavid du Colombier seek(f->fd, 0L, 2); 283e12c5d1SDavid du Colombier if(f->fd==-1) return NULL; 293e12c5d1SDavid du Colombier f->flags=0; 303e12c5d1SDavid du Colombier f->state=OPEN; 313e12c5d1SDavid du Colombier f->buf=0; 323e12c5d1SDavid du Colombier f->rp=0; 333e12c5d1SDavid du Colombier f->wp=0; 343e12c5d1SDavid du Colombier f->lp=0; 35*7dd7cddfSDavid du Colombier qunlock(&_stdiolk); 363e12c5d1SDavid du Colombier return f; 373e12c5d1SDavid du Colombier } 38