Commit | Line | Data |
---|---|---|
1bd0b214 BJ |
1 | /* Copyright (c) 1979 Regents of the University of California */ |
2 | #include <stdio.h> | |
3 | ||
4 | struct _iobuf *freopen(file, mode, iop) | |
5 | register char *mode; | |
6 | register struct _iobuf *iop; | |
7 | { | |
8 | register f; | |
9 | int unixmode, a_flag; | |
10 | ||
11 | fclose(iop); | |
12 | a_flag = 0; | |
13 | for(;*mode;mode++) { | |
14 | switch(*mode) { | |
15 | ||
16 | case 'w': | |
17 | iop->_flag |= _IOWRT; | |
18 | break; | |
19 | ||
20 | case 'r': | |
21 | iop->_flag |= _IOREAD; | |
22 | break; | |
23 | ||
24 | case 'a': | |
25 | a_flag = 1; | |
26 | iop->_flag |= _IOWRT ; | |
27 | } | |
28 | } | |
29 | if((unixmode = (iop->_flag & 3) - 1) < 0) { | |
30 | unixmode = 0; | |
31 | iop->_flag = 1; | |
32 | } | |
33 | if ((iop->_flag & _IOWRT) && a_flag==0 ) { | |
34 | f = creat(file, 0644); | |
35 | if((iop->_flag & _IOREAD) && (f > 0)) { | |
36 | close(f); | |
37 | f = open(file,2); | |
38 | } | |
39 | } else if ((0>(f = open(file, unixmode))) && (a_flag || !(iop->_flag&_IOREAD))){ | |
40 | f = creat(file, 0644); | |
41 | close(f); | |
42 | f = open(file,unixmode); | |
43 | } | |
44 | ||
45 | if (f < 0) | |
46 | return(NULL); | |
47 | if (a_flag) | |
48 | lseek(f, (long) 0, 2); | |
49 | iop->_file = f; | |
50 | return(iop); | |
51 | } |