|
|
1.1 ! root 1: /* ! 2: * Standard I/O Library Internals ! 3: * Open file ! 4: */ ! 5: ! 6: #include <stdio.h> ! 7: ! 8: #define CRMODE 0666 /* default access permissions on create */ ! 9: ! 10: FILE * ! 11: _fopen(name, type, fp, fd) ! 12: char *name, ! 13: *type; ! 14: register FILE *fp; ! 15: register int fd; ! 16: { ! 17: extern int _fginit(); ! 18: extern int _fpinit(); ! 19: register int mode = 1; ! 20: int truncate = 0, ! 21: append = 0; ! 22: { register char c = *type++; ! 23: char cn = 'r'; ! 24: ! 25: if (c=='r') { ! 26: mode = 0; ! 27: cn = 'w'; ! 28: } else if (c=='w') ! 29: truncate++; ! 30: else if (c=='a') ! 31: append++; ! 32: else ! 33: return (NULL); ! 34: if ((c=*type)=='\0' || c=='b') ! 35: ; ! 36: else if (c=='+' || c==cn) ! 37: mode = 2; ! 38: else ! 39: return (NULL); ! 40: } ! 41: if (fd<0 && !truncate) ! 42: fd = open(name, mode); ! 43: if (fd<0 && (truncate || append) ! 44: && (fd=creat(name, CRMODE))>=0 && mode!=1) { ! 45: close(fd); ! 46: fd = open(name, mode); ! 47: } ! 48: if (fd<0) ! 49: return (NULL); ! 50: if (append) ! 51: lseek(fd, 0L, SEEK_END); ! 52: if (fp==NULL && (fp = (FILE *) malloc(sizeof(FILE)))==NULL) { ! 53: close(fd); ! 54: return (NULL); ! 55: } ! 56: fp->_ff = _FINUSE; ! 57: fp->_bp = fp->_cp = fp->_dp = NULL; ! 58: fp->_cc = 0; ! 59: fp->_gt = &_fginit; ! 60: fp->_pt = &_fpinit; ! 61: fp->_fd = fd; ! 62: return (fp); ! 63: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.