xref: /aosp_15_r20/external/musl/src/stdio/fopen.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
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