diff options
Diffstat (limited to 'libc/misc/ttyent/getttyent.c')
-rw-r--r-- | libc/misc/ttyent/getttyent.c | 105 |
1 files changed, 49 insertions, 56 deletions
diff --git a/libc/misc/ttyent/getttyent.c b/libc/misc/ttyent/getttyent.c index 0df2b4a79..18b9109af 100644 --- a/libc/misc/ttyent/getttyent.c +++ b/libc/misc/ttyent/getttyent.c @@ -27,10 +27,8 @@ * SUCH DAMAGE. */ -#if 0 -static char sccsid[] = "@(#)getttyent.c 8.1 (Berkeley) 6/4/93"; -#endif - +#define _GNU_SOURCE +#include <features.h> #include <ttyent.h> #include <stdio.h> #include <stdio_ext.h> @@ -39,9 +37,10 @@ static char sccsid[] = "@(#)getttyent.c 8.1 (Berkeley) 6/4/93"; static char zapchar; static FILE *tf; +static struct ttyent tty; + -struct ttyent * -getttynam(const char *tty) +struct ttyent * getttynam(const char *tty) { register struct ttyent *t; @@ -53,16 +52,54 @@ getttynam(const char *tty) return (t); } -static char *skip __P((char *)); -static char *value __P((char *)); -struct ttyent * getttyent() +/* Skip over the current field, removing quotes, and return + * a pointer to the next field. + */ +#define QUOTED 1 +static char * skip(register char *p) +{ + register char *t; + register int c, q; + + for (q = 0, t = p; (c = *p) != '\0'; p++) { + if (c == '"') { + q ^= QUOTED; /* obscure, but nice */ + continue; + } + if (q == QUOTED && *p == '\\' && *(p+1) == '"') + p++; + *t++ = *p; + if (q == QUOTED) + continue; + if (c == '#') { + zapchar = c; + *p = 0; + break; + } + if (c == '\t' || c == ' ' || c == '\n') { + zapchar = c; + *p++ = 0; + while ((c = *p) == '\t' || c == ' ' || c == '\n') + p++; + break; + } + } + *--t = '\0'; + return (p); +} + +static char * value(register char *p) +{ + + return ((p = index(p, '=')) ? ++p : NULL); +} + +struct ttyent * getttyent(void) { - static struct ttyent tty; register int c; register char *p; -#define MAXLINELENGTH 100 - static char line[MAXLINELENGTH]; + static char line[BUFSIZ]; if (!tf && !setttyent()) return (NULL); @@ -127,50 +164,6 @@ struct ttyent * getttyent() return (&tty); } -#define QUOTED 1 - -/* - * Skip over the current field, removing quotes, and return a pointer to - * the next field. - */ -static char * skip(register char *p) -{ - register char *t; - register int c, q; - - for (q = 0, t = p; (c = *p) != '\0'; p++) { - if (c == '"') { - q ^= QUOTED; /* obscure, but nice */ - continue; - } - if (q == QUOTED && *p == '\\' && *(p+1) == '"') - p++; - *t++ = *p; - if (q == QUOTED) - continue; - if (c == '#') { - zapchar = c; - *p = 0; - break; - } - if (c == '\t' || c == ' ' || c == '\n') { - zapchar = c; - *p++ = 0; - while ((c = *p) == '\t' || c == ' ' || c == '\n') - p++; - break; - } - } - *--t = '\0'; - return (p); -} - -static char * value(register char *p) -{ - - return ((p = index(p, '=')) ? ++p : NULL); -} - int setttyent(void) { |