xref: /csrg-svn/lib/libc/stdio/freopen.c (revision 26652)
121407Sdist /*
221407Sdist  * Copyright (c) 1980 Regents of the University of California.
321407Sdist  * All rights reserved.  The Berkeley software License Agreement
421407Sdist  * specifies the terms and conditions for redistribution.
521407Sdist  */
621407Sdist 
7*26652Sdonn #if defined(LIBC_SCCS) && !defined(lint)
8*26652Sdonn static char sccsid[] = "@(#)freopen.c	5.2 (Berkeley) 03/09/86";
9*26652Sdonn #endif LIBC_SCCS and not lint
1021407Sdist 
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