diff options
49 files changed, 289 insertions, 424 deletions
diff --git a/include/stdio.h b/include/stdio.h index abb4f383a4c..14b65aae5ce 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -1,4 +1,4 @@ -/* $OpenBSD: stdio.h,v 1.36 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: stdio.h,v 1.37 2009/10/22 01:23:16 guenther Exp $ */ /* $NetBSD: stdio.h,v 1.18 1996/04/25 18:29:21 jtc Exp $ */ /*- @@ -157,7 +157,6 @@ __END_DECLS #define __SOFF 0x1000 /* set iff _offset is in fact correct */ #define __SMOD 0x2000 /* true => fgetln modified _p text */ #define __SALC 0x4000 /* allocate string space dynamically */ -#define __SIGN 0x8000 /* ignore this file in _fwalk */ /* * The following three definitions are for ANSI C, which took them @@ -323,6 +322,12 @@ char *tempnam(const char *, const char *); #endif __END_DECLS +#ifndef _POSIX_THREADS +# define flockfile(fp) /* nothing */ +# define ftrylockfile(fp) (0) +# define funlockfile(fp) /* nothing */ +#endif + #endif /* __BSD_VISIBLE || __POSIX_VISIBLE || __XPG_VISIBLE */ /* @@ -397,37 +402,32 @@ static __inline int __sputc(int _c, FILE *_p) { #define __sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF))) #define __sfileno(p) ((p)->_file) -extern int __isthreaded; +#define feof(p) __sfeof(p) +#define ferror(p) __sferror(p) -#define feof(p) (!__isthreaded ? __sfeof(p) : (feof)(p)) -#define ferror(p) (!__isthreaded ? __sferror(p) : (ferror)(p)) -#define clearerr(p) (!__isthreaded ? __sclearerr(p) : (clearerr)(p)) +#ifndef _POSIX_THREADS +#define clearerr(p) __sclearerr(p) +#endif #if __POSIX_VISIBLE -#define fileno(p) (!__isthreaded ? __sfileno(p) : (fileno)(p)) +#define fileno(p) __sfileno(p) #endif -#define getc(fp) (!__isthreaded ? __sgetc(fp) : (getc)(fp)) - -#if __BSD_VISIBLE -/* - * The macro implementations of putc and putc_unlocked are not - * fully POSIX compliant; they do not set errno on failure - */ -#define putc(x, fp) (!__isthreaded ? __sputc(x, fp) : (putc)(x, fp)) -#endif /* __BSD_VISIBLE */ - #ifndef lint -#if __POSIX_VISIBLE >= 199506 +#ifndef _POSIX_THREADS +#define getc(fp) __sgetc(fp) +#endif /* _POSIX_THREADS */ #define getc_unlocked(fp) __sgetc(fp) /* * The macro implementations of putc and putc_unlocked are not * fully POSIX compliant; they do not set errno on failure */ #if __BSD_VISIBLE +#ifndef _POSIX_THREADS +#define putc(x, fp) __sputc(x, fp) +#endif /* _POSIX_THREADS */ #define putc_unlocked(x, fp) __sputc(x, fp) #endif /* __BSD_VISIBLE */ -#endif /* __POSIX_VISIBLE >= 199506 */ #endif /* lint */ #define getchar() getc(stdin) diff --git a/lib/libc/gen/getgrent.c b/lib/libc/gen/getgrent.c index 13ca99b8fc4..341f5158901 100644 --- a/lib/libc/gen/getgrent.c +++ b/lib/libc/gen/getgrent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: getgrent.c,v 1.33 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: getgrent.c,v 1.34 2009/10/22 01:23:16 guenther Exp $ */ /* * Copyright (c) 1989, 1993 * The Regents of the University of California. All rights reserved. @@ -319,8 +319,7 @@ grscan(int search, gid_t gid, const char *name, struct group *p_gr, if (!strchr(line, '\n')) { int ch; - while ((ch = getc_unlocked(_gr_fp)) != '\n' && - ch != EOF) + while ((ch = getc(_gr_fp)) != '\n' && ch != EOF) ; continue; } diff --git a/lib/libc/gen/getgrouplist.c b/lib/libc/gen/getgrouplist.c index 564ca8fb3c1..3f8dda203b4 100644 --- a/lib/libc/gen/getgrouplist.c +++ b/lib/libc/gen/getgrouplist.c @@ -1,4 +1,4 @@ -/* $OpenBSD: getgrouplist.c,v 1.19 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: getgrouplist.c,v 1.20 2009/10/22 01:23:16 guenther Exp $ */ /* * Copyright (c) 2008 Ingo Schwarze <schwarze@usta.de> * Copyright (c) 1991, 1993 @@ -123,7 +123,7 @@ _read_netid(const char *key, uid_t uid, gid_t *groups, int *ngroups, *p = '\0'; else { /* Skip lines that are too long. */ int ch; - while ((ch = getc_unlocked(fp)) != '\n' && ch != EOF) + while ((ch = getc(fp)) != '\n' && ch != EOF) ; continue; } diff --git a/lib/libc/gen/getttyent.c b/lib/libc/gen/getttyent.c index 081b56f6665..f92887da485 100644 --- a/lib/libc/gen/getttyent.c +++ b/lib/libc/gen/getttyent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: getttyent.c,v 1.10 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: getttyent.c,v 1.11 2009/10/22 01:23:16 guenther Exp $ */ /* * Copyright (c) 1989, 1993 * The Regents of the University of California. All rights reserved. @@ -68,7 +68,7 @@ getttyent(void) return (NULL); /* skip lines that are too big */ if (!strchr(p, '\n')) { - while ((c = getc_unlocked(tf)) != '\n' && c != EOF) + while ((c = getc(tf)) != '\n' && c != EOF) ; continue; } diff --git a/lib/libc/stdio/asprintf.c b/lib/libc/stdio/asprintf.c index b3b037a1fb2..f58cc0041d3 100644 --- a/lib/libc/stdio/asprintf.c +++ b/lib/libc/stdio/asprintf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: asprintf.c,v 1.16 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: asprintf.c,v 1.17 2009/10/22 01:23:16 guenther Exp $ */ /* * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com> @@ -40,7 +40,7 @@ asprintf(char **str, const char *fmt, ...) goto err; f._bf._size = f._w = 127; /* Leave room for the NUL */ va_start(ap, fmt); - ret = __vfprintf(&f, fmt, ap); + ret = vfprintf(&f, fmt, ap); va_end(ap); if (ret == -1) goto err; diff --git a/lib/libc/stdio/clrerr.c b/lib/libc/stdio/clrerr.c index 8286305c5be..be993640d4f 100644 --- a/lib/libc/stdio/clrerr.c +++ b/lib/libc/stdio/clrerr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: clrerr.c,v 1.7 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: clrerr.c,v 1.8 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -32,13 +32,12 @@ */ #include <stdio.h> -#include "local.h" #undef clearerr void clearerr(FILE *fp) { - FLOCKFILE(fp); + flockfile(fp); __sclearerr(fp); - FUNLOCKFILE(fp); + funlockfile(fp); } diff --git a/lib/libc/stdio/fclose.c b/lib/libc/stdio/fclose.c index 3d0c7b97dd8..98e9826b82c 100644 --- a/lib/libc/stdio/fclose.c +++ b/lib/libc/stdio/fclose.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fclose.c,v 1.7 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fclose.c,v 1.8 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -45,7 +45,6 @@ fclose(FILE *fp) errno = EBADF; return (EOF); } - FLOCKFILE(fp); WCIO_FREE(fp); r = fp->_flags & __SWR ? __sflush(fp) : 0; if (fp->_close != NULL && (*fp->_close)(fp->_cookie) < 0) @@ -56,8 +55,7 @@ fclose(FILE *fp) FREEUB(fp); if (HASLB(fp)) FREELB(fp); - fp->_r = fp->_w = 0; /* Mess up if reaccessed. */ fp->_flags = 0; /* Release this FILE for reuse. */ - FUNLOCKFILE(fp); + fp->_r = fp->_w = 0; /* Mess up if reaccessed. */ return (r); } diff --git a/lib/libc/stdio/feof.c b/lib/libc/stdio/feof.c index d381a29c4f7..67da8536df3 100644 --- a/lib/libc/stdio/feof.c +++ b/lib/libc/stdio/feof.c @@ -1,4 +1,4 @@ -/* $OpenBSD: feof.c,v 1.6 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: feof.c,v 1.7 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -32,7 +32,6 @@ */ #include <stdio.h> -#include "local.h" /* * A subroutine version of the macro feof. @@ -42,10 +41,5 @@ int feof(FILE *fp) { - int ret; - - FLOCKFILE(fp); - ret = __sfeof(fp); - FUNLOCKFILE(fp); - return (ret); + return (__sfeof(fp)); } diff --git a/lib/libc/stdio/ferror.c b/lib/libc/stdio/ferror.c index 29b08d3642a..0e093410b5c 100644 --- a/lib/libc/stdio/ferror.c +++ b/lib/libc/stdio/ferror.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ferror.c,v 1.6 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: ferror.c,v 1.7 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -32,7 +32,6 @@ */ #include <stdio.h> -#include "local.h" /* * A subroutine version of the macro ferror. @@ -42,10 +41,5 @@ int ferror(FILE *fp) { - int ret; - - FLOCKFILE(fp); - ret = __sferror(fp); - FUNLOCKFILE(fp); - return (ret); + return (__sferror(fp)); } diff --git a/lib/libc/stdio/fflush.c b/lib/libc/stdio/fflush.c index 554f531e7e0..2fe62a16834 100644 --- a/lib/libc/stdio/fflush.c +++ b/lib/libc/stdio/fflush.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fflush.c,v 1.6 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fflush.c,v 1.7 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -39,18 +39,14 @@ int fflush(FILE *fp) { - int r; if (fp == NULL) - return (_fwalk(__sflush_locked)); - FLOCKFILE(fp); + return (_fwalk(__sflush)); if ((fp->_flags & (__SWR | __SRW)) == 0) { errno = EBADF; - r = EOF; - } else - r = __sflush(fp); - FUNLOCKFILE(fp); - return (r); + return (EOF); + } + return (__sflush(fp)); } int @@ -84,14 +80,3 @@ __sflush(FILE *fp) } return (0); } - -int -__sflush_locked(FILE *fp) -{ - int r; - - FLOCKFILE(fp); - r = __sflush(fp); - FUNLOCKFILE(fp); - return (r); -} diff --git a/lib/libc/stdio/fgetc.c b/lib/libc/stdio/fgetc.c index d5a08a9abf3..200ed439c2c 100644 --- a/lib/libc/stdio/fgetc.c +++ b/lib/libc/stdio/fgetc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fgetc.c,v 1.6 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fgetc.c,v 1.7 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -36,5 +36,5 @@ int fgetc(FILE *fp) { - return (getc(fp)); + return (__sgetc(fp)); } diff --git a/lib/libc/stdio/fgetln.c b/lib/libc/stdio/fgetln.c index 8723f7982ac..061e5cb4c91 100644 --- a/lib/libc/stdio/fgetln.c +++ b/lib/libc/stdio/fgetln.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fgetln.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fgetln.c,v 1.9 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -71,18 +71,19 @@ char * fgetln(FILE *fp, size_t *lenp) { unsigned char *p; - char *ret; size_t len; size_t off; - FLOCKFILE(fp); - /* make sure there is input */ - if (fp->_r <= 0 && __srefill(fp)) - goto error; + if (fp->_r <= 0 && __srefill(fp)) { + *lenp = 0; + return (NULL); + } /* look for a newline in the input */ if ((p = memchr((void *)fp->_p, '\n', fp->_r)) != NULL) { + char *ret; + /* * Found one. Flag buffer as modified to keep fseek from * `optimising' a backward seek, in case the user stomps on @@ -94,7 +95,6 @@ fgetln(FILE *fp, size_t *lenp) fp->_flags |= __SMOD; fp->_r -= len; fp->_p = p; - FUNLOCKFILE(fp); return (ret); } @@ -139,15 +139,12 @@ fgetln(FILE *fp, size_t *lenp) break; } *lenp = len; - ret = (char *)fp->_lb._base; #ifdef notdef - ret[len] = '\0'; + fp->_lb._base[len] = '\0'; #endif - FUNLOCKFILE(fp); - return (ret); + return ((char *)fp->_lb._base); error: *lenp = 0; /* ??? */ - FUNLOCKFILE(fp); return (NULL); /* ??? */ } diff --git a/lib/libc/stdio/fgets.c b/lib/libc/stdio/fgets.c index 66ba159509c..661ec0d3861 100644 --- a/lib/libc/stdio/fgets.c +++ b/lib/libc/stdio/fgets.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fgets.c,v 1.12 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fgets.c,v 1.13 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -54,7 +54,6 @@ fgets(char *buf, int n, FILE *fp) return (NULL); } - FLOCKFILE(fp); _SET_ORIENTATION(fp, -1); s = buf; n--; /* leave space for NUL */ @@ -65,10 +64,8 @@ fgets(char *buf, int n, FILE *fp) if (fp->_r <= 0) { if (__srefill(fp)) { /* EOF/error: stop with partial or no line */ - if (s == buf) { - FUNLOCKFILE(fp); + if (s == buf) return (NULL); - } break; } } @@ -90,7 +87,6 @@ fgets(char *buf, int n, FILE *fp) fp->_p = t; (void)memcpy((void *)s, (void *)p, len); s[len] = '\0'; - FUNLOCKFILE(fp); return (buf); } fp->_r -= len; @@ -100,6 +96,5 @@ fgets(char *buf, int n, FILE *fp) n -= len; } *s = '\0'; - FUNLOCKFILE(fp); return (buf); } diff --git a/lib/libc/stdio/fgetwc.c b/lib/libc/stdio/fgetwc.c index 0ab5cb78200..d42e02b44ba 100644 --- a/lib/libc/stdio/fgetwc.c +++ b/lib/libc/stdio/fgetwc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fgetwc.c,v 1.2 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fgetwc.c,v 1.3 2009/10/22 01:23:16 guenther Exp $ */ /* $NetBSD: fgetwc.c,v 1.3 2003/03/07 07:11:36 tshiozak Exp $ */ /*- @@ -82,9 +82,9 @@ fgetwc(FILE *fp) { wint_t r; - FLOCKFILE(fp); + flockfile(fp); r = __fgetwc_unlock(fp); - FUNLOCKFILE(fp); + funlockfile(fp); return (r); } diff --git a/lib/libc/stdio/fgetws.c b/lib/libc/stdio/fgetws.c index 5716021f430..e58ad07797b 100644 --- a/lib/libc/stdio/fgetws.c +++ b/lib/libc/stdio/fgetws.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fgetws.c,v 1.3 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fgetws.c,v 1.4 2009/10/22 01:23:16 guenther Exp $ */ /* $NetBSD: fgetws.c,v 1.1 2003/03/07 07:11:37 tshiozak Exp $ */ /*- @@ -45,7 +45,7 @@ fgetws(ws, n, fp) wchar_t *wsp; wint_t wc; - FLOCKFILE(fp); + flockfile(fp); _SET_ORIENTATION(fp, 1); if (n <= 0) { @@ -72,11 +72,11 @@ fgetws(ws, n, fp) } *wsp++ = L'\0'; - FUNLOCKFILE(fp); + funlockfile(fp); return (ws); error: - FUNLOCKFILE(fp); + funlockfile(fp); return (NULL); } diff --git a/lib/libc/stdio/fileno.c b/lib/libc/stdio/fileno.c index 7237beb84dc..ea5d5dd213f 100644 --- a/lib/libc/stdio/fileno.c +++ b/lib/libc/stdio/fileno.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fileno.c,v 1.6 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fileno.c,v 1.7 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -32,7 +32,6 @@ */ #include <stdio.h> -#include "local.h" /* * A subroutine version of the macro fileno. @@ -42,10 +41,5 @@ int fileno(FILE *fp) { - int ret; - - FLOCKFILE(fp); - ret = __sfileno(fp); - FUNLOCKFILE(fp); - return (ret); + return (__sfileno(fp)); } diff --git a/lib/libc/stdio/findfp.c b/lib/libc/stdio/findfp.c index f3e000c3591..2be93a56c74 100644 --- a/lib/libc/stdio/findfp.c +++ b/lib/libc/stdio/findfp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: findfp.c,v 1.10 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: findfp.c,v 1.11 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -39,7 +39,6 @@ #include <string.h> #include "local.h" #include "glue.h" -#include "thread_private.h" int __sdidinit; @@ -55,8 +54,6 @@ int __sdidinit; static FILE usual[FOPEN_MAX - 3]; static struct __sfileext usualext[FOPEN_MAX - 3]; static struct glue uglue = { 0, FOPEN_MAX - 3, usual }; -static struct glue *lastglue = &uglue; -_THREAD_PRIVATE_MUTEX(__sfp_mutex); struct __sfileext __sFext[3]; FILE __sF[3] = { @@ -107,25 +104,16 @@ __sfp(void) if (!__sdidinit) __sinit(); - - _THREAD_PRIVATE_MUTEX_LOCK(__sfp_mutex); - for (g = &__sglue; g != NULL; g = g->next) { + for (g = &__sglue;; g = g->next) { for (fp = g->iobs, n = g->niobs; --n >= 0; fp++) if (fp->_flags == 0) goto found; + if (g->next == NULL && (g->next = moreglue(NDYNAMIC)) == NULL) + break; } - - /* release lock while mallocing */ - _THREAD_PRIVATE_MUTEX_UNLOCK(__sfp_mutex); - if ((g = moreglue(NDYNAMIC)) == NULL) - return (NULL); - _THREAD_PRIVATE_MUTEX_LOCK(__sfp_mutex); - lastglue->next = g; - lastglue = g; - fp = g->iobs; + return (NULL); found: fp->_flags = 1; /* reserve this slot; caller sets real flags */ - _THREAD_PRIVATE_MUTEX_UNLOCK(__sfp_mutex); fp->_p = NULL; /* no current pointer */ fp->_w = 0; /* nothing to read or write */ fp->_r = 0; @@ -155,12 +143,8 @@ f_prealloc(void) n = getdtablesize() - FOPEN_MAX + 20; /* 20 for slop. */ for (g = &__sglue; (n -= g->niobs) > 0 && g->next; g = g->next) /* void */; - if (n > 0 && ((g = moreglue(n)) != NULL)) { - _THREAD_PRIVATE_MUTEX_LOCK(__sfp_mutex); - lastglue->next = g; - lastglue = g; - _THREAD_PRIVATE_MUTEX_UNLOCK(__sfp_mutex); - } + if (n > 0) + g->next = moreglue(n); } /* @@ -184,18 +168,12 @@ _cleanup(void) void __sinit(void) { - _THREAD_PRIVATE_MUTEX(__sinit_mutex); int i; - _THREAD_PRIVATE_MUTEX_LOCK(__sinit_mutex); - if (__sdidinit) - goto out; /* bail out if caller lost the race */ for (i = 0; i < FOPEN_MAX - 3; i++) { _FILEEXT_SETUP(usual+i, usualext+i); } /* make sure we clean up on exit */ __atexit_register_cleanup(_cleanup); /* conservative */ __sdidinit = 1; -out: - _THREAD_PRIVATE_MUTEX_UNLOCK(__sinit_mutex); } diff --git a/lib/libc/stdio/fpurge.c b/lib/libc/stdio/fpurge.c index 4a0988e8479..8fa541dd1c7 100644 --- a/lib/libc/stdio/fpurge.c +++ b/lib/libc/stdio/fpurge.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fpurge.c,v 1.7 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fpurge.c,v 1.8 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -43,9 +43,7 @@ int fpurge(FILE *fp) { - FLOCKFILE(fp); if (!fp->_flags) { - FUNLOCKFILE(fp); errno = EBADF; return(EOF); } @@ -56,6 +54,5 @@ fpurge(FILE *fp) fp->_p = fp->_bf._base; fp->_r = 0; fp->_w = fp->_flags & (__SLBF|__SNBF) ? 0 : fp->_bf._size; - FUNLOCKFILE(fp); return (0); } diff --git a/lib/libc/stdio/fputc.c b/lib/libc/stdio/fputc.c index 275e0398411..0c95ed9a14f 100644 --- a/lib/libc/stdio/fputc.c +++ b/lib/libc/stdio/fputc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fputc.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fputc.c,v 1.9 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -33,9 +33,14 @@ #include <stdio.h> #include <errno.h> +#include "local.h" int fputc(int c, FILE *fp) { + if (cantwrite(fp)) { + errno = EBADF; + return (EOF); + } return (putc(c, fp)); } diff --git a/lib/libc/stdio/fputs.c b/lib/libc/stdio/fputs.c index 4a861fa66b9..1ec32d85b41 100644 --- a/lib/libc/stdio/fputs.c +++ b/lib/libc/stdio/fputs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fputs.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fputs.c,v 1.9 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -44,15 +44,11 @@ fputs(const char *s, FILE *fp) { struct __suio uio; struct __siov iov; - int ret; iov.iov_base = (void *)s; iov.iov_len = uio.uio_resid = strlen(s); uio.uio_iov = &iov; uio.uio_iovcnt = 1; - FLOCKFILE(fp); _SET_ORIENTATION(fp, -1); - ret = __sfvwrite(fp, &uio); - FUNLOCKFILE(fp); - return (ret); + return (__sfvwrite(fp, &uio)); } diff --git a/lib/libc/stdio/fputwc.c b/lib/libc/stdio/fputwc.c index 4d399730440..d3871241660 100644 --- a/lib/libc/stdio/fputwc.c +++ b/lib/libc/stdio/fputwc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fputwc.c,v 1.2 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fputwc.c,v 1.3 2009/10/22 01:23:16 guenther Exp $ */ /* $NetBSD: fputwc.c,v 1.3 2003/03/07 07:11:37 tshiozak Exp $ */ /*- @@ -80,9 +80,9 @@ fputwc(wchar_t wc, FILE *fp) { wint_t r; - FLOCKFILE(fp); + flockfile(fp); r = __fputwc_unlock(wc, fp); - FUNLOCKFILE(fp); + funlockfile(fp); return (r); } diff --git a/lib/libc/stdio/fputws.c b/lib/libc/stdio/fputws.c index d2163affc36..b1ab6dcd60a 100644 --- a/lib/libc/stdio/fputws.c +++ b/lib/libc/stdio/fputws.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fputws.c,v 1.3 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fputws.c,v 1.4 2009/10/22 01:23:16 guenther Exp $ */ /* $NetBSD: fputws.c,v 1.1 2003/03/07 07:11:37 tshiozak Exp $ */ /*- @@ -40,17 +40,17 @@ fputws(ws, fp) const wchar_t * __restrict ws; FILE * __restrict fp; { - FLOCKFILE(fp); + flockfile(fp); _SET_ORIENTATION(fp, 1); while (*ws != '\0') { if (__fputwc_unlock(*ws++, fp) == WEOF) { - FUNLOCKFILE(fp); + funlockfile(fp); return (-1); } } - FUNLOCKFILE(fp); + funlockfile(fp); return (0); } diff --git a/lib/libc/stdio/fread.c b/lib/libc/stdio/fread.c index 572be07160f..99185385b0d 100644 --- a/lib/libc/stdio/fread.c +++ b/lib/libc/stdio/fread.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fread.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fread.c,v 1.9 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -48,7 +48,6 @@ fread(void *buf, size_t size, size_t count, FILE *fp) */ if ((resid = count * size) == 0) return (0); - FLOCKFILE(fp); if (fp->_r < 0) fp->_r = 0; total = resid; @@ -61,13 +60,11 @@ fread(void *buf, size_t size, size_t count, FILE *fp) resid -= r; if (__srefill(fp)) { /* no more input: return partial result */ - FUNLOCKFILE(fp); return ((total - resid) / size); } } (void)memcpy((void *)p, (void *)fp->_p, resid); fp->_r -= resid; fp->_p += resid; - FUNLOCKFILE(fp); return (count); } diff --git a/lib/libc/stdio/freopen.c b/lib/libc/stdio/freopen.c index b5dbc3096d4..7b4b480619d 100644 --- a/lib/libc/stdio/freopen.c +++ b/lib/libc/stdio/freopen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: freopen.c,v 1.11 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: freopen.c,v 1.12 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -60,8 +60,6 @@ freopen(const char *file, const char *mode, FILE *fp) if (!__sdidinit) __sinit(); - FLOCKFILE(fp); - /* * There are actually programs that depend on being able to "freopen" * descriptors that weren't originally open. Keep this from breaking. @@ -123,7 +121,6 @@ freopen(const char *file, const char *mode, FILE *fp) if (f < 0) { /* did not get it after all */ fp->_flags = 0; /* set it free */ - FUNLOCKFILE(fp); errno = sverrno; /* restore in case _close clobbered */ return (NULL); } @@ -143,7 +140,6 @@ freopen(const char *file, const char *mode, FILE *fp) /* _file is only a short */ if (f > SHRT_MAX) { fp->_flags = 0; /* set it free */ - FUNLOCKFILE(fp); errno = EMFILE; return (NULL); } @@ -166,6 +162,5 @@ freopen(const char *file, const char *mode, FILE *fp) */ if (oflags & O_APPEND) (void) __sseek((void *)fp, (fpos_t)0, SEEK_END); - FUNLOCKFILE(fp); return (fp); } diff --git a/lib/libc/stdio/fseek.c b/lib/libc/stdio/fseek.c index 525c095f895..98e95750879 100644 --- a/lib/libc/stdio/fseek.c +++ b/lib/libc/stdio/fseek.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fseek.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fseek.c,v 1.9 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -70,7 +70,6 @@ fseeko(FILE *fp, off_t offset, int whence) * Change any SEEK_CUR to SEEK_SET, and check `whence' argument. * After this, whence is either SEEK_SET or SEEK_END. */ - FLOCKFILE(fp); switch (whence) { case SEEK_CUR: @@ -84,10 +83,8 @@ fseeko(FILE *fp, off_t offset, int whence) curoff = fp->_offset; else { curoff = (*seekfn)(fp->_cookie, (fpos_t)0, SEEK_CUR); - if (curoff == (fpos_t)-1) { - FUNLOCKFILE(fp); + if (curoff == (fpos_t)-1) return (EOF); - } } if (fp->_flags & __SRD) { curoff -= fp->_r; @@ -108,7 +105,6 @@ fseeko(FILE *fp, off_t offset, int whence) break; default: - FUNLOCKFILE(fp); errno = EINVAL; return (EOF); } @@ -193,7 +189,6 @@ fseeko(FILE *fp, off_t offset, int whence) if (HASUB(fp)) FREEUB(fp); fp->_flags &= ~__SEOF; - FUNLOCKFILE(fp); return (0); } @@ -220,7 +215,6 @@ fseeko(FILE *fp, off_t offset, int whence) fp->_p += n; fp->_r -= n; } - FUNLOCKFILE(fp); return (0); /* @@ -230,7 +224,6 @@ fseeko(FILE *fp, off_t offset, int whence) dumb: if (__sflush(fp) || (*seekfn)(fp->_cookie, (fpos_t)offset, whence) == POS_ERR) { - FUNLOCKFILE(fp); return (EOF); } /* success: clear EOF indicator and discard ungetc() data */ @@ -240,7 +233,6 @@ dumb: fp->_r = 0; /* fp->_w = 0; */ /* unnecessary (I think...) */ fp->_flags &= ~__SEOF; - FUNLOCKFILE(fp); return (0); } diff --git a/lib/libc/stdio/ftell.c b/lib/libc/stdio/ftell.c index 9d4d54628ac..3def3bfb6bc 100644 --- a/lib/libc/stdio/ftell.c +++ b/lib/libc/stdio/ftell.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ftell.c,v 1.7 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: ftell.c,v 1.8 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -45,22 +45,20 @@ ftello(FILE *fp) if (fp->_seek == NULL) { errno = ESPIPE; /* historic practice */ - pos = -1; - goto out; + return ((off_t)-1); } /* * Find offset of underlying I/O object, then * adjust for buffered bytes. */ - FLOCKFILE(fp); __sflush(fp); /* may adjust seek offset on append stream */ if (fp->_flags & __SOFF) pos = fp->_offset; else { pos = (*fp->_seek)(fp->_cookie, (fpos_t)0, SEEK_CUR); - if (pos == -1) - goto out; + if (pos == -1L) + return (pos); } if (fp->_flags & __SRD) { /* @@ -79,7 +77,6 @@ ftello(FILE *fp) */ pos += fp->_p - fp->_bf._base; } -out: FUNLOCKFILE(fp); return (pos); } diff --git a/lib/libc/stdio/fvwrite.c b/lib/libc/stdio/fvwrite.c index d16db977329..9e916afddf5 100644 --- a/lib/libc/stdio/fvwrite.c +++ b/lib/libc/stdio/fvwrite.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fvwrite.c,v 1.15 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fvwrite.c,v 1.16 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -134,7 +134,7 @@ __sfvwrite(FILE *fp, struct __suio *uio) COPY(w); /* fp->_w -= w; */ /* unneeded */ fp->_p += w; - if (__sflush(fp)) + if (fflush(fp)) goto err; } else if (len >= (w = fp->_bf._size)) { /* write directly */ @@ -174,7 +174,7 @@ __sfvwrite(FILE *fp, struct __suio *uio) COPY(w); /* fp->_w -= w; */ fp->_p += w; - if (__sflush(fp)) + if (fflush(fp)) goto err; } else if (s >= (w = fp->_bf._size)) { w = (*fp->_write)(fp->_cookie, p, w); @@ -188,7 +188,7 @@ __sfvwrite(FILE *fp, struct __suio *uio) } if ((nldist -= w) == 0) { /* copied the newline: flush and forget */ - if (__sflush(fp)) + if (fflush(fp)) goto err; nlknown = 0; } diff --git a/lib/libc/stdio/fwalk.c b/lib/libc/stdio/fwalk.c index 0f1c1b6e32f..9c6ec873282 100644 --- a/lib/libc/stdio/fwalk.c +++ b/lib/libc/stdio/fwalk.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fwalk.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fwalk.c,v 1.9 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -45,9 +45,8 @@ _fwalk(int (*function)(FILE *)) ret = 0; for (g = &__sglue; g != NULL; g = g->next) - for (fp = g->iobs, n = g->niobs; --n >= 0; fp++) { - if ((fp->_flags != 0) && ((fp->_flags & __SIGN) == 0)) + for (fp = g->iobs, n = g->niobs; --n >= 0; fp++) + if (fp->_flags != 0) ret |= (*function)(fp); - } return (ret); } diff --git a/lib/libc/stdio/fwide.c b/lib/libc/stdio/fwide.c index b15a14f2375..974374254b8 100644 --- a/lib/libc/stdio/fwide.c +++ b/lib/libc/stdio/fwide.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fwide.c,v 1.2 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fwide.c,v 1.3 2009/10/22 01:23:16 guenther Exp $ */ /* $NetBSD: fwide.c,v 1.2 2003/01/18 11:29:54 thorpej Exp $ */ /*- @@ -49,7 +49,7 @@ fwide(FILE *fp, int mode) else if (mode < 0) mode = -1; - FLOCKFILE(fp); + flockfile(fp); wcio = WCIO_GET(fp); if (!wcio) return 0; /* XXX */ @@ -58,7 +58,7 @@ fwide(FILE *fp, int mode) wcio->wcio_mode = mode; else mode = wcio->wcio_mode; - FUNLOCKFILE(fp); + funlockfile(fp); return mode; } diff --git a/lib/libc/stdio/fwrite.c b/lib/libc/stdio/fwrite.c index 8e7ae01e096..9308e4d66a7 100644 --- a/lib/libc/stdio/fwrite.c +++ b/lib/libc/stdio/fwrite.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fwrite.c,v 1.7 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: fwrite.c,v 1.8 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -45,7 +45,6 @@ fwrite(const void *buf, size_t size, size_t count, FILE *fp) size_t n; struct __suio uio; struct __siov iov; - int ret; /* * ANSI and SUSv2 require a return value of 0 if size or count are 0. @@ -63,10 +62,7 @@ fwrite(const void *buf, size_t size, size_t count, FILE *fp) * skip the divide if this happens, since divides are * generally slow and since this occurs whenever size==0. */ - FLOCKFILE(fp); - ret = __sfvwrite(fp, &uio); - FUNLOCKFILE(fp); - if (ret == 0) + if (__sfvwrite(fp, &uio) == 0) return (count); return ((n - uio.uio_resid) / size); } diff --git a/lib/libc/stdio/getc.c b/lib/libc/stdio/getc.c index 8a1f8c9e510..b77696c3d87 100644 --- a/lib/libc/stdio/getc.c +++ b/lib/libc/stdio/getc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: getc.c,v 1.7 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: getc.c,v 1.8 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -32,7 +32,6 @@ */ #include <stdio.h> -#include "local.h" /* * A subroutine version of the macro getc_unlocked. @@ -55,8 +54,8 @@ getc(FILE *fp) { int c; - FLOCKFILE(fp); + flockfile(fp); c = __sgetc(fp); - FUNLOCKFILE(fp); + funlockfile(fp); return (c); } diff --git a/lib/libc/stdio/gets.c b/lib/libc/stdio/gets.c index 30cd712e035..c3666d88492 100644 --- a/lib/libc/stdio/gets.c +++ b/lib/libc/stdio/gets.c @@ -1,4 +1,4 @@ -/* $OpenBSD: gets.c,v 1.10 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: gets.c,v 1.11 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -32,7 +32,6 @@ */ #include <stdio.h> -#include "local.h" __warn_references(gets, "warning: gets() is very unsafe; consider using fgets()"); @@ -43,17 +42,14 @@ gets(char *buf) int c; char *s; - FLOCKFILE(stdin); - for (s = buf; (c = getchar_unlocked()) != '\n';) + for (s = buf; (c = getchar()) != '\n';) if (c == EOF) - if (s == buf) { - FUNLOCKFILE(stdin); + if (s == buf) return (NULL); - } else + else break; else *s++ = c; *s = '\0'; - FUNLOCKFILE(stdin); return (buf); } diff --git a/lib/libc/stdio/local.h b/lib/libc/stdio/local.h index 5c5e878841f..68babbd4f0c 100644 --- a/lib/libc/stdio/local.h +++ b/lib/libc/stdio/local.h @@ -1,4 +1,4 @@ -/* $OpenBSD: local.h,v 1.13 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: local.h,v 1.14 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 @@ -42,7 +42,6 @@ #include "fileext.h" int __sflush(FILE *); -int __sflush_locked(FILE *); FILE *__sfp(void); int __srefill(FILE *); int __sread(void *, char *, int); @@ -57,7 +56,6 @@ int _fwalk(int (*)(FILE *)); int __swsetup(FILE *); int __sflags(const char *, int *); wint_t __fgetwc_unlock(FILE *); -int __vfprintf(FILE *, const char *, __va_list); extern void __atexit_register_cleanup(void (*)(void)); extern int __sdidinit; @@ -88,6 +86,3 @@ extern int __sdidinit; free((char *)(fp)->_lb._base); \ (fp)->_lb._base = NULL; \ } - -#define FLOCKFILE(fp) do { if (__isthreaded) flockfile(fp); } while (0) -#define FUNLOCKFILE(fp) do { if (__isthreaded) funlockfile(fp); } while (0) diff --git a/lib/libc/stdio/putc.c b/lib/libc/stdio/putc.c index 571c7a70538..9426916024e 100644 --- a/lib/libc/stdio/putc.c +++ b/lib/libc/stdio/putc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: putc.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: putc.c,v 1.9 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -60,8 +60,8 @@ putc(int c, FILE *fp) { int ret; - FLOCKFILE(fp); + flockfile(fp); ret = putc_unlocked(c, fp); - FUNLOCKFILE(fp); + funlockfile(fp); return (ret); } diff --git a/lib/libc/stdio/puts.c b/lib/libc/stdio/puts.c index a3957b3b234..c932a83ce1b 100644 --- a/lib/libc/stdio/puts.c +++ b/lib/libc/stdio/puts.c @@ -1,4 +1,4 @@ -/* $OpenBSD: puts.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: puts.c,v 1.9 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -33,7 +33,6 @@ #include <stdio.h> #include <string.h> -#include "local.h" #include "fvwrite.h" /* @@ -45,7 +44,6 @@ puts(const char *s) size_t c = strlen(s); struct __suio uio; struct __siov iov[2]; - int ret; iov[0].iov_base = (void *)s; iov[0].iov_len = c; @@ -54,8 +52,5 @@ puts(const char *s) uio.uio_resid = c + 1; uio.uio_iov = &iov[0]; uio.uio_iovcnt = 2; - FLOCKFILE(stdout); - ret = __sfvwrite(stdout, &uio); - FUNLOCKFILE(stdout); - return (ret ? EOF : '\n'); + return (__sfvwrite(stdout, &uio) ? EOF : '\n'); } diff --git a/lib/libc/stdio/putw.c b/lib/libc/stdio/putw.c index b47d87cb21f..af5d335ceb1 100644 --- a/lib/libc/stdio/putw.c +++ b/lib/libc/stdio/putw.c @@ -1,4 +1,4 @@ -/* $OpenBSD: putw.c,v 1.7 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: putw.c,v 1.8 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -32,7 +32,6 @@ */ #include <stdio.h> -#include "local.h" #include "fvwrite.h" int @@ -40,14 +39,10 @@ putw(int w, FILE *fp) { struct __suio uio; struct __siov iov; - int ret; iov.iov_base = &w; iov.iov_len = uio.uio_resid = sizeof(w); uio.uio_iov = &iov; uio.uio_iovcnt = 1; - FLOCKFILE(fp); - ret = __sfvwrite(fp, &uio); - FUNLOCKFILE(fp); - return (ret); + return (__sfvwrite(fp, &uio)); } diff --git a/lib/libc/stdio/refill.c b/lib/libc/stdio/refill.c index a559ca9b320..8b690b46b25 100644 --- a/lib/libc/stdio/refill.c +++ b/lib/libc/stdio/refill.c @@ -1,4 +1,4 @@ -/* $OpenBSD: refill.c,v 1.9 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: refill.c,v 1.10 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -39,8 +39,9 @@ static int lflush(FILE *fp) { + if ((fp->_flags & (__SLBF|__SWR)) == (__SLBF|__SWR)) - return (__sflush_locked(fp)); /* ignored... */ + return (__sflush(fp)); return (0); } @@ -102,16 +103,8 @@ __srefill(FILE *fp) * flush all line buffered output files, per the ANSI C * standard. */ - if (fp->_flags & (__SLBF|__SNBF)) { - /* Ignore this file in _fwalk to avoid potential deadlock. */ - fp->_flags |= __SIGN; + if (fp->_flags & (__SLBF|__SNBF)) (void) _fwalk(lflush); - fp->_flags &= ~__SIGN; - - /* Now flush this file without locking it. */ - if ((fp->_flags & (__SLBF|__SWR)) == (__SLBF|__SWR)) - __sflush(fp); - } fp->_p = fp->_bf._base; fp->_r = (*fp->_read)(fp->_cookie, (char *)fp->_p, fp->_bf._size); fp->_flags &= ~__SMOD; /* buffer contents are again pristine */ diff --git a/lib/libc/stdio/setvbuf.c b/lib/libc/stdio/setvbuf.c index 21db80dbbdb..e7274465265 100644 --- a/lib/libc/stdio/setvbuf.c +++ b/lib/libc/stdio/setvbuf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: setvbuf.c,v 1.9 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: setvbuf.c,v 1.10 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -61,7 +61,6 @@ setvbuf(FILE *fp, char *buf, int mode, size_t size) * malloc()ed. We also clear any eof condition, as if this were * a seek. */ - FLOCKFILE(fp); ret = 0; (void)__sflush(fp); if (HASUB(fp)) @@ -108,7 +107,6 @@ nbf: fp->_w = 0; fp->_bf._base = fp->_p = fp->_nbuf; fp->_bf._size = 1; - FUNLOCKFILE(fp); return (ret); } flags |= __SMBF; @@ -147,7 +145,6 @@ nbf: /* begin/continue reading, or stay in intermediate state */ fp->_w = 0; } - FUNLOCKFILE(fp); __atexit_register_cleanup(_cleanup); return (ret); diff --git a/lib/libc/stdio/snprintf.c b/lib/libc/stdio/snprintf.c index 56f3b612c37..678345894a8 100644 --- a/lib/libc/stdio/snprintf.c +++ b/lib/libc/stdio/snprintf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: snprintf.c,v 1.15 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: snprintf.c,v 1.16 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -60,7 +60,7 @@ snprintf(char *str, size_t n, const char *fmt, ...) f._bf._base = f._p = (unsigned char *)str; f._bf._size = f._w = n - 1; va_start(ap, fmt); - ret = __vfprintf(&f, fmt, ap); + ret = vfprintf(&f, fmt, ap); va_end(ap); *f._p = '\0'; return (ret); diff --git a/lib/libc/stdio/sprintf.c b/lib/libc/stdio/sprintf.c index c26d0e3930e..4e9cd37a7c5 100644 --- a/lib/libc/stdio/sprintf.c +++ b/lib/libc/stdio/sprintf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sprintf.c,v 1.14 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: sprintf.c,v 1.15 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -56,7 +56,7 @@ sprintf(char *str, const char *fmt, ...) f._bf._base = f._p = (unsigned char *)str; f._bf._size = f._w = INT_MAX; va_start(ap, fmt); - ret = __vfprintf(&f, fmt, ap); + ret = vfprintf(&f, fmt, ap); va_end(ap); *f._p = '\0'; return (ret); diff --git a/lib/libc/stdio/ungetc.c b/lib/libc/stdio/ungetc.c index 9c4296df053..85e0895f7b5 100644 --- a/lib/libc/stdio/ungetc.c +++ b/lib/libc/stdio/ungetc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ungetc.c,v 1.10 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: ungetc.c,v 1.11 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -82,20 +82,17 @@ ungetc(int c, FILE *fp) return (EOF); if (!__sdidinit) __sinit(); - FLOCKFILE(fp); _SET_ORIENTATION(fp, -1); if ((fp->_flags & __SRD) == 0) { /* * Not already reading: no good unless reading-and-writing. * Otherwise, flush any current write stuff. */ - if ((fp->_flags & __SRW) == 0) { -error: FUNLOCKFILE(fp); + if ((fp->_flags & __SRW) == 0) return (EOF); - } if (fp->_flags & __SWR) { if (__sflush(fp)) - goto error; + return (EOF); fp->_flags &= ~__SWR; fp->_w = 0; fp->_lbfsize = 0; @@ -110,10 +107,9 @@ error: FUNLOCKFILE(fp); */ if (HASUB(fp)) { if (fp->_r >= _UB(fp)._size && __submore(fp)) - goto error; + return (EOF); *--fp->_p = c; -inc_ret: fp->_r++; - FUNLOCKFILE(fp); + fp->_r++; return (c); } fp->_flags &= ~__SEOF; @@ -126,7 +122,8 @@ inc_ret: fp->_r++; if (fp->_bf._base != NULL && fp->_p > fp->_bf._base && fp->_p[-1] == c) { fp->_p--; - goto inc_ret; + fp->_r++; + return (c); } /* @@ -140,6 +137,5 @@ inc_ret: fp->_r++; fp->_ubuf[sizeof(fp->_ubuf) - 1] = c; fp->_p = &fp->_ubuf[sizeof(fp->_ubuf) - 1]; fp->_r = 1; - FUNLOCKFILE(fp); return (c); } diff --git a/lib/libc/stdio/ungetwc.c b/lib/libc/stdio/ungetwc.c index 20d953e79e8..06f78c07a60 100644 --- a/lib/libc/stdio/ungetwc.c +++ b/lib/libc/stdio/ungetwc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ungetwc.c,v 1.2 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: ungetwc.c,v 1.3 2009/10/22 01:23:16 guenther Exp $ */ /* $NetBSD: ungetwc.c,v 1.2 2003/01/18 11:29:59 thorpej Exp $ */ /*- @@ -42,7 +42,7 @@ ungetwc(wint_t wc, FILE *fp) if (wc == WEOF) return WEOF; - FLOCKFILE(fp); + flockfile(fp); _SET_ORIENTATION(fp, 1); /* * XXX since we have no way to transform a wchar string to @@ -52,19 +52,19 @@ ungetwc(wint_t wc, FILE *fp) wcio = WCIO_GET(fp); if (wcio == 0) { - FUNLOCKFILE(fp); + funlockfile(fp); errno = ENOMEM; /* XXX */ return WEOF; } if (wcio->wcio_ungetwc_inbuf >= WCIO_UNGETWC_BUFSIZE) { - FUNLOCKFILE(fp); + funlockfile(fp); return WEOF; } wcio->wcio_ungetwc_buf[wcio->wcio_ungetwc_inbuf++] = wc; __sclearerr(fp); - FUNLOCKFILE(fp); + funlockfile(fp); return wc; } diff --git a/lib/libc/stdio/vasprintf.c b/lib/libc/stdio/vasprintf.c index 65c15c038f2..073562cd31a 100644 --- a/lib/libc/stdio/vasprintf.c +++ b/lib/libc/stdio/vasprintf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vasprintf.c,v 1.14 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: vasprintf.c,v 1.15 2009/10/22 01:23:16 guenther Exp $ */ /* * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com> @@ -37,7 +37,7 @@ vasprintf(char **str, const char *fmt, __va_list ap) if (f._bf._base == NULL) goto err; f._bf._size = f._w = 127; /* Leave room for the NUL */ - ret = __vfprintf(&f, fmt, ap); + ret = vfprintf(&f, fmt, ap); if (ret == -1) goto err; *f._p = '\0'; diff --git a/lib/libc/stdio/vfprintf.c b/lib/libc/stdio/vfprintf.c index 2d3fb3ebe13..4ab62b49f29 100644 --- a/lib/libc/stdio/vfprintf.c +++ b/lib/libc/stdio/vfprintf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfprintf.c,v 1.55 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: vfprintf.c,v 1.56 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. @@ -130,8 +130,8 @@ __sbprintf(FILE *fp, const char *fmt, va_list ap) fake._lbfsize = 0; /* not actually used, but Just In Case */ /* do the work, then copy any error status */ - ret = __vfprintf(&fake, fmt, ap); - if (ret >= 0 && __sflush(&fake)) + ret = vfprintf(&fake, fmt, ap); + if (ret >= 0 && fflush(&fake)) ret = EOF; if (fake._flags & __SERR) fp->_flags |= __SERR; @@ -190,17 +190,6 @@ static int exponent(char *, int, int); int vfprintf(FILE *fp, const char *fmt0, __va_list ap) { - int ret; - - FLOCKFILE(fp); - ret = __vfprintf(fp, fmt0, ap); - FUNLOCKFILE(fp); - return (ret); -} - -int -__vfprintf(FILE *fp, const char *fmt0, __va_list ap) -{ char *fmt; /* format string */ int ch; /* character from fmt */ int n, n2; /* handy integers (short term usage) */ diff --git a/lib/libc/stdio/vfscanf.c b/lib/libc/stdio/vfscanf.c index 3a579b19a02..5b2fd03f4eb 100644 --- a/lib/libc/stdio/vfscanf.c +++ b/lib/libc/stdio/vfscanf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfscanf.c,v 1.23 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: vfscanf.c,v 1.24 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -117,7 +117,6 @@ VFSCANF(FILE *fp, const char *fmt0, __va_list ap) static short basefix[17] = { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; - FLOCKFILE(fp); _SET_ORIENTATION(fp, -1); nassigned = 0; @@ -125,10 +124,8 @@ VFSCANF(FILE *fp, const char *fmt0, __va_list ap) base = 0; /* XXX just to keep gcc happy */ for (;;) { c = *fmt++; - if (c == 0) { - FUNLOCKFILE(fp); + if (c == 0) return (nassigned); - } if (isspace(c)) { while ((fp->_r > 0 || __srefill(fp) == 0) && isspace(*fp->_p)) @@ -296,7 +293,6 @@ literal: * Disgusting backwards compatibility hacks. XXX */ case '\0': /* compat */ - FUNLOCKFILE(fp); return (EOF); default: /* compat */ @@ -694,10 +690,8 @@ literal: } } input_failure: - if (nassigned == 0) - nassigned = -1; + return (nassigned ? nassigned : -1); match_failure: - FUNLOCKFILE(fp); return (nassigned); } diff --git a/lib/libc/stdio/vsnprintf.c b/lib/libc/stdio/vsnprintf.c index 5a08714075e..a3931226bd5 100644 --- a/lib/libc/stdio/vsnprintf.c +++ b/lib/libc/stdio/vsnprintf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vsnprintf.c,v 1.13 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: vsnprintf.c,v 1.14 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -58,7 +58,7 @@ vsnprintf(char *str, size_t n, const char *fmt, __va_list ap) f._flags = __SWR | __SSTR; f._bf._base = f._p = (unsigned char *)str; f._bf._size = f._w = n - 1; - ret = __vfprintf(&f, fmt, ap); + ret = vfprintf(&f, fmt, ap); *f._p = '\0'; return (ret); } diff --git a/lib/libc/stdio/vsprintf.c b/lib/libc/stdio/vsprintf.c index 720adb32f4c..cfa1349984d 100644 --- a/lib/libc/stdio/vsprintf.c +++ b/lib/libc/stdio/vsprintf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vsprintf.c,v 1.14 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: vsprintf.c,v 1.15 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -53,7 +53,7 @@ vsprintf(char *str, const char *fmt, __va_list ap) f._flags = __SWR | __SSTR; f._bf._base = f._p = (unsigned char *)str; f._bf._size = f._w = INT_MAX; - ret = __vfprintf(&f, fmt, ap); + ret = vfprintf(&f, fmt, ap); *f._p = '\0'; return (ret); } diff --git a/lib/libc/stdio/wbuf.c b/lib/libc/stdio/wbuf.c index 8d181a66f30..990f1ea48c4 100644 --- a/lib/libc/stdio/wbuf.c +++ b/lib/libc/stdio/wbuf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wbuf.c,v 1.10 2009/10/21 16:04:23 guenther Exp $ */ +/* $OpenBSD: wbuf.c,v 1.11 2009/10/22 01:23:16 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -65,20 +65,20 @@ __swbuf(int c, FILE *fp) * stuff c into the buffer. If this causes the buffer to fill * completely, or if c is '\n' and the file is line buffered, * flush it (perhaps a second time). The second flush will always - * happen on unbuffered streams, where _bf._size==1; __sflush() + * happen on unbuffered streams, where _bf._size==1; fflush() * guarantees that putc() will always call wbuf() by setting _w * to 0, so we need not do anything else. */ n = fp->_p - fp->_bf._base; if (n >= fp->_bf._size) { - if (__sflush(fp)) + if (fflush(fp)) return (EOF); n = 0; } fp->_w--; *fp->_p++ = c; if (++n == fp->_bf._size || (fp->_flags & __SLBF && c == '\n')) - if (__sflush(fp)) + if (fflush(fp)) return (EOF); return (c); } diff --git a/lib/libpthread/uthread/uthread_file.c b/lib/libpthread/uthread/uthread_file.c index 83bbefadd63..d8c9cdcb818 100644 --- a/lib/libpthread/uthread/uthread_file.c +++ b/lib/libpthread/uthread/uthread_file.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uthread_file.c,v 1.15 2009/10/21 16:05:02 guenther Exp $ */ +/* $OpenBSD: uthread_file.c,v 1.16 2009/10/22 01:23:16 guenther Exp $ */ /* * Copyright (c) 1995 John Birrell <jb@cimlogic.com.au>. * All rights reserved. @@ -41,7 +41,6 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <unistd.h> #include <sys/queue.h> #ifdef _THREAD_SAFE #include <pthread.h> @@ -174,65 +173,68 @@ do_lock(int idx, FILE *fp) return(p); } - void flockfile(FILE * fp) { int idx = file_idx(fp); struct file_lock *p; - /* Lock the hash table: */ - _SPINLOCK(&hash_lock); + /* Check if this is a real file: */ + if (fileno(fp) >= 0) { + /* Lock the hash table: */ + _SPINLOCK(&hash_lock); - /* Check if the static array has not been initialised: */ - if (!init_done) { - /* Initialise the global array: */ - memset(flh,0,sizeof(flh)); + /* Check if the static array has not been initialised: */ + if (!init_done) { + /* Initialise the global array: */ + memset(flh,0,sizeof(flh)); - /* Flag the initialisation as complete: */ - init_done = 1; - } + /* Flag the initialisation as complete: */ + init_done = 1; + } - /* Get a pointer to any existing lock for the file: */ - if ((p = find_lock(idx, fp)) == NULL) { - /* - * The file is not locked, so this thread can - * grab the lock: - */ - p = do_lock(idx, fp); + /* Get a pointer to any existing lock for the file: */ + if ((p = find_lock(idx, fp)) == NULL) { + /* + * The file is not locked, so this thread can + * grab the lock: + */ + p = do_lock(idx, fp); - /* Unlock the hash table: */ - _SPINUNLOCK(&hash_lock); + /* Unlock the hash table: */ + _SPINUNLOCK(&hash_lock); - /* - * The file is already locked, so check if the - * running thread is the owner: - */ - } else if (p->owner == _thread_run) { /* - * The running thread is already the - * owner, so increment the count of - * the number of times it has locked - * the file: + * The file is already locked, so check if the + * running thread is the owner: */ - p->count++; + } else if (p->owner == _thread_run) { + /* + * The running thread is already the + * owner, so increment the count of + * the number of times it has locked + * the file: + */ + p->count++; - /* Unlock the hash table: */ - _SPINUNLOCK(&hash_lock); - } else { - /* - * The file is locked for another thread. - * Append this thread to the queue of - * threads waiting on the lock. - */ - TAILQ_INSERT_TAIL(&p->l_head,_thread_run,qe); + /* Unlock the hash table: */ + _SPINUNLOCK(&hash_lock); + } else { + /* + * The file is locked for another thread. + * Append this thread to the queue of + * threads waiting on the lock. + */ + TAILQ_INSERT_TAIL(&p->l_head,_thread_run,qe); - /* Unlock the hash table: */ - _SPINUNLOCK(&hash_lock); + /* Unlock the hash table: */ + _SPINUNLOCK(&hash_lock); - /* Wait on the FILE lock: */ - _thread_kern_sched_state(PS_FILE_WAIT, "", 0); + /* Wait on the FILE lock: */ + _thread_kern_sched_state(PS_FILE_WAIT, "", 0); + } } + return; } int @@ -242,45 +244,48 @@ ftrylockfile(FILE * fp) int idx = file_idx(fp); struct file_lock *p; - /* Lock the hash table: */ - _SPINLOCK(&hash_lock); + /* Check if this is a real file: */ + if (fileno(fp) >= 0) { + /* Lock the hash table: */ + _SPINLOCK(&hash_lock); - /* Get a pointer to any existing lock for the file: */ - if ((p = find_lock(idx, fp)) == NULL) { - /* - * The file is not locked, so this thread can - * grab the lock: - */ - p = do_lock(idx, fp); + /* Get a pointer to any existing lock for the file: */ + if ((p = find_lock(idx, fp)) == NULL) { + /* + * The file is not locked, so this thread can + * grab the lock: + */ + p = do_lock(idx, fp); - /* - * The file is already locked, so check if the - * running thread is the owner: - */ - } else if (p->owner == _thread_run) { - /* - * The running thread is already the - * owner, so increment the count of - * the number of times it has locked - * the file: - */ - p->count++; - } else { /* - * The file is locked for another thread, - * so this try fails. + * The file is already locked, so check if the + * running thread is the owner: */ - p = NULL; - } + } else if (p->owner == _thread_run) { + /* + * The running thread is already the + * owner, so increment the count of + * the number of times it has locked + * the file: + */ + p->count++; + } else { + /* + * The file is locked for another thread, + * so this try fails. + */ + p = NULL; + } - /* Check if the lock was obtained: */ - if (p != NULL) - /* Return success: */ - ret = 0; + /* Check if the lock was obtained: */ + if (p != NULL) + /* Return success: */ + ret = 0; - /* Unlock the hash table: */ - _SPINUNLOCK(&hash_lock); + /* Unlock the hash table: */ + _SPINUNLOCK(&hash_lock); + } return (ret); } @@ -290,64 +295,68 @@ funlockfile(FILE * fp) int idx = file_idx(fp); struct file_lock *p; - /* - * Defer signals to protect the scheduling queues from - * access by the signal handler: - */ - _thread_kern_sig_defer(); + /* Check if this is a real file: */ + if (fileno(fp) >= 0) { + /* + * Defer signals to protect the scheduling queues from + * access by the signal handler: + */ + _thread_kern_sig_defer(); - /* Lock the hash table: */ - _SPINLOCK(&hash_lock); + /* Lock the hash table: */ + _SPINLOCK(&hash_lock); - /* - * Get a pointer to the lock for the file and check that - * the running thread is the one with the lock: - */ - if ((p = find_lock(idx, fp)) != NULL && - p->owner == _thread_run) { /* - * Check if this thread has locked the FILE - * more than once: + * Get a pointer to the lock for the file and check that + * the running thread is the one with the lock: */ - if (p->count > 1) + if ((p = find_lock(idx, fp)) != NULL && + p->owner == _thread_run) { /* - * Decrement the count of the number of - * times the running thread has locked this - * file: + * Check if this thread has locked the FILE + * more than once: */ - p->count--; - else { - /* - * The running thread will release the - * lock now: - */ - p->count = 0; - - /* Get the new owner of the lock: */ - if ((p->owner = TAILQ_FIRST(&p->l_head)) != NULL) { - /* Pop the thread off the queue: */ - TAILQ_REMOVE(&p->l_head,p->owner,qe); - + if (p->count > 1) /* - * This is the first lock for the new - * owner: + * Decrement the count of the number of + * times the running thread has locked this + * file: */ - p->count = 1; - - /* Allow the new owner to run: */ - PTHREAD_NEW_STATE(p->owner,PS_RUNNING); + p->count--; + else { + /* + * The running thread will release the + * lock now: + */ + p->count = 0; + + /* Get the new owner of the lock: */ + if ((p->owner = TAILQ_FIRST(&p->l_head)) != NULL) { + /* Pop the thread off the queue: */ + TAILQ_REMOVE(&p->l_head,p->owner,qe); + + /* + * This is the first lock for the new + * owner: + */ + p->count = 1; + + /* Allow the new owner to run: */ + PTHREAD_NEW_STATE(p->owner,PS_RUNNING); + } } } - } - /* Unlock the hash table: */ - _SPINUNLOCK(&hash_lock); + /* Unlock the hash table: */ + _SPINUNLOCK(&hash_lock); - /* - * Undefer and handle pending signals, yielding if - * necessary: - */ - _thread_kern_sig_undefer(); + /* + * Undefer and handle pending signals, yielding if + * necessary: + */ + _thread_kern_sig_undefer(); + } + return; } #endif |