|
|
1.1 root 1: /* @(#)fopen.c 4.2 (Berkeley) 3/9/81 */
2: #include <stdio.h>
3: #include <errno.h>
4:
5: FILE *
6: fopen(file, mode)
7: char *file;
8: register char *mode;
9: {
10: extern int errno;
11: register f, rw;
12: register FILE *iop;
13: extern FILE *_lastbuf;
14:
15: for (iop = _iob; iop->_flag&(_IOREAD|_IOWRT|_IORW); iop++)
16: if (iop >= _lastbuf)
17: return(NULL);
18:
19: rw = mode[1] == '+';
20:
21: if (*mode=='w') {
22: f = creat(file, 0666);
23: if (rw && f>=0) {
24: close(f);
25: f = open(file, 2);
26: }
27: } else if (*mode=='a') {
28: if ((f = open(file, rw? 2: 1)) < 0) {
29: if (errno == ENOENT) {
30: f = creat(file, 0666);
31: if (rw && f>=0) {
32: close(f);
33: f = open(file, 2);
34: }
35: }
36: }
37: if (f >= 0)
38: lseek(f, 0L, 2);
39: } else
40: f = open(file, rw? 2: 0);
41: if (f < 0)
42: return(NULL);
43: iop->_cnt = 0;
44: iop->_file = f;
45: if (rw)
46: iop->_flag |= _IORW;
47: else if (*mode != 'r')
48: iop->_flag |= _IOWRT;
49: else
50: iop->_flag |= _IOREAD;
51: return(iop);
52: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.