about summary refs log tree commit diff
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);