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