diff --git a/include/stdio.h b/include/stdio.h index 5a5b82bc665e..f55aaf7c7274 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -144,6 +144,7 @@ struct __sFILE { int _fl_count; /* recursive lock count */ int _orientation; /* orientation for fwide() */ __mbstate_t _mbstate; /* multibyte conversion state */ + int _flags2; /* additional flags */ }; #ifndef _STDFILE_DECLARED #define _STDFILE_DECLARED @@ -176,6 +177,8 @@ __END_DECLS #define __SALC 0x4000 /* allocate string space dynamically */ #define __SIGN 0x8000 /* ignore this file in _fwalk */ +#define __S2OAP 0x0001 /* O_APPEND mode is set */ + /* * The following three definitions are for ANSI C, which took them * from System V, which brilliantly took internal interface macros and diff --git a/lib/libc/stdio/fdopen.c b/lib/libc/stdio/fdopen.c index 8bd9c2ddbe01..fbe37e881428 100644 --- a/lib/libc/stdio/fdopen.c +++ b/lib/libc/stdio/fdopen.c @@ -91,9 +91,8 @@ fdopen(int fd, const char *mode) * O_APPEND bit set, assert __SAPP so that __swrite() caller * will _sseek() to the end before write. */ - /* XXX: Reuse __SALC for O_APPEND. */ if (fdflags & O_APPEND) - fp->_flags |= __SALC; + fp->_flags2 |= __S2OAP; else if (oflags & O_APPEND) fp->_flags |= __SAPP; fp->_file = fd; diff --git a/lib/libc/stdio/findfp.c b/lib/libc/stdio/findfp.c index 0eabe82d753f..b8bb5afb551c 100644 --- a/lib/libc/stdio/findfp.c +++ b/lib/libc/stdio/findfp.c @@ -155,6 +155,7 @@ __sfp(void) /* fp->_fl_mutex = NULL; */ /* once set always set (reused) */ fp->_orientation = 0; memset(&fp->_mbstate, 0, sizeof(mbstate_t)); + fp->_flags2 = 0; return (fp); } diff --git a/lib/libc/stdio/fopen.c b/lib/libc/stdio/fopen.c index b26f63734d99..9ab61ba157a4 100644 --- a/lib/libc/stdio/fopen.c +++ b/lib/libc/stdio/fopen.c @@ -92,8 +92,7 @@ fopen(const char * __restrict file, const char * __restrict mode) * fseek and ftell.) */ if (oflags & O_APPEND) { - /* XXX: Reuse __SALC for O_APPEND. */ - fp->_flags |= __SALC; + fp->_flags2 |= __S2OAP; (void)_sseek(fp, (fpos_t)0, SEEK_END); } return (fp); diff --git a/lib/libc/stdio/freopen.c b/lib/libc/stdio/freopen.c index 8b68bacc3f6a..e0104c88eef6 100644 --- a/lib/libc/stdio/freopen.c +++ b/lib/libc/stdio/freopen.c @@ -187,6 +187,7 @@ freopen(const char * __restrict file, const char * __restrict mode, fp->_lb._size = 0; fp->_orientation = 0; memset(&fp->_mbstate, 0, sizeof(mbstate_t)); + fp->_flags2 = 0; if (f < 0) { /* did not get it after all */ if (isopen) @@ -241,8 +242,7 @@ freopen(const char * __restrict file, const char * __restrict mode, * fseek and ftell.) */ if (oflags & O_APPEND) { - /* XXX: Reuse __SALC for O_APPEND. */ - fp->_flags |= __SALC; + fp->_flags2 |= __S2OAP; (void) _sseek(fp, (fpos_t)0, SEEK_END); } FUNLOCKFILE(fp); diff --git a/lib/libc/stdio/ftell.c b/lib/libc/stdio/ftell.c index 0d2222b6958f..abb6da11966c 100644 --- a/lib/libc/stdio/ftell.c +++ b/lib/libc/stdio/ftell.c @@ -119,8 +119,7 @@ _ftello(FILE *fp, fpos_t *offset) if (HASUB(fp)) pos -= fp->_r; /* Can be negative at this point. */ } else if ((fp->_flags & __SWR) && fp->_p != NULL) { - /* XXX: Reuse __SALC for O_APPEND. */ - if (fp->_flags & (__SAPP|__SALC)) { + if ((fp->_flags & __SAPP) || (fp->_flags2 & __S2OAP)) { int serrno = errno; errno = 0; diff --git a/lib/libc/stdio/stdio.c b/lib/libc/stdio/stdio.c index fc2e74b356b9..5d6fb9ac5644 100644 --- a/lib/libc/stdio/stdio.c +++ b/lib/libc/stdio/stdio.c @@ -117,8 +117,7 @@ _swrite(FILE *fp, char const *buf, int n) ret = (*fp->_write)(fp->_cookie, buf, n); /* __SOFF removed even on success in case O_APPEND mode is set. */ if (ret >= 0) { - /* XXX: Reuse __SALC for O_APPEND. */ - if ((fp->_flags & __SOFF) && !(fp->_flags & __SALC) && + if ((fp->_flags & __SOFF) && !(fp->_flags2 & __S2OAP) && fp->_offset <= OFF_MAX - ret) fp->_offset += ret; else