13e12c5d1SDavid du Colombier /* 23e12c5d1SDavid du Colombier * pANS stdio -- freopen 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 */ 153ff48bf5SDavid du Colombier FILE *freopen(const char *name, const char *mode, FILE *f){ 163ff48bf5SDavid du Colombier int m; 173ff48bf5SDavid du Colombier 183ff48bf5SDavid du Colombier if(f->state!=CLOSED){ 193ff48bf5SDavid du Colombier fclose(f); 20*d9306527SDavid du Colombier /* premature; fall through and see what happens */ 21*d9306527SDavid du Colombier /* f->state=OPEN; */ 223e12c5d1SDavid du Colombier } 233ff48bf5SDavid du Colombier 243ff48bf5SDavid du Colombier m = *mode++; 253ff48bf5SDavid du Colombier if(m == 0) 263ff48bf5SDavid du Colombier return NULL; 273ff48bf5SDavid du Colombier if(*mode == 'b') 283ff48bf5SDavid du Colombier mode++; 293ff48bf5SDavid du Colombier switch(m){ 303ff48bf5SDavid du Colombier default: 313ff48bf5SDavid du Colombier return NULL; 323e12c5d1SDavid du Colombier case 'r': 33*d9306527SDavid du Colombier f->fd=open(name, (*mode == '+'? O_RDWR: O_RDONLY)); 343e12c5d1SDavid du Colombier break; 353e12c5d1SDavid du Colombier case 'w': 36*d9306527SDavid du Colombier f->fd=creat(name, 0666); /* implicitly O_WRONLY */ 37*d9306527SDavid du Colombier /* for O_RDWR, have to creat, close, open */ 38*d9306527SDavid du Colombier if(*mode == '+' && f->fd >= 0) { 39*d9306527SDavid du Colombier close(f->fd); 40*d9306527SDavid du Colombier f->fd=open(name, O_RDWR); 41*d9306527SDavid du Colombier } 423e12c5d1SDavid du Colombier break; 433e12c5d1SDavid du Colombier case 'a': 44*d9306527SDavid du Colombier f->fd=open(name, (*mode == '+'? O_RDWR: O_WRONLY)); 45*d9306527SDavid du Colombier if(f->fd<0) { 463ff48bf5SDavid du Colombier f->fd=creat(name, 0666); 47*d9306527SDavid du Colombier /* for O_RDWR, have to creat, close, open */ 48*d9306527SDavid du Colombier if(*mode == '+' && f->fd >= 0) { 49*d9306527SDavid du Colombier close(f->fd); 50*d9306527SDavid du Colombier f->fd=open(name, O_RDWR); 51*d9306527SDavid du Colombier } 52*d9306527SDavid du Colombier } 533e12c5d1SDavid du Colombier lseek(f->fd, 0L, 2); 543e12c5d1SDavid du Colombier break; 553e12c5d1SDavid du Colombier } 563ff48bf5SDavid du Colombier 573ff48bf5SDavid du Colombier if(f->fd==-1) 583ff48bf5SDavid du Colombier return NULL; 593e12c5d1SDavid du Colombier f->flags=(mode[0]=='a')? APPEND : 0; 603e12c5d1SDavid du Colombier f->state=OPEN; 613e12c5d1SDavid du Colombier f->buf=0; 623e12c5d1SDavid du Colombier f->rp=0; 633e12c5d1SDavid du Colombier f->wp=0; 643e12c5d1SDavid du Colombier f->lp=0; 653e12c5d1SDavid du Colombier return f; 663e12c5d1SDavid du Colombier } 67