manual page distributed with 4.2BSD
[unix-history] / usr / src / lib / libc / stdio / fopen.c
CommitLineData
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
6FILE *
7fopen(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}