xref: /csrg-svn/lib/libc/stdio/fopen.c (revision 2004)
1*2004Swnj /* @(#)fopen.c	4.1 (Berkeley) 12/21/80 */
2*2004Swnj #include	<stdio.h>
3*2004Swnj #include	<errno.h>
4*2004Swnj 
5*2004Swnj FILE *
6*2004Swnj fopen(file, mode)
7*2004Swnj char *file;
8*2004Swnj register char *mode;
9*2004Swnj {
10*2004Swnj 	extern int errno;
11*2004Swnj 	register f;
12*2004Swnj 	register FILE *iop;
13*2004Swnj 	extern FILE *_lastbuf;
14*2004Swnj 
15*2004Swnj 	for (iop = _iob; iop->_flag&(_IOREAD|_IOWRT); iop++)
16*2004Swnj 		if (iop >= _lastbuf)
17*2004Swnj 			return(NULL);
18*2004Swnj 	if (*mode=='w')
19*2004Swnj 		f = creat(file, 0666);
20*2004Swnj 	else if (*mode=='a') {
21*2004Swnj 		if ((f = open(file, 1)) < 0) {
22*2004Swnj 			if (errno == ENOENT)
23*2004Swnj 				f = creat(file, 0666);
24*2004Swnj 		}
25*2004Swnj 		if (f >= 0)
26*2004Swnj 			lseek(f, 0L, 2);
27*2004Swnj 	} else
28*2004Swnj 		f = open(file, 0);
29*2004Swnj 	if (f < 0)
30*2004Swnj 		return(NULL);
31*2004Swnj 	iop->_cnt = 0;
32*2004Swnj 	iop->_file = f;
33*2004Swnj 	if (*mode != 'r')
34*2004Swnj 		iop->_flag |= _IOWRT;
35*2004Swnj 	else
36*2004Swnj 		iop->_flag |= _IOREAD;
37*2004Swnj 	return(iop);
38*2004Swnj }
39