|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2: #include <nstdio.h>
3:
4: struct _iobuf *fopen(file, mode)
5: register char *mode;
6: {
7: register f;
8: register struct _iobuf *iop;
9: int unixmode, a_flag, noclob;
10:
11: for (iop = _iob; iop->_flag&(_IOREAD|_IOWRT); iop++)
12: if (iop >= _iob + _NFILE)
13: return(NULL);
14: iop->_flag = 0;
15: iop->_delta = 0;
16: a_flag = 0;
17: noclob = 0;
18: for(;*mode;mode++) {
19: switch(*mode) {
20:
21: case 'w':
22: iop->_flag |= _IOWRT;
23: break;
24:
25: case 'r':
26: iop->_flag |= _IOREAD;
27: break;
28:
29: case 'a':
30: a_flag = 1;
31: noclob = 1;
32: iop->_flag |= _IOWRT ;
33: break;
34:
35: case '+':
36: if (iop->_flag & _IOREAD)
37: noclob = 1;
38: iop->_flag |= (_IOREAD | _IOWRT);
39: break;
40: }
41: }
42: if((unixmode = (iop->_flag & 3) - 1) < 0) {
43: unixmode = 0;
44: iop->_flag = 1;
45: }
46: if ((iop->_flag & _IOWRT) && noclob==0 ) {
47: f = creat(file, 0644);
48: if((iop->_flag & _IOREAD) && (f>0)) {
49: close(f);
50: f = open(file,2);
51: }
52: }
53: else
54: if ((0 >(f = open(file, unixmode))) && (noclob || !(iop->_flag&_IOREAD))) {
55: f = creat(file, 0644);
56: close(f);
57: f = open(file,unixmode);
58: }
59:
60: if (f < 0)
61: return(NULL);
62: if (a_flag)
63: lseek(f, (long) 0, 2);
64: iop->_file = f;
65: return(iop);
66: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.