Commit | Line | Data |
---|---|---|
d8af6b8b MT |
1 | /* @(#)freopen.c 4.2 (Berkeley) %G% */ |
2 | #include <stdio.h> | |
3 | #include <errno.h> | |
2de31004 BJ |
4 | |
5 | FILE * | |
6 | freopen(file, mode, iop) | |
7 | char *file; | |
8 | register char *mode; | |
9 | register FILE *iop; | |
10 | { | |
d8af6b8b MT |
11 | extern int errno; |
12 | register f, rw; | |
13 | ||
14 | rw = mode[1] == '+'; | |
2de31004 BJ |
15 | |
16 | fclose(iop); | |
d8af6b8b | 17 | if (*mode=='w') { |
2de31004 | 18 | f = creat(file, 0666); |
d8af6b8b MT |
19 | if (rw && f>=0) { |
20 | close(f); | |
21 | f = open(file, 2); | |
22 | } | |
23 | } else if (*mode=='a') { | |
24 | if ((f = open(file, rw? 2: 1)) < 0) { | |
25 | if (errno == ENOENT) { | |
26 | f = creat(file, 0666); | |
27 | if (rw && f>=0) { | |
28 | close(f); | |
29 | f = open(file, 2); | |
30 | } | |
31 | } | |
32 | } | |
33 | if (f >= 0) | |
34 | lseek(f, 0L, 2); | |
2de31004 | 35 | } else |
d8af6b8b | 36 | f = open(file, rw? 2: 0); |
2de31004 BJ |
37 | if (f < 0) |
38 | return(NULL); | |
d8af6b8b | 39 | iop->_cnt = 0; |
2de31004 | 40 | iop->_file = f; |
d8af6b8b MT |
41 | if (rw) |
42 | iop->_flag |= _IORW; | |
43 | else if (*mode != 'r') | |
2de31004 BJ |
44 | iop->_flag |= _IOWRT; |
45 | else | |
46 | iop->_flag |= _IOREAD; | |
47 | return(iop); | |
48 | } |