fix integer overflow in WIFSTOPPED macro
[musl] / src / stdio / __fdopen.c
index df6ed71..116e78e 100644 (file)
@@ -1,9 +1,15 @@
 #include "stdio_impl.h"
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include "libc.h"
 
 FILE *__fdopen(int fd, const char *mode)
 {
        FILE *f;
-       struct termios tio;
+       struct winsize wsz;
 
        /* Check for valid initial mode character */
        if (!strchr("rwa", *mode)) {
@@ -26,7 +32,9 @@ FILE *__fdopen(int fd, const char *mode)
        /* Set append mode on fd if opened for append */
        if (*mode == 'a') {
                int flags = __syscall(SYS_fcntl, fd, F_GETFL);
-               __syscall(SYS_fcntl, fd, F_SETFL, flags | O_APPEND);
+               if (!(flags & O_APPEND))
+                       __syscall(SYS_fcntl, fd, F_SETFL, flags | O_APPEND);
+               f->flags |= F_APP;
        }
 
        f->fd = fd;
@@ -35,7 +43,7 @@ FILE *__fdopen(int fd, const char *mode)
 
        /* Activate line buffered mode for terminals */
        f->lbf = EOF;
-       if (!(f->flags & F_NOWR) && !__syscall(SYS_ioctl, fd, TCGETS, &tio))
+       if (!(f->flags & F_NOWR) && !__syscall(SYS_ioctl, fd, TIOCGWINSZ, &wsz))
                f->lbf = '\n';
 
        /* Initialize op ptrs. No problem if some are unneeded. */
@@ -47,13 +55,7 @@ FILE *__fdopen(int fd, const char *mode)
        if (!libc.threaded) f->lock = -1;
 
        /* Add new FILE to open file list */
-       OFLLOCK();
-       f->next = libc.ofl_head;
-       if (libc.ofl_head) libc.ofl_head->prev = f;
-       libc.ofl_head = f;
-       OFLUNLOCK();
-
-       return f;
+       return __ofl_add(f);
 }
 
 weak_alias(__fdopen, fdopen);