xref: /csrg-svn/lib/libc/stdio/fopen.c (revision 3163)
1*3163Stoy /* @(#)fopen.c	4.2 (Berkeley) 03/09/81 */
22004Swnj #include	<stdio.h>
32004Swnj #include	<errno.h>
42004Swnj 
52004Swnj FILE *
62004Swnj fopen(file, mode)
72004Swnj char *file;
82004Swnj register char *mode;
92004Swnj {
102004Swnj 	extern int errno;
11*3163Stoy 	register f, rw;
122004Swnj 	register FILE *iop;
132004Swnj 	extern FILE *_lastbuf;
142004Swnj 
15*3163Stoy 	for (iop = _iob; iop->_flag&(_IOREAD|_IOWRT|_IORW); iop++)
162004Swnj 		if (iop >= _lastbuf)
172004Swnj 			return(NULL);
18*3163Stoy 
19*3163Stoy 	rw = mode[1] == '+';
20*3163Stoy 
21*3163Stoy 	if (*mode=='w') {
222004Swnj 		f = creat(file, 0666);
23*3163Stoy 		if (rw && f>=0) {
24*3163Stoy 			close(f);
25*3163Stoy 			f = open(file, 2);
26*3163Stoy 		}
27*3163Stoy 	} else if (*mode=='a') {
28*3163Stoy 		if ((f = open(file, rw? 2: 1)) < 0) {
29*3163Stoy 			if (errno == ENOENT) {
302004Swnj 				f = creat(file, 0666);
31*3163Stoy 				if (rw && f>=0) {
32*3163Stoy 					close(f);
33*3163Stoy 					f = open(file, 2);
34*3163Stoy 				}
35*3163Stoy 			}
362004Swnj 		}
372004Swnj 		if (f >= 0)
382004Swnj 			lseek(f, 0L, 2);
392004Swnj 	} else
40*3163Stoy 		f = open(file, rw? 2: 0);
412004Swnj 	if (f < 0)
422004Swnj 		return(NULL);
432004Swnj 	iop->_cnt = 0;
442004Swnj 	iop->_file = f;
45*3163Stoy 	if (rw)
46*3163Stoy 		iop->_flag |= _IORW;
47*3163Stoy 	else if (*mode != 'r')
482004Swnj 		iop->_flag |= _IOWRT;
492004Swnj 	else
502004Swnj 		iop->_flag |= _IOREAD;
512004Swnj 	return(iop);
522004Swnj }
53