xref: /titanic_41/usr/src/lib/libbc/libc/gen/common/getttyent.c (revision 2654012f83cec5dc15b61dfe3e4a4915f186e7a6)
1 /*
2  * Copyright (c) 1985 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  */
6 
7 #pragma ident	"%Z%%M%	%I%	%E% SMI"
8 
9 
10 #include <stdio.h>
11 #include <strings.h>
12 #include <ttyent.h>
13 
14 static char *TTYFILE = "/etc/ttytab";
15 #define LINE 256
16 static struct _ttyentjunk {
17 	char	zapchar;
18 	FILE	*tf;
19 	char	line[LINE];
20 	struct	ttyent tty;
21 } *__ttyentjunk, *_ttyentjunk(void);
22 
23 static struct _ttyentjunk *
24 _ttyentjunk(void)
25 {
26 
27 	if (__ttyentjunk == 0)
28 		__ttyentjunk = (struct _ttyentjunk *)calloc(1, sizeof (struct _ttyentjunk));
29 	return (__ttyentjunk);
30 }
31 
32 void
33 setttyent(void)
34 {
35 	struct _ttyentjunk *t = _ttyentjunk();
36 
37 	if (t == 0)
38 		return;
39 	if (t->tf == NULL)
40 		t->tf = fopen(TTYFILE, "r");
41 	else
42 		rewind(t->tf);
43 }
44 
45 void
46 endttyent(void)
47 {
48 	struct _ttyentjunk *t = _ttyentjunk();
49 
50 	if (t == 0)
51 		return;
52 	if (t->tf != NULL) {
53 		(void) fclose(t->tf);
54 		t->tf = NULL;
55 	}
56 }
57 
58 #define QUOTED	1
59 
60 /*
61  * Skip over the current field, removing quotes,
62  * and return a pointer to the next field.
63  */
64 static char *
65 skip(char *p)
66 {
67 	struct _ttyentjunk *t = _ttyentjunk();
68 	char *cp = p;
69 	int c;
70 	int q = 0;
71 
72 	if (t == 0)
73 		return (0);
74 	for (; (c = *p) != '\0'; p++) {
75 		if (c == '"') {
76 			q ^= QUOTED;	/* obscure, but nice */
77 			continue;
78 		}
79 		if (q == QUOTED && *p == '\\' && *(p+1) == '"')
80 			p++;
81 		*cp++ = *p;
82 		if (q == QUOTED)
83 			continue;
84 		if (c == '#') {
85 			t->zapchar = c;
86 			*p = 0;
87 			break;
88 		}
89 		if (c == '\t' || c == ' ' || c == '\n') {
90 			t->zapchar = c;
91 			*p++ = 0;
92 			while ((c = *p) == '\t' || c == ' ' || c == '\n')
93 				p++;
94 			break;
95 		}
96 	}
97 	*--cp = '\0';
98 	return (p);
99 }
100 
101 static char *
102 value(char *p)
103 {
104 	if ((p = index(p,'=')) == 0)
105 		return (NULL);
106 	p++;			/* get past the = sign */
107 	return (p);
108 }
109 
110 struct ttyent *
111 getttyent(void)
112 {
113 	struct _ttyentjunk *t = _ttyentjunk();
114 	char *p;
115 	int c;
116 
117 	if (t == 0)
118 		return (NULL);
119 	if (t->tf == NULL) {
120 		if ((t->tf = fopen(TTYFILE, "r")) == NULL)
121 			return (NULL);
122 	}
123 	do {
124 		p = fgets(t->line, LINE, t->tf);
125 		if (p == NULL)
126 			return (NULL);
127 		while ((c = *p) == '\t' || c == ' ' || c == '\n')
128 			p++;
129 	} while (c == '\0' || c == '#');
130 	t->zapchar = 0;
131 	t->tty.ty_name = p;
132 	p = skip(p);
133 	t->tty.ty_getty = p;
134 	p = skip(p);
135 	t->tty.ty_type = p;
136 	p = skip(p);
137 	t->tty.ty_status = 0;
138 	t->tty.ty_window = NULL;
139 	for (; *p; p = skip(p)) {
140 #define space(x) ((c = p[x]) == ' ' || c == '\t' || c == '\n')
141 		if (strncmp(p, "on", 2) == 0 && space(2))
142 			t->tty.ty_status |= TTY_ON;
143 		else if (strncmp(p, "off", 3) == 0 && space(3))
144 			t->tty.ty_status &= ~TTY_ON;
145 		else if (strncmp(p, "secure", 6) == 0 && space(6))
146 			t->tty.ty_status |= TTY_SECURE;
147 		else if (strncmp(p, "local", 5) == 0 && space(5))
148 			t->tty.ty_status |= TTY_LOCAL;
149 		else if (strncmp(p, "window=", 7) == 0)
150 			t->tty.ty_window = value(p);
151 		else
152 			break;
153 	}
154 	if (t->zapchar == '#' || *p == '#')
155 		while ((c = *++p) == ' ' || c == '\t')
156 			;
157 	t->tty.ty_comment = p;
158 	if (*p == 0)
159 		t->tty.ty_comment = 0;
160 	if (p = index(p, '\n'))
161 		*p = '\0';
162 	return (&t->tty);
163 }
164