1*3163Stoy /* @(#)freopen.c 4.2 (Berkeley) 03/09/81 */ 2*3163Stoy #include <stdio.h> 3*3163Stoy #include <errno.h> 42008Swnj 52008Swnj FILE * 62008Swnj freopen(file, mode, iop) 72008Swnj char *file; 82008Swnj register char *mode; 92008Swnj register FILE *iop; 102008Swnj { 11*3163Stoy extern int errno; 12*3163Stoy register f, rw; 132008Swnj 14*3163Stoy rw = mode[1] == '+'; 15*3163Stoy 162008Swnj fclose(iop); 17*3163Stoy if (*mode=='w') { 182008Swnj f = creat(file, 0666); 19*3163Stoy if (rw && f>=0) { 20*3163Stoy close(f); 21*3163Stoy f = open(file, 2); 22*3163Stoy } 23*3163Stoy } else if (*mode=='a') { 24*3163Stoy if ((f = open(file, rw? 2: 1)) < 0) { 25*3163Stoy if (errno == ENOENT) { 26*3163Stoy f = creat(file, 0666); 27*3163Stoy if (rw && f>=0) { 28*3163Stoy close(f); 29*3163Stoy f = open(file, 2); 30*3163Stoy } 31*3163Stoy } 32*3163Stoy } 33*3163Stoy if (f >= 0) 34*3163Stoy lseek(f, 0L, 2); 352008Swnj } else 36*3163Stoy f = open(file, rw? 2: 0); 372008Swnj if (f < 0) 382008Swnj return(NULL); 39*3163Stoy iop->_cnt = 0; 402008Swnj iop->_file = f; 41*3163Stoy if (rw) 42*3163Stoy iop->_flag |= _IORW; 43*3163Stoy else if (*mode != 'r') 442008Swnj iop->_flag |= _IOWRT; 452008Swnj else 462008Swnj iop->_flag |= _IOREAD; 472008Swnj return(iop); 482008Swnj } 49