1 /* @(#)freopen.c 4.3 (Berkeley) 02/13/85 */ 2 #include <sys/types.h> 3 #include <sys/file.h> 4 #include <stdio.h> 5 6 FILE * 7 freopen(file, mode, iop) 8 char *file; 9 register char *mode; 10 register FILE *iop; 11 { 12 register f, rw, oflags; 13 14 rw = (mode[1] == '+'); 15 16 fclose(iop); 17 18 switch (*mode) { 19 case 'a': 20 oflags = O_CREAT | (rw ? O_RDWR : O_WRONLY); 21 break; 22 case 'r': 23 oflags = rw ? O_RDWR : O_RDONLY; 24 break; 25 case 'w': 26 oflags = O_TRUNC | O_CREAT | (rw ? O_RDWR : O_WRONLY); 27 break; 28 default: 29 return (NULL); 30 } 31 32 f = open(file, oflags, 0666); 33 if (f < 0) 34 return (NULL); 35 36 if (*mode == 'a') 37 lseek(f, (off_t)0, L_XTND); 38 39 iop->_cnt = 0; 40 iop->_file = f; 41 iop->_bufsiz = 0; 42 if (rw) 43 iop->_flag = _IORW; 44 else if (*mode == 'r') 45 iop->_flag = _IOREAD; 46 else 47 iop->_flag = _IOWRT; 48 iop->_base = iop->_ptr = NULL; 49 return (iop); 50 } 51