1: #include <stdio.h> 2: #include <errno.h> 3: 4: FILE * 5: _endopen(file, mode, iop) 6: char *file, *mode; 7: register FILE *iop; 8: { 9: extern int errno; 10: register int rw, f; 11: 12: if (iop == NULL) 13: return(NULL); 14: 15: rw = mode[1] == '+'; 16: 17: switch (*mode) { 18: 19: case 'w': 20: f = create(file, rw); 21: break; 22: 23: case 'a': 24: if ((f = open(file, rw? 2: 1)) < 0) { 25: if (errno == ENOENT) 26: f = create(file, rw); 27: } 28: lseek(f, 0L, 2); 29: break; 30: 31: case 'r': 32: f = open(file, rw? 2: 0); 33: break; 34: 35: default: 36: return(NULL); 37: } 38: 39: if (f < 0) 40: return(NULL); 41: 42: iop->_cnt = 0; 43: iop->_file = f; 44: 45: if (rw) 46: iop->_flag |= _IORW; 47: else if(*mode == 'r') 48: iop->_flag |= _IOREAD; 49: else 50: iop->_flag |= _IOWRT; 51: 52: return(iop); 53: } 54: 55: static int 56: create(file, rw) 57: register char *file; 58: int rw; 59: { 60: register int f; 61: 62: f = creat(file, 0666); 63: if (rw && f>=0) { 64: close(f); 65: f = open(file, 2); 66: } 67: return(f); 68: }