BSD 4_3_Reno release
[unix-history] / usr / src / lib / libc / gen / getttyent.c
index 670e80f..0cdd259 100644 (file)
-/* @(#)getttyent.c     4.1 (Berkeley) %G% */
+/*
+ * Copyright (c) 1989 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that: (1) source distributions retain this entire copyright
+ * notice and comment, and (2) distributions including binaries display
+ * the following acknowledgement:  ``This product includes software
+ * developed by the University of California, Berkeley and its contributors''
+ * in the documentation or other materials provided with the distribution
+ * and in all advertising materials mentioning features or use of this
+ * software. Neither the name of the University nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)getttyent.c        5.8 (Berkeley) 6/1/90";
+#endif /* LIBC_SCCS and not lint */
 
 
-#include <stdio.h>
 #include <ttyent.h>
 #include <ttyent.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
 
 
-static char TTYFILE[] = "/etc/ttys";
-static char EMPTY[] = "";
-static FILE *tf = NULL;
-static char line[BUFSIZ+1];
-static struct ttyent tty;
+static char zapchar;
+static FILE *tf;
 
 
-setttyent()
+struct ttyent *
+getttynam(tty)
+       char *tty;
 {
 {
-       if (tf == NULL)
-               tf = fopen(TTYFILE, "r");
-       else
-               rewind(tf);
+       register struct ttyent *t;
+
+       setttyent();
+       while (t = getttyent())
+               if (!strcmp(tty, t->ty_name))
+                       break;
+       return(t);
 }
 
 }
 
-endttyent()
+struct ttyent *
+getttyent()
 {
 {
-       if (tf != NULL) {
-               (void) fclose(tf);
-               tf = NULL;
+       static struct ttyent tty;
+       register int c;
+       register char *p;
+#define        MAXLINELENGTH   100
+       static char line[MAXLINELENGTH];
+       char *skip(), *value();
+
+       if (!tf && !setttyent())
+               return(NULL);
+       for (;;) {
+               if (!fgets(p = line, sizeof(line), tf))
+                       return(NULL);
+               /* skip lines that are too big */
+               if (!index(p, '\n')) {
+                       while ((c = getc(tf)) != '\n' && c != EOF)
+                               ;
+                       continue;
+               }
+               while (isspace(*p))
+                       ++p;
+               if (*p && *p != '#')
+                       break;
        }
        }
+
+       zapchar = 0;
+       tty.ty_name = p;
+       p = skip(p);
+       if (!*(tty.ty_getty = p))
+               tty.ty_getty = tty.ty_type = NULL;
+       else {
+               p = skip(p);
+               if (!*(tty.ty_type = p))
+                       tty.ty_type = NULL;
+               else
+                       p = skip(p);
+       }
+       tty.ty_status = 0;
+       tty.ty_window = NULL;
+
+#define        scmp(e) !strncmp(p, e, sizeof(e) - 1) && isspace(p[sizeof(e) - 1])
+#define        vcmp(e) !strncmp(p, e, sizeof(e) - 1) && p[sizeof(e) - 1] == '='
+       for (; *p; p = skip(p)) {
+               if (scmp(_TTYS_OFF))
+                       tty.ty_status &= ~TTY_ON;
+               else if (scmp(_TTYS_ON))
+                       tty.ty_status |= TTY_ON;
+               else if (scmp(_TTYS_SECURE))
+                       tty.ty_status |= TTY_SECURE;
+               else if (vcmp(_TTYS_WINDOW))
+                       tty.ty_window = value(p);
+               else
+                       break;
+       }
+
+       if (zapchar == '#' || *p == '#')
+               while ((c = *++p) == ' ' || c == '\t')
+                       ;
+       tty.ty_comment = p;
+       if (*p == 0)
+               tty.ty_comment = 0;
+       if (p = index(p, '\n'))
+               *p = '\0';
+       return(&tty);
 }
 
 }
 
+#define        QUOTED  1
+
+/*
+ * Skip over the current field, removing quotes, and return a pointer to
+ * the next field.
+ */
 static char *
 skip(p)
 static char *
 skip(p)
-register char *p;
+       register char *p;
 {
 {
-       register int c;
+       register char *t;
+       register int c, q;
 
 
-       while ((c = *p) != '\0') {
+       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 == '#') {
                if (c == '#') {
-                       *p = '\0';
+                       zapchar = c;
+                       *p = 0;
                        break;
                }
                if (c == '\t' || c == ' ' || c == '\n') {
                        break;
                }
                if (c == '\t' || c == ' ' || c == '\n') {
-                       *p++ = '\0';
+                       zapchar = c;
+                       *p++ = 0;
                        while ((c = *p) == '\t' || c == ' ' || c == '\n')
                                p++;
                        break;
                }
                        while ((c = *p) == '\t' || c == ' ' || c == '\n')
                                p++;
                        break;
                }
-               p++;
        }
        }
-       return (p);
+       *--t = '\0';
+       return(p);
 }
 
 }
 
-struct ttyent *
-getttyent()
+static char *
+value(p)
+       register char *p;
 {
 {
-       register char *p, *cp;
-       register int c;
+       return((p = index(p, '=')) ? ++p : NULL);
+}
 
 
-       if (tf == NULL) {
-               if ((tf = fopen(TTYFILE, "r")) == NULL)
-                       return (NULL);
-       }
-       do {
-               p = fgets(line, BUFSIZ, tf);
-               if (p == NULL)
-                       return (NULL);
-               while ((c = *p) == '\t' || c == ' ' || c == '\n')
-                       p++;
-       } while (c == '\0' || c == '#');
-       tty.ty_name = p;
-       p = skip(p);
-       tty.ty_getty = p;
-       p = skip(p);
-       tty.ty_type = p;
-       tty.ty_status = 0;
-       for (p = skip(p); *p; p = cp) {
-               cp = skip(p);
-               if (strcmp(p, "on") == 0)
-                       tty.ty_status |= TTY_ON;
-               else if (strcmp(p, "off") == 0)
-                       tty.ty_status &= ~TTY_ON;
-               else if (strcmp(p, "secure") == 0)
-                       tty.ty_status |= TTY_SECURE;
+setttyent()
+{
+       if (tf) {
+               (void)rewind(tf);
+               return(1);
+       } else if (tf = fopen(_PATH_TTYS, "r"))
+               return(1);
+       return(0);
+}
+
+endttyent()
+{
+       int rval;
+
+       if (tf) {
+               rval = !(fclose(tf) == EOF);
+               tf = NULL;
+               return(rval);
        }
        }
-       tty.ty_comment = EMPTY;
-       return (&tty);
+       return(1);
 }
 }