diff options
author | tjr <tjr@FreeBSD.org> | 2003-01-30 11:46:25 +0000 |
---|---|---|
committer | tjr <tjr@FreeBSD.org> | 2003-01-30 11:46:25 +0000 |
commit | a3bd15f559697a76e00eb7434a518999eef2acd5 (patch) | |
tree | 38634c3fccf7d9ff85bf2bca2d9308458cdc2302 /lib/libc/stdio/gets.c | |
parent | bcf1d466fec6d23dea7b7c1d0f0abe5707c727e5 (diff) | |
download | FreeBSD-src-a3bd15f559697a76e00eb7434a518999eef2acd5.zip FreeBSD-src-a3bd15f559697a76e00eb7434a518999eef2acd5.tar.gz |
Lock stdin on entry, unlock on return, use __sgetc() instead of getchar()
to avoid locking the stream for each character and to avoid input being
scattered among multiple threads.
Diffstat (limited to 'lib/libc/stdio/gets.c')
-rw-r--r-- | lib/libc/stdio/gets.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/lib/libc/stdio/gets.c b/lib/libc/stdio/gets.c index 932b828..e247271 100644 --- a/lib/libc/stdio/gets.c +++ b/lib/libc/stdio/gets.c @@ -45,6 +45,8 @@ __FBSDID("$FreeBSD$"); #include <stdio.h> #include <sys/cdefs.h> #include "un-namespace.h" +#include "libc_private.h" +#include "local.h" __warn_references(gets, "warning: this program uses gets(), which is unsafe."); @@ -58,20 +60,22 @@ gets(buf) static char w[] = "warning: this program uses gets(), which is unsafe.\n"; - /* Orientation set by getchar(). */ - + FLOCKFILE(stdin); + ORIENT(stdin, -1); if (!warned) { (void) _write(STDERR_FILENO, w, sizeof(w) - 1); warned = 1; } - for (s = buf; (c = getchar()) != '\n';) + for (s = buf; (c = __sgetc(stdin)) != '\n';) if (c == EOF) - if (s == buf) + if (s == buf) { + FUNLOCKFILE(stdin); return (NULL); - else + } else break; else *s++ = c; *s = 0; + FUNLOCKFILE(stdin); return (buf); } |