1 /*-
2 * Copyright (c) 1993 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Bill Jolitz.
7 *
8 * %sccs.include.redist.c%
9 */
10
11 #if defined(LIBC_SCCS) && !defined(lint)
12 static char sccsid[] = "@(#)getttyent.c 5.2 (Berkeley) 05/29/93";
13 #endif /* LIBC_SCCS and not lint */
14
15 #include <stdio.h>
16 #include <strings.h>
17 #include <ttyent.h>
18
19 static char TTYFILE[] = "/etc/ttys";
20 static char zapchar;
21 static FILE *tf = NULL;
22 #define LINE 256
23 static char line[LINE];
24 static struct ttyent tty;
25 #define NOPTS 32
26 static char *options[NOPTS];
27
setttyent()28 setttyent()
29 {
30 if (tf == NULL)
31 tf = fopen(TTYFILE, "r");
32 else
33 rewind(tf);
34 }
35
endttyent()36 endttyent()
37 {
38 if (tf != NULL) {
39 (void) fclose(tf);
40 tf = NULL;
41 }
42 }
43
44 #define QUOTED 1
45
46 /*
47 * Skip over the current field, removing quotes,
48 * and return a pointer to the next field.
49 */
50 static char *
skip(p)51 skip(p)
52 register char *p;
53 {
54 register char *t = p;
55 register int c;
56 register int q = 0;
57
58 for (; (c = *p) != '\0'; p++) {
59 if (c == '"') {
60 q ^= QUOTED; /* obscure, but nice */
61 continue;
62 }
63 if (q == QUOTED && *p == '\\' && *(p+1) == '"')
64 p++;
65 *t++ = *p;
66 if (q == QUOTED)
67 continue;
68 if (c == '#') {
69 zapchar = c;
70 *p = 0;
71 break;
72 }
73 if (c == '\t' || c == ' ' || c == '\n') {
74 zapchar = c;
75 *p++ = 0;
76 while ((c = *p) == '\t' || c == ' ' || c == '\n')
77 p++;
78 break;
79 }
80 }
81 *--t = '\0';
82 return (p);
83 }
84
85 static char *
value(p)86 value(p)
87 register char *p;
88 {
89 if ((p = index(p,'=')) == 0)
90 return(NULL);
91 p++; /* get past the = sign */
92 return(p);
93 }
94
95 struct ttyent *
getttyent()96 getttyent()
97 {
98 register char *p;
99 register int c;
100 register char **op;
101
102 if (tf == NULL) {
103 if ((tf = fopen(TTYFILE, "r")) == NULL)
104 return (NULL);
105 }
106 do {
107 p = fgets(line, LINE, tf);
108 if (p == NULL)
109 return (NULL);
110 while ((c = *p) == '\t' || c == ' ' || c == '\n')
111 p++;
112 } while (c == '\0' || c == '#');
113 zapchar = 0;
114 tty.ty_name = p;
115 p = skip(p);
116 tty.ty_getty = p;
117 p = skip(p);
118 tty.ty_type = p;
119 p = skip(p);
120 tty.ty_status = 0;
121 tty.ty_window = NULL;
122 tty.ty_flags = options ;
123 op = options ;
124 for (; *p; p = skip(p)) {
125 *op++ = p ; /* bounds check ? */
126 #define space(x) ((c = p[x]) == ' ' || c == '\t' || c == '\n')
127 if (strncmp(p, "on", 2) == 0 && space(2))
128 tty.ty_status |= TTY_ON;
129 else if (strncmp(p, "off", 3) == 0 && space(3))
130 tty.ty_status &= ~TTY_ON;
131 else if (strncmp(p, "secure", 6) == 0 && space(6))
132 tty.ty_status |= TTY_SECURE;
133 else if (strncmp(p, "window=", 7) == 0)
134 tty.ty_window = value(p);
135 else if (zapchar == '#' || *p == '#')
136 break;
137 }
138 *op = 0 ; /* end sentinel */
139 if (zapchar == '#' || *p == '#')
140 while ((c = *++p) == ' ' || c == '\t')
141 ;
142 tty.ty_comment = p;
143 if (*p == 0)
144 tty.ty_comment = 0;
145 if (p = index(p, '\n'))
146 *p = '\0';
147 return(&tty);
148 }
149