1*17951Sserge /* @(#)fopen.c 4.4 (Berkeley) 02/13/85 */ 2*17951Sserge #include <sys/types.h> 3*17951Sserge #include <sys/file.h> 4*17951Sserge #include <stdio.h> 52004Swnj 62004Swnj FILE * 72004Swnj fopen(file, mode) 8*17951Sserge char *file; 9*17951Sserge register char *mode; 102004Swnj { 112004Swnj register FILE *iop; 12*17951Sserge register f, rw, oflags; 13*17951Sserge extern FILE *_findiop(); 142004Swnj 15*17951Sserge iop = _findiop(); 16*17951Sserge if (iop == NULL) 17*17951Sserge return (NULL); 183163Stoy 19*17951Sserge rw = (mode[1] == '+'); 203163Stoy 21*17951Sserge switch (*mode) { 22*17951Sserge case 'a': 23*17951Sserge oflags = O_CREAT | (rw ? O_RDWR : O_WRONLY); 24*17951Sserge break; 25*17951Sserge case 'r': 26*17951Sserge oflags = rw ? O_RDWR : O_RDONLY; 27*17951Sserge break; 28*17951Sserge case 'w': 29*17951Sserge oflags = O_TRUNC | O_CREAT | (rw ? O_RDWR : O_WRONLY); 30*17951Sserge break; 31*17951Sserge default: 32*17951Sserge return (NULL); 33*17951Sserge } 34*17951Sserge 35*17951Sserge f = open(file, oflags, 0666); 362004Swnj if (f < 0) 37*17951Sserge return (NULL); 38*17951Sserge 39*17951Sserge if (*mode == 'a') 40*17951Sserge lseek(f, (off_t)0, L_XTND); 41*17951Sserge 422004Swnj iop->_cnt = 0; 432004Swnj iop->_file = f; 44*17951Sserge iop->_bufsiz = 0; 453163Stoy if (rw) 46*17951Sserge iop->_flag = _IORW; 47*17951Sserge else if (*mode == 'r') 48*17951Sserge iop->_flag = _IOREAD; 492004Swnj else 50*17951Sserge iop->_flag = _IOWRT; 51*17951Sserge iop->_base = iop->_ptr = NULL; 52*17951Sserge return (iop); 532004Swnj } 54