| Index: fusl/src/stdio/fopen.c
|
| diff --git a/fusl/src/stdio/fopen.c b/fusl/src/stdio/fopen.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..252f08241b3a313c057b3c6d8fc6baa1e8278c43
|
| --- /dev/null
|
| +++ b/fusl/src/stdio/fopen.c
|
| @@ -0,0 +1,33 @@
|
| +#include "stdio_impl.h"
|
| +#include <fcntl.h>
|
| +#include <string.h>
|
| +#include <errno.h>
|
| +
|
| +FILE *fopen(const char *restrict filename, const char *restrict mode)
|
| +{
|
| + FILE *f;
|
| + int fd;
|
| + int flags;
|
| +
|
| + /* Check for valid initial mode character */
|
| + if (!strchr("rwa", *mode)) {
|
| + errno = EINVAL;
|
| + return 0;
|
| + }
|
| +
|
| + /* Compute the flags to pass to open() */
|
| + flags = __fmodeflags(mode);
|
| +
|
| + fd = sys_open(filename, flags, 0666);
|
| + if (fd < 0) return 0;
|
| + if (flags & O_CLOEXEC)
|
| + __syscall(SYS_fcntl, fd, F_SETFD, FD_CLOEXEC);
|
| +
|
| + f = __fdopen(fd, mode);
|
| + if (f) return f;
|
| +
|
| + __syscall(SYS_close, fd);
|
| + return 0;
|
| +}
|
| +
|
| +LFS64(fopen);
|
|
|