xref: /csrg-svn/lib/libc/stdio/freopen.c (revision 21407)
1*21407Sdist /*
2*21407Sdist  * Copyright (c) 1980 Regents of the University of California.
3*21407Sdist  * All rights reserved.  The Berkeley software License Agreement
4*21407Sdist  * specifies the terms and conditions for redistribution.
5*21407Sdist  */
6*21407Sdist 
7*21407Sdist #ifndef lint
8*21407Sdist static char sccsid[] = "@(#)freopen.c	5.1 (Berkeley) 05/30/85";
9*21407Sdist #endif not lint
10*21407Sdist 
1117951Sserge #include <sys/types.h>
1217951Sserge #include <sys/file.h>
1317951Sserge #include <stdio.h>
142008Swnj 
152008Swnj FILE *
162008Swnj freopen(file, mode, iop)
1717951Sserge 	char *file;
1817951Sserge 	register char *mode;
1917951Sserge 	register FILE *iop;
202008Swnj {
2117951Sserge 	register f, rw, oflags;
222008Swnj 
2317951Sserge 	rw = (mode[1] == '+');
243163Stoy 
252008Swnj 	fclose(iop);
2617951Sserge 
2717951Sserge 	switch (*mode) {
2817951Sserge 	case 'a':
2917951Sserge 		oflags = O_CREAT | (rw ? O_RDWR : O_WRONLY);
3017951Sserge 		break;
3117951Sserge 	case 'r':
3217951Sserge 		oflags = rw ? O_RDWR : O_RDONLY;
3317951Sserge 		break;
3417951Sserge 	case 'w':
3517951Sserge 		oflags = O_TRUNC | O_CREAT | (rw ? O_RDWR : O_WRONLY);
3617951Sserge 		break;
3717951Sserge 	default:
3817951Sserge 		return (NULL);
3917951Sserge 	}
4017951Sserge 
4117951Sserge 	f = open(file, oflags, 0666);
422008Swnj 	if (f < 0)
4317951Sserge 		return (NULL);
4417951Sserge 
4517951Sserge 	if (*mode == 'a')
4617951Sserge 		lseek(f, (off_t)0, L_XTND);
4717951Sserge 
483163Stoy 	iop->_cnt = 0;
492008Swnj 	iop->_file = f;
5017951Sserge 	iop->_bufsiz = 0;
513163Stoy 	if (rw)
5217951Sserge 		iop->_flag = _IORW;
5317951Sserge 	else if (*mode == 'r')
5417951Sserge 		iop->_flag = _IOREAD;
552008Swnj 	else
5617951Sserge 		iop->_flag = _IOWRT;
5717951Sserge 	iop->_base = iop->_ptr = NULL;
5817951Sserge 	return (iop);
592008Swnj }
60