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