summaryrefslogtreecommitdiff
path: root/src/stdio/fopen.c
diff options
context:
space:
mode:
authorVladimir Azarov <avm@intermediate-node.net>2024-10-01 15:47:05 +0200
committerVladimir Azarov <avm@intermediate-node.net>2024-10-01 15:47:05 +0200
commit4abab5ad6c8465a7528ccdd5f49367da05f78bbd (patch)
treeebf009bf1376a5a223a915bc27cbbd791a1316bc /src/stdio/fopen.c
Initial version
Diffstat (limited to 'src/stdio/fopen.c')
-rw-r--r--src/stdio/fopen.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/stdio/fopen.c b/src/stdio/fopen.c
new file mode 100644
index 0000000..80bc341
--- /dev/null
+++ b/src/stdio/fopen.c
@@ -0,0 +1,31 @@
+#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;
+}