Commit | Line | Data |
---|---|---|
9064754c TL |
1 | # |
2 | /* | |
3 | * getty -- adapt to terminal speed on dialup, and call login | |
4 | */ | |
5 | ||
6 | #include <sgtty.h> | |
7 | #include <signal.h> | |
8 | #define ERASE '#' | |
9 | #define KILL '@' | |
10 | ||
11 | struct sgttyb tmode; | |
12 | ||
13 | struct tab { | |
14 | char tname; /* this table name */ | |
15 | char nname; /* successor table name */ | |
16 | int iflags; /* initial flags */ | |
17 | int fflags; /* final flags */ | |
18 | int ispeed; /* input speed */ | |
19 | int ospeed; /* output speed */ | |
20 | char *message; /* login message */ | |
21 | } itab[] = { | |
22 | ||
23 | /* table '0'-1-2-3 300,1200,150,110 */ | |
24 | ||
25 | '0', 1, | |
26 | ANYP+RAW+NL1+CR1, ANYP+ECHO+CR1, | |
27 | B300, B300, | |
28 | "\n\r\033;\007login: ", | |
29 | ||
30 | 1, 2, | |
31 | ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1, | |
32 | B1200, B1200, | |
33 | "\n\r\033;login: ", | |
34 | ||
35 | 2, 3, | |
36 | ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1, | |
37 | B150, B150, | |
38 | "\n\r\033:\006\006\017login: ", | |
39 | ||
40 | 3, '0', | |
41 | ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1, | |
42 | B110, B110, | |
43 | "\n\rlogin: ", | |
44 | ||
45 | /* table '-' -- Console TTY 110 */ | |
46 | '-', '-', | |
47 | ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1, | |
48 | B110, B110, | |
49 | "\n\rlogin: ", | |
50 | ||
51 | /* table '1' -- 150 */ | |
52 | '1', '1', | |
53 | ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1, | |
54 | B150, B150, | |
55 | "\n\r\033:\006\006\017login: ", | |
56 | ||
57 | /* table '2' -- 9600 */ | |
58 | '2', '2', | |
59 | ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1, | |
60 | B9600, B9600, | |
61 | "\n\r\033;login: ", | |
62 | ||
63 | /* table '3'-'5' -- 1200,300 */ | |
64 | '3', '5', | |
65 | ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1, | |
66 | B1200, B1200, | |
67 | "\n\r\033;login: ", | |
68 | ||
69 | /* table '5'-'3' -- 300,1200 */ | |
70 | '5', '3', | |
71 | ANYP+RAW+NL1+CR1, ANYP+ECHO+CR1, | |
72 | B300, B300, | |
73 | "\n\r\033;\007login: ", | |
74 | ||
75 | /* table '4' -- Console Decwriter */ | |
76 | '4', '4', | |
77 | ANYP+RAW, ANYP+ECHO+CRMOD+XTABS, | |
78 | B300, B300, | |
79 | "\n\rlogin: ", | |
80 | ||
81 | /* table '6' -- 2400 */ | |
82 | '6' , '6' , | |
83 | ANYP+RAW , ANYP+ECHO+CRMOD , | |
84 | B2400 , B2400 , | |
85 | "\n\r\007login : ", | |
86 | ||
87 | /* table '7' - - 4800 */ | |
88 | '7' , '7' , | |
89 | ANYP+RAW , ANYP+ECHO+CRMOD , | |
90 | B4800 , B4800 , | |
91 | "\n\r\007login : " , | |
92 | ||
93 | /* table 'i' -- Interdata Console */ | |
94 | 'i', 'i', | |
95 | RAW+CRMOD, CRMOD+ECHO+LCASE, | |
96 | 0, 0, | |
97 | "\n\rlogin: ", | |
98 | ||
99 | /* table 'l' -- LSI Chess Terminal */ | |
100 | 'l', 'l', | |
101 | ANYP+RAW/*+HUPCL*/, ANYP+ECHO/*+HUPCL*/, | |
102 | B300, B300, | |
103 | "*", | |
104 | }; | |
105 | ||
106 | #define NITAB sizeof itab/sizeof itab[0] | |
107 | #define EOT 04 /* EOT char */ | |
108 | ||
109 | char name[16]; | |
110 | int crmod; | |
111 | int upper; | |
112 | int lower; | |
113 | ||
114 | char partab[] = { | |
115 | 0001,0201,0201,0001,0201,0001,0001,0201, | |
116 | 0202,0004,0003,0205,0005,0206,0201,0001, | |
117 | 0201,0001,0001,0201,0001,0201,0201,0001, | |
118 | 0001,0201,0201,0001,0201,0001,0001,0201, | |
119 | 0200,0000,0000,0200,0000,0200,0200,0000, | |
120 | 0000,0200,0200,0000,0200,0000,0000,0200, | |
121 | 0000,0200,0200,0000,0200,0000,0000,0200, | |
122 | 0200,0000,0000,0200,0000,0200,0200,0000, | |
123 | 0200,0000,0000,0200,0000,0200,0200,0000, | |
124 | 0000,0200,0200,0000,0200,0000,0000,0200, | |
125 | 0000,0200,0200,0000,0200,0000,0000,0200, | |
126 | 0200,0000,0000,0200,0000,0200,0200,0000, | |
127 | 0000,0200,0200,0000,0200,0000,0000,0200, | |
128 | 0200,0000,0000,0200,0000,0200,0200,0000, | |
129 | 0200,0000,0000,0200,0000,0200,0200,0000, | |
130 | 0000,0200,0200,0000,0200,0000,0000,0201 | |
131 | }; | |
132 | ||
133 | main(argc, argv) | |
134 | char **argv; | |
135 | { | |
136 | register struct tab *tabp; | |
137 | char tname; | |
138 | ||
139 | /* | |
140 | signal(SIGINT, SIG_IGN); | |
141 | signal(SIGQUIT, SIG_DFL); | |
142 | */ | |
143 | tname = '0'; | |
144 | if (argc > 1) | |
145 | tname = argv[1][0]; | |
146 | for (;;) { | |
147 | for(tabp = itab; tabp < &itab[NITAB]; tabp++) | |
148 | if(tabp->tname == tname) | |
149 | break; | |
150 | if(tabp >= &itab[NITAB]) | |
151 | tabp = itab; | |
152 | tmode.sg_ispeed = tabp->ispeed; | |
153 | tmode.sg_ospeed = tabp->ospeed; | |
154 | tmode.sg_flags = tabp->iflags; | |
155 | tmode.sg_ispeed = tabp->ispeed; | |
156 | tmode.sg_ospeed = tabp->ospeed; | |
157 | stty(0, &tmode); | |
158 | puts(tabp->message); | |
159 | if(getname()) { | |
160 | tmode.sg_erase = ERASE; | |
161 | tmode.sg_kill = KILL; | |
162 | tmode.sg_flags = tabp->fflags; | |
163 | if(crmod) | |
164 | tmode.sg_flags |= CRMOD; | |
165 | if(upper) | |
166 | tmode.sg_flags |= LCASE; | |
167 | if(lower) | |
168 | tmode.sg_flags &= ~LCASE; | |
169 | stty(0, &tmode); | |
170 | putchr('\n'); | |
171 | execl("/bin/login", "login", name, 0); | |
172 | exit(1); | |
173 | } | |
174 | tname = tabp->nname; | |
175 | } | |
176 | } | |
177 | ||
178 | getname() | |
179 | { | |
180 | register char *np; | |
181 | register c; | |
182 | char cs; | |
183 | ||
184 | crmod = 0; | |
185 | upper = 0; | |
186 | lower = 0; | |
187 | np = name; | |
188 | for (;;) { | |
189 | if (read(0, &cs, 1) <= 0) | |
190 | exit(0); | |
191 | if ((c = cs&0177) == 0) | |
192 | return(0); | |
193 | if (c==EOT) | |
194 | exit(1); | |
195 | if (c=='\r' || c=='\n' || np >= &name[16]) | |
196 | break; | |
197 | putchr(cs); | |
198 | if (c>='a' && c <='z') | |
199 | lower++; | |
200 | else if (c>='A' && c<='Z') { | |
201 | upper++; | |
202 | c += 'a'-'A'; | |
203 | } else if (c==ERASE) { | |
204 | if (np > name) | |
205 | np--; | |
206 | continue; | |
207 | } else if (c==KILL) { | |
208 | putchr('\r'); | |
209 | putchr('\n'); | |
210 | np = name; | |
211 | continue; | |
212 | } else if(c == ' ') | |
213 | c = '_'; | |
214 | *np++ = c; | |
215 | } | |
216 | *np = 0; | |
217 | if (c == '\r') | |
218 | crmod++; | |
219 | return(1); | |
220 | } | |
221 | ||
222 | puts(as) | |
223 | char *as; | |
224 | { | |
225 | register char *s; | |
226 | ||
227 | s = as; | |
228 | while (*s) | |
229 | putchr(*s++); | |
230 | } | |
231 | ||
232 | putchr(cc) | |
233 | { | |
234 | char c; | |
235 | c = cc; | |
236 | c |= partab[c&0177] & 0200; | |
237 | write(1, &c, 1); | |
238 | } |