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