xref: /csrg-svn/lib/libc/stdio/freopen.c (revision 3163)
1*3163Stoy /* @(#)freopen.c	4.2 (Berkeley) 03/09/81 */
2*3163Stoy #include	<stdio.h>
3*3163Stoy #include	<errno.h>
42008Swnj 
52008Swnj FILE *
62008Swnj freopen(file, mode, iop)
72008Swnj char *file;
82008Swnj register char *mode;
92008Swnj register FILE *iop;
102008Swnj {
11*3163Stoy 	extern int errno;
12*3163Stoy 	register f, rw;
132008Swnj 
14*3163Stoy 	rw = mode[1] == '+';
15*3163Stoy 
162008Swnj 	fclose(iop);
17*3163Stoy 	if (*mode=='w') {
182008Swnj 		f = creat(file, 0666);
19*3163Stoy 		if (rw && f>=0) {
20*3163Stoy 			close(f);
21*3163Stoy 			f = open(file, 2);
22*3163Stoy 		}
23*3163Stoy 	} else if (*mode=='a') {
24*3163Stoy 		if ((f = open(file, rw? 2: 1)) < 0) {
25*3163Stoy 			if (errno == ENOENT) {
26*3163Stoy 				f = creat(file, 0666);
27*3163Stoy 				if (rw && f>=0) {
28*3163Stoy 					close(f);
29*3163Stoy 					f = open(file, 2);
30*3163Stoy 				}
31*3163Stoy 			}
32*3163Stoy 		}
33*3163Stoy 		if (f >= 0)
34*3163Stoy 			lseek(f, 0L, 2);
352008Swnj 	} else
36*3163Stoy 		f = open(file, rw? 2: 0);
372008Swnj 	if (f < 0)
382008Swnj 		return(NULL);
39*3163Stoy 	iop->_cnt = 0;
402008Swnj 	iop->_file = f;
41*3163Stoy 	if (rw)
42*3163Stoy 		iop->_flag |= _IORW;
43*3163Stoy 	else if (*mode != 'r')
442008Swnj 		iop->_flag |= _IOWRT;
452008Swnj 	else
462008Swnj 		iop->_flag |= _IOREAD;
472008Swnj 	return(iop);
482008Swnj }
49