xref: /csrg-svn/lib/libc/stdio/fopen.c (revision 17951)
1*17951Sserge /* @(#)fopen.c	4.4 (Berkeley) 02/13/85 */
2*17951Sserge #include <sys/types.h>
3*17951Sserge #include <sys/file.h>
4*17951Sserge #include <stdio.h>
52004Swnj 
62004Swnj FILE *
72004Swnj fopen(file, mode)
8*17951Sserge 	char *file;
9*17951Sserge 	register char *mode;
102004Swnj {
112004Swnj 	register FILE *iop;
12*17951Sserge 	register f, rw, oflags;
13*17951Sserge 	extern FILE *_findiop();
142004Swnj 
15*17951Sserge 	iop = _findiop();
16*17951Sserge 	if (iop == NULL)
17*17951Sserge 		return (NULL);
183163Stoy 
19*17951Sserge 	rw = (mode[1] == '+');
203163Stoy 
21*17951Sserge 	switch (*mode) {
22*17951Sserge 	case 'a':
23*17951Sserge 		oflags = O_CREAT | (rw ? O_RDWR : O_WRONLY);
24*17951Sserge 		break;
25*17951Sserge 	case 'r':
26*17951Sserge 		oflags = rw ? O_RDWR : O_RDONLY;
27*17951Sserge 		break;
28*17951Sserge 	case 'w':
29*17951Sserge 		oflags = O_TRUNC | O_CREAT | (rw ? O_RDWR : O_WRONLY);
30*17951Sserge 		break;
31*17951Sserge 	default:
32*17951Sserge 		return (NULL);
33*17951Sserge 	}
34*17951Sserge 
35*17951Sserge 	f = open(file, oflags, 0666);
362004Swnj 	if (f < 0)
37*17951Sserge 		return (NULL);
38*17951Sserge 
39*17951Sserge 	if (*mode == 'a')
40*17951Sserge 		lseek(f, (off_t)0, L_XTND);
41*17951Sserge 
422004Swnj 	iop->_cnt = 0;
432004Swnj 	iop->_file = f;
44*17951Sserge 	iop->_bufsiz = 0;
453163Stoy 	if (rw)
46*17951Sserge 		iop->_flag = _IORW;
47*17951Sserge 	else if (*mode == 'r')
48*17951Sserge 		iop->_flag = _IOREAD;
492004Swnj 	else
50*17951Sserge 		iop->_flag = _IOWRT;
51*17951Sserge 	iop->_base = iop->_ptr = NULL;
52*17951Sserge 	return (iop);
532004Swnj }
54