Commit | Line | Data |
---|---|---|
41e01b3e S |
1 | /* @(#)fopen.c 4.4 (Berkeley) %G% */ |
2 | #include <sys/types.h> | |
3 | #include <sys/file.h> | |
4 | #include <stdio.h> | |
9a5d9b6d BJ |
5 | |
6 | FILE * | |
7 | fopen(file, mode) | |
41e01b3e S |
8 | char *file; |
9 | register char *mode; | |
9a5d9b6d | 10 | { |
9a5d9b6d | 11 | register FILE *iop; |
41e01b3e S |
12 | register f, rw, oflags; |
13 | extern FILE *_findiop(); | |
9a5d9b6d | 14 | |
41e01b3e S |
15 | iop = _findiop(); |
16 | if (iop == NULL) | |
17 | return (NULL); | |
d8af6b8b | 18 | |
41e01b3e | 19 | rw = (mode[1] == '+'); |
d8af6b8b | 20 | |
41e01b3e S |
21 | switch (*mode) { |
22 | case 'a': | |
23 | oflags = O_CREAT | (rw ? O_RDWR : O_WRONLY); | |
24 | break; | |
25 | case 'r': | |
26 | oflags = rw ? O_RDWR : O_RDONLY; | |
27 | break; | |
28 | case 'w': | |
29 | oflags = O_TRUNC | O_CREAT | (rw ? O_RDWR : O_WRONLY); | |
30 | break; | |
31 | default: | |
32 | return (NULL); | |
33 | } | |
34 | ||
35 | f = open(file, oflags, 0666); | |
9a5d9b6d | 36 | if (f < 0) |
41e01b3e S |
37 | return (NULL); |
38 | ||
39 | if (*mode == 'a') | |
40 | lseek(f, (off_t)0, L_XTND); | |
41 | ||
9a5d9b6d BJ |
42 | iop->_cnt = 0; |
43 | iop->_file = f; | |
41e01b3e | 44 | iop->_bufsiz = 0; |
d8af6b8b | 45 | if (rw) |
41e01b3e S |
46 | iop->_flag = _IORW; |
47 | else if (*mode == 'r') | |
48 | iop->_flag = _IOREAD; | |
9a5d9b6d | 49 | else |
41e01b3e S |
50 | iop->_flag = _IOWRT; |
51 | iop->_base = iop->_ptr = NULL; | |
52 | return (iop); | |
9a5d9b6d | 53 | } |