X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fstdio%2F__fdopen.c;h=116e78e56d2a1b3907c66a643d932b1b3a5c8545;hb=074932c84d34273821e3bfc2511e60a5ce78b8d8;hp=df6ed71d484d49b32a871338675bd0013807979b;hpb=8582a6e9f25dd7b87d72961f58008052a4cac473;p=musl diff --git a/src/stdio/__fdopen.c b/src/stdio/__fdopen.c index df6ed71d..116e78e5 100644 --- a/src/stdio/__fdopen.c +++ b/src/stdio/__fdopen.c @@ -1,9 +1,15 @@ #include "stdio_impl.h" +#include +#include +#include +#include +#include +#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);