xref: /csrg-svn/lib/libc/stdio/freopen.c (revision 17951)
1*17951Sserge /* @(#)freopen.c	4.3 (Berkeley) 02/13/85 */
2*17951Sserge #include <sys/types.h>
3*17951Sserge #include <sys/file.h>
4*17951Sserge #include <stdio.h>
52008Swnj 
62008Swnj FILE *
72008Swnj freopen(file, mode, iop)
8*17951Sserge 	char *file;
9*17951Sserge 	register char *mode;
10*17951Sserge 	register FILE *iop;
112008Swnj {
12*17951Sserge 	register f, rw, oflags;
132008Swnj 
14*17951Sserge 	rw = (mode[1] == '+');
153163Stoy 
162008Swnj 	fclose(iop);
17*17951Sserge 
18*17951Sserge 	switch (*mode) {
19*17951Sserge 	case 'a':
20*17951Sserge 		oflags = O_CREAT | (rw ? O_RDWR : O_WRONLY);
21*17951Sserge 		break;
22*17951Sserge 	case 'r':
23*17951Sserge 		oflags = rw ? O_RDWR : O_RDONLY;
24*17951Sserge 		break;
25*17951Sserge 	case 'w':
26*17951Sserge 		oflags = O_TRUNC | O_CREAT | (rw ? O_RDWR : O_WRONLY);
27*17951Sserge 		break;
28*17951Sserge 	default:
29*17951Sserge 		return (NULL);
30*17951Sserge 	}
31*17951Sserge 
32*17951Sserge 	f = open(file, oflags, 0666);
332008Swnj 	if (f < 0)
34*17951Sserge 		return (NULL);
35*17951Sserge 
36*17951Sserge 	if (*mode == 'a')
37*17951Sserge 		lseek(f, (off_t)0, L_XTND);
38*17951Sserge 
393163Stoy 	iop->_cnt = 0;
402008Swnj 	iop->_file = f;
41*17951Sserge 	iop->_bufsiz = 0;
423163Stoy 	if (rw)
43*17951Sserge 		iop->_flag = _IORW;
44*17951Sserge 	else if (*mode == 'r')
45*17951Sserge 		iop->_flag = _IOREAD;
462008Swnj 	else
47*17951Sserge 		iop->_flag = _IOWRT;
48*17951Sserge 	iop->_base = iop->_ptr = NULL;
49*17951Sserge 	return (iop);
502008Swnj }
51