1*3163Stoy /* @(#)fopen.c 4.2 (Berkeley) 03/09/81 */ 22004Swnj #include <stdio.h> 32004Swnj #include <errno.h> 42004Swnj 52004Swnj FILE * 62004Swnj fopen(file, mode) 72004Swnj char *file; 82004Swnj register char *mode; 92004Swnj { 102004Swnj extern int errno; 11*3163Stoy register f, rw; 122004Swnj register FILE *iop; 132004Swnj extern FILE *_lastbuf; 142004Swnj 15*3163Stoy for (iop = _iob; iop->_flag&(_IOREAD|_IOWRT|_IORW); iop++) 162004Swnj if (iop >= _lastbuf) 172004Swnj return(NULL); 18*3163Stoy 19*3163Stoy rw = mode[1] == '+'; 20*3163Stoy 21*3163Stoy if (*mode=='w') { 222004Swnj f = creat(file, 0666); 23*3163Stoy if (rw && f>=0) { 24*3163Stoy close(f); 25*3163Stoy f = open(file, 2); 26*3163Stoy } 27*3163Stoy } else if (*mode=='a') { 28*3163Stoy if ((f = open(file, rw? 2: 1)) < 0) { 29*3163Stoy if (errno == ENOENT) { 302004Swnj f = creat(file, 0666); 31*3163Stoy if (rw && f>=0) { 32*3163Stoy close(f); 33*3163Stoy f = open(file, 2); 34*3163Stoy } 35*3163Stoy } 362004Swnj } 372004Swnj if (f >= 0) 382004Swnj lseek(f, 0L, 2); 392004Swnj } else 40*3163Stoy f = open(file, rw? 2: 0); 412004Swnj if (f < 0) 422004Swnj return(NULL); 432004Swnj iop->_cnt = 0; 442004Swnj iop->_file = f; 45*3163Stoy if (rw) 46*3163Stoy iop->_flag |= _IORW; 47*3163Stoy else if (*mode != 'r') 482004Swnj iop->_flag |= _IOWRT; 492004Swnj else 502004Swnj iop->_flag |= _IOREAD; 512004Swnj return(iop); 522004Swnj } 53