check for blocks allocated past end of file in indirect blocks
[unix-history] / usr / src / lib / libc / stdio / freopen.c
CommitLineData
d8af6b8b
MT
1/* @(#)freopen.c 4.2 (Berkeley) %G% */
2#include <stdio.h>
3#include <errno.h>
2de31004
BJ
4
5FILE *
6freopen(file, mode, iop)
7char *file;
8register char *mode;
9register 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}