xref: /csrg-svn/lib/libc/stdio/fopen.c (revision 21404)
1*21404Sdist /*
2*21404Sdist  * Copyright (c) 1980 Regents of the University of California.
3*21404Sdist  * All rights reserved.  The Berkeley software License Agreement
4*21404Sdist  * specifies the terms and conditions for redistribution.
5*21404Sdist  */
6*21404Sdist 
7*21404Sdist #ifndef lint
8*21404Sdist static char sccsid[] = "@(#)fopen.c	5.1 (Berkeley) 05/30/85";
9*21404Sdist #endif not lint
10*21404Sdist 
1117951Sserge #include <sys/types.h>
1217951Sserge #include <sys/file.h>
1317951Sserge #include <stdio.h>
142004Swnj 
152004Swnj FILE *
162004Swnj fopen(file, mode)
1717951Sserge 	char *file;
1817951Sserge 	register char *mode;
192004Swnj {
202004Swnj 	register FILE *iop;
2117951Sserge 	register f, rw, oflags;
2217951Sserge 	extern FILE *_findiop();
232004Swnj 
2417951Sserge 	iop = _findiop();
2517951Sserge 	if (iop == NULL)
2617951Sserge 		return (NULL);
273163Stoy 
2817951Sserge 	rw = (mode[1] == '+');
293163Stoy 
3017951Sserge 	switch (*mode) {
3117951Sserge 	case 'a':
3217951Sserge 		oflags = O_CREAT | (rw ? O_RDWR : O_WRONLY);
3317951Sserge 		break;
3417951Sserge 	case 'r':
3517951Sserge 		oflags = rw ? O_RDWR : O_RDONLY;
3617951Sserge 		break;
3717951Sserge 	case 'w':
3817951Sserge 		oflags = O_TRUNC | O_CREAT | (rw ? O_RDWR : O_WRONLY);
3917951Sserge 		break;
4017951Sserge 	default:
4117951Sserge 		return (NULL);
4217951Sserge 	}
4317951Sserge 
4417951Sserge 	f = open(file, oflags, 0666);
452004Swnj 	if (f < 0)
4617951Sserge 		return (NULL);
4717951Sserge 
4817951Sserge 	if (*mode == 'a')
4917951Sserge 		lseek(f, (off_t)0, L_XTND);
5017951Sserge 
512004Swnj 	iop->_cnt = 0;
522004Swnj 	iop->_file = f;
5317951Sserge 	iop->_bufsiz = 0;
543163Stoy 	if (rw)
5517951Sserge 		iop->_flag = _IORW;
5617951Sserge 	else if (*mode == 'r')
5717951Sserge 		iop->_flag = _IOREAD;
582004Swnj 	else
5917951Sserge 		iop->_flag = _IOWRT;
6017951Sserge 	iop->_base = iop->_ptr = NULL;
6117951Sserge 	return (iop);
622004Swnj }
63