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