1*17951Sserge /* @(#)freopen.c 4.3 (Berkeley) 02/13/85 */ 2*17951Sserge #include <sys/types.h> 3*17951Sserge #include <sys/file.h> 4*17951Sserge #include <stdio.h> 52008Swnj 62008Swnj FILE * 72008Swnj freopen(file, mode, iop) 8*17951Sserge char *file; 9*17951Sserge register char *mode; 10*17951Sserge register FILE *iop; 112008Swnj { 12*17951Sserge register f, rw, oflags; 132008Swnj 14*17951Sserge rw = (mode[1] == '+'); 153163Stoy 162008Swnj fclose(iop); 17*17951Sserge 18*17951Sserge switch (*mode) { 19*17951Sserge case 'a': 20*17951Sserge oflags = O_CREAT | (rw ? O_RDWR : O_WRONLY); 21*17951Sserge break; 22*17951Sserge case 'r': 23*17951Sserge oflags = rw ? O_RDWR : O_RDONLY; 24*17951Sserge break; 25*17951Sserge case 'w': 26*17951Sserge oflags = O_TRUNC | O_CREAT | (rw ? O_RDWR : O_WRONLY); 27*17951Sserge break; 28*17951Sserge default: 29*17951Sserge return (NULL); 30*17951Sserge } 31*17951Sserge 32*17951Sserge f = open(file, oflags, 0666); 332008Swnj if (f < 0) 34*17951Sserge return (NULL); 35*17951Sserge 36*17951Sserge if (*mode == 'a') 37*17951Sserge lseek(f, (off_t)0, L_XTND); 38*17951Sserge 393163Stoy iop->_cnt = 0; 402008Swnj iop->_file = f; 41*17951Sserge iop->_bufsiz = 0; 423163Stoy if (rw) 43*17951Sserge iop->_flag = _IORW; 44*17951Sserge else if (*mode == 'r') 45*17951Sserge iop->_flag = _IOREAD; 462008Swnj else 47*17951Sserge iop->_flag = _IOWRT; 48*17951Sserge iop->_base = iop->_ptr = NULL; 49*17951Sserge return (iop); 502008Swnj } 51