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