summaryrefslogtreecommitdiff
path: root/src/stdio/fopen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/stdio/fopen.c')
-rw-r--r--src/stdio/fopen.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/stdio/fopen.c b/src/stdio/fopen.c
new file mode 100644
index 00000000..670cf5f3
--- /dev/null
+++ b/src/stdio/fopen.c
@@ -0,0 +1,34 @@
+#include "stdio_impl.h"
+
+FILE *fopen(const char *filename, const char *mode)
+{
+ FILE *f;
+ int fd;
+ int flags;
+ int plus = !!strchr(mode, '+');
+
+ /* Check for valid initial mode character */
+ if (!strchr("rwa", *mode)) {
+ errno = EINVAL;
+ return 0;
+ }
+
+ /* Compute the flags to pass to open() */
+ if (plus) flags = O_RDWR;
+ else if (*mode == 'r') flags = O_RDONLY;
+ else flags = O_WRONLY;
+ if (*mode != 'r') flags |= O_CREAT;
+ if (*mode == 'w') flags |= O_TRUNC;
+ if (*mode == 'a') flags |= O_APPEND;
+
+ fd = __syscall_open(filename, flags, 0666);
+ if (fd < 0) return 0;
+
+ f = __fdopen(fd, mode);
+ if (f) return f;
+
+ __syscall_close(fd);
+ return 0;
+}
+
+LFS64(fopen);