|
|
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.