1 #include "stdio_impl.h"
2 #include <fcntl.h>
3 #include <string.h>
4 #include <errno.h>
5
fopen(const char * restrict filename,const char * restrict mode)6 FILE *fopen(const char *restrict filename, const char *restrict mode)
7 {
8 FILE *f = NULL;
9 int fd = -1;
10 int file_flags = 0;
11 int mode_flags = 0;
12
13 /* Compute the flags to pass to open() */
14 mode_flags = __fmodeflags(mode, &file_flags);
15 if (mode_flags < 0) {
16 return NULL;
17 }
18
19 fd = sys_open(filename, mode_flags, 0666);
20 if (fd < 0) return 0;
21 if (mode_flags & O_CLOEXEC)
22 __syscall(SYS_fcntl, fd, F_SETFD, FD_CLOEXEC);
23
24 f = __fdopenx(fd, file_flags);
25 if (f) {
26 return f;
27 }
28
29 __syscall(SYS_close, fd);
30 return 0;
31 }
32
33 weak_alias(fopen, fopen64);
34