1570af302Sopenharmony_ci#include "stdio_impl.h"
2570af302Sopenharmony_ci#include <fcntl.h>
3570af302Sopenharmony_ci#include <string.h>
4570af302Sopenharmony_ci#include <errno.h>
5570af302Sopenharmony_ci
6570af302Sopenharmony_ciFILE *fopen(const char *restrict filename, const char *restrict mode)
7570af302Sopenharmony_ci{
8570af302Sopenharmony_ci	FILE *f = NULL;
9570af302Sopenharmony_ci	int fd = -1;
10570af302Sopenharmony_ci	int file_flags = 0;
11570af302Sopenharmony_ci	int mode_flags = 0;
12570af302Sopenharmony_ci
13570af302Sopenharmony_ci	/* Compute the flags to pass to open() */
14570af302Sopenharmony_ci	mode_flags = __fmodeflags(mode, &file_flags);
15570af302Sopenharmony_ci	if (mode_flags < 0) {
16570af302Sopenharmony_ci		return NULL;
17570af302Sopenharmony_ci	}
18570af302Sopenharmony_ci
19570af302Sopenharmony_ci	fd = sys_open(filename, mode_flags, 0666);
20570af302Sopenharmony_ci	if (fd < 0) return 0;
21570af302Sopenharmony_ci	if (mode_flags & O_CLOEXEC)
22570af302Sopenharmony_ci		__syscall(SYS_fcntl, fd, F_SETFD, FD_CLOEXEC);
23570af302Sopenharmony_ci
24570af302Sopenharmony_ci	f = __fdopenx(fd, file_flags);
25570af302Sopenharmony_ci	if (f) {
26570af302Sopenharmony_ci		return f;
27570af302Sopenharmony_ci	}
28570af302Sopenharmony_ci
29570af302Sopenharmony_ci	__syscall(SYS_close, fd);
30570af302Sopenharmony_ci	return 0;
31570af302Sopenharmony_ci}
32570af302Sopenharmony_ci
33570af302Sopenharmony_ciweak_alias(fopen, fopen64);
34