121343Sdist /* 239176Sbostic * Copyright (c) 1989 The Regents of the University of California. 339176Sbostic * All rights reserved. 439176Sbostic * 542625Sbostic * %sccs.include.redist.c% 621343Sdist */ 716420Sralph 826562Sdonn #if defined(LIBC_SCCS) && !defined(lint) 9*47645Skarels static char sccsid[] = "@(#)getttyent.c 5.10 (Berkeley) 03/23/91"; 1039176Sbostic #endif /* LIBC_SCCS and not lint */ 1121343Sdist 1239176Sbostic #include <ttyent.h> 1316420Sralph #include <stdio.h> 1439176Sbostic #include <ctype.h> 1542024Sbostic #include <string.h> 1616420Sralph 1728308Skarels static char zapchar; 1839176Sbostic static FILE *tf; 1916420Sralph 2039176Sbostic struct ttyent * 2139176Sbostic getttynam(tty) 2246597Sdonn const char *tty; 2316420Sralph { 2439176Sbostic register struct ttyent *t; 2539176Sbostic 2639176Sbostic setttyent(); 2739176Sbostic while (t = getttyent()) 2839176Sbostic if (!strcmp(tty, t->ty_name)) 2939176Sbostic break; 30*47645Skarels endttyent(); 31*47645Skarels return (t); 3216420Sralph } 3316420Sralph 3439176Sbostic struct ttyent * 3539176Sbostic getttyent() 3616420Sralph { 3739176Sbostic static struct ttyent tty; 3839176Sbostic register int c; 3939176Sbostic register char *p; 4039176Sbostic #define MAXLINELENGTH 100 4139176Sbostic static char line[MAXLINELENGTH]; 4246597Sdonn static char *skip(), *value(); 4339176Sbostic 4439176Sbostic if (!tf && !setttyent()) 45*47645Skarels return (NULL); 4640204Sbostic for (;;) { 4740204Sbostic if (!fgets(p = line, sizeof(line), tf)) 48*47645Skarels return (NULL); 4939176Sbostic /* skip lines that are too big */ 5040204Sbostic if (!index(p, '\n')) { 5139176Sbostic while ((c = getc(tf)) != '\n' && c != EOF) 5239176Sbostic ; 5339176Sbostic continue; 5439176Sbostic } 5540204Sbostic while (isspace(*p)) 5640204Sbostic ++p; 5740204Sbostic if (*p && *p != '#') 5840204Sbostic break; 5940204Sbostic } 6039176Sbostic 6139176Sbostic zapchar = 0; 6239176Sbostic tty.ty_name = p; 6339176Sbostic p = skip(p); 6439176Sbostic if (!*(tty.ty_getty = p)) 6539176Sbostic tty.ty_getty = tty.ty_type = NULL; 6639176Sbostic else { 6739176Sbostic p = skip(p); 6839176Sbostic if (!*(tty.ty_type = p)) 6939176Sbostic tty.ty_type = NULL; 7039176Sbostic else 7139176Sbostic p = skip(p); 7216420Sralph } 7339176Sbostic tty.ty_status = 0; 7439176Sbostic tty.ty_window = NULL; 7539176Sbostic 7639176Sbostic #define scmp(e) !strncmp(p, e, sizeof(e) - 1) && isspace(p[sizeof(e) - 1]) 7739176Sbostic #define vcmp(e) !strncmp(p, e, sizeof(e) - 1) && p[sizeof(e) - 1] == '=' 7839176Sbostic for (; *p; p = skip(p)) { 7939176Sbostic if (scmp(_TTYS_OFF)) 8039176Sbostic tty.ty_status &= ~TTY_ON; 8139176Sbostic else if (scmp(_TTYS_ON)) 8239176Sbostic tty.ty_status |= TTY_ON; 8339176Sbostic else if (scmp(_TTYS_SECURE)) 8439176Sbostic tty.ty_status |= TTY_SECURE; 8539176Sbostic else if (vcmp(_TTYS_WINDOW)) 8639176Sbostic tty.ty_window = value(p); 8739176Sbostic else 8839176Sbostic break; 8939176Sbostic } 9039176Sbostic 9139176Sbostic if (zapchar == '#' || *p == '#') 9239176Sbostic while ((c = *++p) == ' ' || c == '\t') 9339176Sbostic ; 9439176Sbostic tty.ty_comment = p; 9539176Sbostic if (*p == 0) 9639176Sbostic tty.ty_comment = 0; 9739176Sbostic if (p = index(p, '\n')) 9839176Sbostic *p = '\0'; 99*47645Skarels return (&tty); 10016420Sralph } 10116420Sralph 10239176Sbostic #define QUOTED 1 10317882Sralph 10417882Sralph /* 10539176Sbostic * Skip over the current field, removing quotes, and return a pointer to 10639176Sbostic * the next field. 10717882Sralph */ 10816420Sralph static char * 10916420Sralph skip(p) 11017882Sralph register char *p; 11116420Sralph { 11239176Sbostic register char *t; 11339176Sbostic register int c, q; 11416420Sralph 11539176Sbostic for (q = 0, t = p; (c = *p) != '\0'; p++) { 11617882Sralph if (c == '"') { 11717882Sralph q ^= QUOTED; /* obscure, but nice */ 11817882Sralph continue; 11917882Sralph } 12028308Skarels if (q == QUOTED && *p == '\\' && *(p+1) == '"') 12128308Skarels p++; 12228308Skarels *t++ = *p; 12317882Sralph if (q == QUOTED) 12417882Sralph continue; 12516420Sralph if (c == '#') { 12628308Skarels zapchar = c; 12728308Skarels *p = 0; 12816420Sralph break; 12916420Sralph } 13016420Sralph if (c == '\t' || c == ' ' || c == '\n') { 13128308Skarels zapchar = c; 13228308Skarels *p++ = 0; 13316420Sralph while ((c = *p) == '\t' || c == ' ' || c == '\n') 13416420Sralph p++; 13516420Sralph break; 13616420Sralph } 13716420Sralph } 13828308Skarels *--t = '\0'; 139*47645Skarels return (p); 14016420Sralph } 14116420Sralph 14217882Sralph static char * 14317882Sralph value(p) 14417882Sralph register char *p; 14517882Sralph { 146*47645Skarels 147*47645Skarels return ((p = index(p, '=')) ? ++p : NULL); 14817882Sralph } 14917882Sralph 15046597Sdonn int 15139176Sbostic setttyent() 15216420Sralph { 153*47645Skarels 15439176Sbostic if (tf) { 15539176Sbostic (void)rewind(tf); 156*47645Skarels return (1); 15739176Sbostic } else if (tf = fopen(_PATH_TTYS, "r")) 158*47645Skarels return (1); 159*47645Skarels return (0); 16039176Sbostic } 16116420Sralph 16246597Sdonn int 16339176Sbostic endttyent() 16439176Sbostic { 16539176Sbostic int rval; 16639176Sbostic 16739176Sbostic if (tf) { 16839176Sbostic rval = !(fclose(tf) == EOF); 16939176Sbostic tf = NULL; 170*47645Skarels return (rval); 17116420Sralph } 172*47645Skarels return (1); 17316420Sralph } 174