1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30: #if defined(LIBC_SCCS) && !defined(lint)
31: static char sccsid[] = "@(#)getttyent.c 8.1 (Berkeley) 6/4/93";
32: #endif
33:
34: #include <ttyent.h>
35: #include <stdio.h>
36: #include <stdio_ext.h>
37: #include <ctype.h>
38: #include <string.h>
39:
40: #ifdef USE_IN_LIBIO
41: # define flockfile(s) _IO_flockfile (s)
42: # define funlockfile(s) _IO_funlockfile (s)
43: #endif
44:
45: static char zapchar;
46: static FILE *tf;
47:
48: struct ttyent *
49: getttynam(tty)
50: const char *tty;
51: {
52: register struct ttyent *t;
53:
54: setttyent();
55: while ((t = getttyent()))
56: if (!strcmp(tty, t->ty_name))
57: break;
58: endttyent();
59: return (t);
60: }
61:
62: static char *skip (char *) __THROW internal_function;
63: static char *value (char *) __THROW internal_function;
64:
65: struct ttyent *
66: getttyent()
67: {
68: static struct ttyent tty;
69: register int c;
70: register char *p;
71: #define MAXLINELENGTH 100
72: static char line[MAXLINELENGTH];
73:
74: if (!tf && !setttyent())
75: return (NULL);
76: flockfile (tf);
77: for (;;) {
78: if (!fgets_unlocked(p = line, sizeof(line), tf)) {
79: funlockfile (tf);
80: return (NULL);
81: }
82:
83: if (!index(p, '\n')) {
84: while ((c = getc_unlocked(tf)) != '\n' && c != EOF)
85: ;
86: continue;
87: }
88: while (isspace(*p))
89: ++p;
90: if (*p && *p != '#')
91: break;
92: }
93:
94: zapchar = 0;
95: tty.ty_name = p;
96: p = skip(p);
97: if (!*(tty.ty_getty = p))
98: tty.ty_getty = tty.ty_type = NULL;
99: else {
100: p = skip(p);
101: if (!*(tty.ty_type = p))
102: tty.ty_type = NULL;
103: else
104: p = skip(p);
105: }
106: tty.ty_status = 0;
107: tty.ty_window = NULL;
108:
109: #define scmp(e) !strncmp(p, e, sizeof(e) - 1) && isspace(p[sizeof(e) - 1])
110: #define vcmp(e) !strncmp(p, e, sizeof(e) - 1) && p[sizeof(e) - 1] == '='
111: for (; *p; p = skip(p)) {
112: if (scmp(_TTYS_OFF))
113: tty.ty_status &= ~TTY_ON;
114: else if (scmp(_TTYS_ON))
115: tty.ty_status |= TTY_ON;
116: else if (scmp(_TTYS_SECURE))
117: tty.ty_status |= TTY_SECURE;
118: else if (vcmp(_TTYS_WINDOW))
119: tty.ty_window = value(p);
120: else
121: break;
122: }
123:
124: funlockfile(tf);
125:
126: if (zapchar == '#' || *p == '#')
127: while ((c = *++p) == ' ' || c == '\t')
128: ;
129: tty.ty_comment = p;
130: if (*p == 0)
131: tty.ty_comment = 0;
132: if ((p = index(p, '\n')))
133: *p = '\0';
134: return (&tty);
135: }
136: libc_hidden_def (getttyent)
137:
138: #define QUOTED 1
139:
140:
141:
142:
143:
144: static char *
145: internal_function
146: skip(p)
147: register char *p;
148: {
149: register char *t;
150: register int c, q;
151:
152: for (q = 0, t = p; (c = *p) != '\0'; p++) {
153: if (c == '"') {
154: q ^= QUOTED;
155: continue;
156: }
157: if (q == QUOTED && *p == '\\' && *(p+1) == '"')
158: p++;
159: *t++ = *p;
160: if (q == QUOTED)
161: continue;
162: if (c == '#') {
163: zapchar = c;
164: *p = 0;
165: break;
166: }
167: if (c == '\t' || c == ' ' || c == '\n') {
168: zapchar = c;
169: *p++ = 0;
170: while ((c = *p) == '\t' || c == ' ' || c == '\n')
171: p++;
172: break;
173: }
174: }
175: *--t = '\0';
176: return (p);
177: }
178:
179: static char *
180: internal_function
181: value(p)
182: register char *p;
183: {
184:
185: return ((p = index(p, '=')) ? ++p : NULL);
186: }
187:
188: int
189: setttyent()
190: {
191:
192: if (tf) {
193: (void)rewind(tf);
194: return (1);
195: } else if ((tf = fopen(_PATH_TTYS, "rc"))) {
196:
197: __fsetlocking (tf, FSETLOCKING_BYCALLER);
198: return (1);
199: }
200: return (0);
201: }
202: libc_hidden_def (setttyent)
203:
204: int
205: endttyent()
206: {
207: int rval;
208:
209: if (tf) {
210: rval = !(fclose(tf) == EOF);
211: tf = NULL;
212: return (rval);
213: }
214: return (1);
215: }
216: libc_hidden_def (endttyent)