1*c9945492SAndroid Build Coastguard Worker #include "stdio_impl.h"
2*c9945492SAndroid Build Coastguard Worker #include <fcntl.h>
3*c9945492SAndroid Build Coastguard Worker #include <string.h>
4*c9945492SAndroid Build Coastguard Worker #include <errno.h>
5*c9945492SAndroid Build Coastguard Worker
fopen(const char * restrict filename,const char * restrict mode)6*c9945492SAndroid Build Coastguard Worker FILE *fopen(const char *restrict filename, const char *restrict mode)
7*c9945492SAndroid Build Coastguard Worker {
8*c9945492SAndroid Build Coastguard Worker FILE *f;
9*c9945492SAndroid Build Coastguard Worker int fd;
10*c9945492SAndroid Build Coastguard Worker int flags;
11*c9945492SAndroid Build Coastguard Worker
12*c9945492SAndroid Build Coastguard Worker /* Check for valid initial mode character */
13*c9945492SAndroid Build Coastguard Worker if (!strchr("rwa", *mode)) {
14*c9945492SAndroid Build Coastguard Worker errno = EINVAL;
15*c9945492SAndroid Build Coastguard Worker return 0;
16*c9945492SAndroid Build Coastguard Worker }
17*c9945492SAndroid Build Coastguard Worker
18*c9945492SAndroid Build Coastguard Worker /* Compute the flags to pass to open() */
19*c9945492SAndroid Build Coastguard Worker flags = __fmodeflags(mode);
20*c9945492SAndroid Build Coastguard Worker
21*c9945492SAndroid Build Coastguard Worker fd = sys_open(filename, flags, 0666);
22*c9945492SAndroid Build Coastguard Worker if (fd < 0) return 0;
23*c9945492SAndroid Build Coastguard Worker if (flags & O_CLOEXEC)
24*c9945492SAndroid Build Coastguard Worker __syscall(SYS_fcntl, fd, F_SETFD, FD_CLOEXEC);
25*c9945492SAndroid Build Coastguard Worker
26*c9945492SAndroid Build Coastguard Worker f = __fdopen(fd, mode);
27*c9945492SAndroid Build Coastguard Worker if (f) return f;
28*c9945492SAndroid Build Coastguard Worker
29*c9945492SAndroid Build Coastguard Worker __syscall(SYS_close, fd);
30*c9945492SAndroid Build Coastguard Worker return 0;
31*c9945492SAndroid Build Coastguard Worker }
32