summaryrefslogtreecommitdiff
path: root/lib/libc/stdio/fdopen.c
diff options
context:
space:
mode:
authorKacper <kacper@mail.openlinux.dev>2025-12-07 20:10:31 +0100
committerKacper <kacper@mail.openlinux.dev>2025-12-07 20:10:31 +0100
commitfc00c656c96528112d05cf0edf8631bd5eaea446 (patch)
treea6e0e6c588191a8bd1c64afc3b7a258e3e66c236 /lib/libc/stdio/fdopen.c
Add build system scaffolding and libc headers
Diffstat (limited to 'lib/libc/stdio/fdopen.c')
-rw-r--r--lib/libc/stdio/fdopen.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/lib/libc/stdio/fdopen.c b/lib/libc/stdio/fdopen.c
new file mode 100644
index 00000000..f2ce0693
--- /dev/null
+++ b/lib/libc/stdio/fdopen.c
@@ -0,0 +1,39 @@
+#include <io.h>
+#include <libc.h>
+#include <unistd.h>
+#include <stdio.h>
+
+weak void __stdio_cleanup(void)
+{
+}
+
+FILE *fdopen(int fildes, const char *mode)
+{
+ FILE *fp;
+
+ if (mode == NULL ||
+ (mode[0] != 'r' && mode[0] != 'w' && mode[0] != 'a')) {
+ return NULL;
+ }
+
+ if ((fp = calloc(1, sizeof(FILE))) == NULL)
+ return NULL;
+
+ fp->fd = fildes;
+ atomic_flag_clear(&fp->lock);
+ if (mode[0] == 'r') {
+ fp->type = _IONBF;
+ } else if (mode[0] == 'w') {
+ fp->type = _IOLBF;
+ } else if (mode[0] == 'a') {
+ fp->type = _IONBF;
+ off_t offset = lseek(fildes, 0, SEEK_END);
+ if (offset == (off_t)-1) {
+ free(fp);
+ return NULL;
+ }
+ }
+
+ __libc_fadd(fp);
+ return fp;
+}