1 /* 2 * Copyright (c) 1980 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 */ 6 7 #ifndef lint 8 static char sccsid[] = "@(#)fopen.c 5.1 (Berkeley) 05/30/85"; 9 #endif not lint 10 11 #include <sys/types.h> 12 #include <sys/file.h> 13 #include <stdio.h> 14 15 FILE * 16 fopen(file, mode) 17 char *file; 18 register char *mode; 19 { 20 register FILE *iop; 21 register f, rw, oflags; 22 extern FILE *_findiop(); 23 24 iop = _findiop(); 25 if (iop == NULL) 26 return (NULL); 27 28 rw = (mode[1] == '+'); 29 30 switch (*mode) { 31 case 'a': 32 oflags = O_CREAT | (rw ? O_RDWR : O_WRONLY); 33 break; 34 case 'r': 35 oflags = rw ? O_RDWR : O_RDONLY; 36 break; 37 case 'w': 38 oflags = O_TRUNC | O_CREAT | (rw ? O_RDWR : O_WRONLY); 39 break; 40 default: 41 return (NULL); 42 } 43 44 f = open(file, oflags, 0666); 45 if (f < 0) 46 return (NULL); 47 48 if (*mode == 'a') 49 lseek(f, (off_t)0, L_XTND); 50 51 iop->_cnt = 0; 52 iop->_file = f; 53 iop->_bufsiz = 0; 54 if (rw) 55 iop->_flag = _IORW; 56 else if (*mode == 'r') 57 iop->_flag = _IOREAD; 58 else 59 iop->_flag = _IOWRT; 60 iop->_base = iop->_ptr = NULL; 61 return (iop); 62 } 63