Commit | Line | Data |
---|---|---|
ba2e86fc BJ |
1 | # |
2 | /* | |
3 | * getty -- adapt to terminal speed on dialup, and call login | |
4 | */ | |
5 | ||
6 | #include <sccs.h> | |
7 | ||
8 | SCCSID(%W%) | |
9 | ||
10 | #include <sgtty.h> | |
11 | #include <signal.h> | |
12 | #include <ident.h> | |
13 | ||
14 | #define ERASE '#' | |
15 | #define KILL '@' | |
16 | ||
17 | #define CEOT 004 | |
18 | #define CKILL '@' | |
19 | #define CQUIT 034 /* FS, cntl shift L */ | |
20 | #define CINTR 0177 /* DEL */ | |
21 | #define CSTOP 023 /* Stop output: ctl-s */ | |
22 | #define CSTART 021 /* Start output: ctl-q */ | |
23 | #define CBRK 0377 | |
24 | ||
25 | ||
26 | struct sgttyb tmode; | |
27 | ||
28 | struct tab { | |
29 | char tname; /* this table name */ | |
30 | char nname; /* successor table name */ | |
31 | int iflags; /* initial flags */ | |
32 | int fflags; /* final flags */ | |
33 | int ispeed; /* input speed */ | |
34 | int ospeed; /* output speed */ | |
35 | char *message; /* login message */ | |
36 | } itab[] = { | |
37 | ||
38 | /* table '0'-1-2-3 300,1200,150,110 */ | |
39 | ||
40 | '0', 1, | |
41 | ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+CR2, | |
42 | B300, B300, | |
43 | "\n\rlogin: ", | |
44 | ||
45 | 1, 2, | |
46 | ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1, | |
47 | B1200, B1200, | |
48 | "\n\rlogin: ", | |
49 | ||
50 | 2, 3, | |
51 | ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1, | |
52 | B150, B150, | |
53 | "\n\rlogin: ", | |
54 | ||
55 | 3, '0', | |
56 | ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1, | |
57 | B110, B110, | |
58 | "\n\rlogin: ", | |
59 | ||
60 | /* table '-' -- Console TTY 110 */ | |
61 | '-', '-', | |
62 | ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1, | |
63 | B110, B110, | |
64 | "\n\rlogin: ", | |
65 | ||
66 | /* table '1' -- 150 */ | |
67 | '1', '1', | |
68 | ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1, | |
69 | B150, B150, | |
70 | "\n\r\033:\006\006\017login: ", | |
71 | ||
72 | /* table '2' -- 9600 */ | |
73 | '2', '2', | |
74 | ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD, | |
75 | B9600, B9600, | |
76 | "\n\rlogin: ", | |
77 | ||
78 | /* table '3'-'5' -- 1200,300 */ | |
79 | '3', '5', | |
80 | ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1, | |
81 | B1200, B1200, | |
82 | "\n\rlogin: ", | |
83 | ||
84 | /* table '5'-'3' -- 300,1200 */ | |
85 | '5', '3', | |
86 | ANYP+RAW+NL1+CR1, ANYP+ECHO+CR1, | |
87 | B300, B300, | |
88 | "\n\rlogin: ", | |
89 | ||
90 | /* table '4' -- Console Decwriter */ | |
91 | '4', '4', | |
92 | ANYP+RAW, ANYP+ECHO+CRMOD+XTABS, | |
93 | B300, B300, | |
94 | "\n\rlogin: ", | |
95 | ||
96 | /* table '6' -- 2400 */ | |
97 | '6', '6' , | |
98 | ANYP+RAW , ANYP+ECHO+CRMOD , | |
99 | B2400 , B2400 , | |
100 | "\n\rlogin: ", | |
101 | ||
102 | /* table '7' - - 4800 */ | |
103 | '7' , '7' , | |
104 | ANYP+RAW , ANYP+ECHO+CRMOD , | |
105 | B4800 , B4800 , | |
106 | "\n\rlogin: " , | |
107 | ||
108 | /* table '8'-'9' - - 9600 - 300 */ | |
109 | '8', '9', | |
110 | ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD, | |
111 | B9600, B9600, | |
112 | "\n\rlogin: ", | |
113 | ||
114 | '9', '8', | |
115 | ANYP+RAW+NL1+CR2, ANYP+XTABS+ECHO+CRMOD+CR2, | |
116 | B300, B300, | |
117 | "\n\rlogin: ", | |
118 | ||
119 | /* table 'i' -- Interdata Console */ | |
120 | 'i', 'i', | |
121 | RAW+CRMOD, CRMOD+ECHO+LCASE, | |
122 | 0, 0, | |
123 | "\n\rlogin: ", | |
124 | ||
125 | /* table 'l' -- LSI Chess Terminal */ | |
126 | 'l', 'l', | |
127 | ANYP+RAW/*+HUPCL*/, ANYP+ECHO/*+HUPCL*/, | |
128 | B300, B300, | |
129 | "*", | |
130 | }; | |
131 | ||
132 | #define NITAB sizeof itab/sizeof itab[0] | |
133 | #define EOT 04 /* EOT char */ | |
134 | ||
135 | char name[16]; | |
136 | int crmod; | |
137 | int upper; | |
138 | int lower; | |
139 | ||
140 | char partab[] = { | |
141 | 0001,0201,0201,0001,0201,0001,0001,0201, | |
142 | 0202,0004,0003,0205,0005,0206,0201,0001, | |
143 | 0201,0001,0001,0201,0001,0201,0201,0001, | |
144 | 0001,0201,0201,0001,0201,0001,0001,0201, | |
145 | 0200,0000,0000,0200,0000,0200,0200,0000, | |
146 | 0000,0200,0200,0000,0200,0000,0000,0200, | |
147 | 0000,0200,0200,0000,0200,0000,0000,0200, | |
148 | 0200,0000,0000,0200,0000,0200,0200,0000, | |
149 | 0200,0000,0000,0200,0000,0200,0200,0000, | |
150 | 0000,0200,0200,0000,0200,0000,0000,0200, | |
151 | 0000,0200,0200,0000,0200,0000,0000,0200, | |
152 | 0200,0000,0000,0200,0000,0200,0200,0000, | |
153 | 0000,0200,0200,0000,0200,0000,0000,0200, | |
154 | 0200,0000,0000,0200,0000,0200,0200,0000, | |
155 | 0200,0000,0000,0200,0000,0200,0200,0000, | |
156 | 0000,0200,0200,0000,0200,0000,0000,0201 | |
157 | }; | |
158 | ||
159 | main(argc, argv) | |
160 | char **argv; | |
161 | { | |
162 | register struct tab *tabp; | |
163 | char tname; | |
164 | struct tchars tc; | |
165 | ||
166 | /* | |
167 | signal(SIGINT, 1); | |
168 | signal(SIGQUIT, 0); | |
169 | */ | |
170 | tname = '0'; | |
171 | if (argc > 1) | |
172 | tname = argv[1][0]; | |
173 | for (;;) { | |
174 | for(tabp = itab; tabp < &itab[NITAB]; tabp++) | |
175 | if(tabp->tname == tname) | |
176 | break; | |
177 | if(tabp >= &itab[NITAB]) | |
178 | tabp = itab; | |
179 | tmode.sg_ispeed = tabp->ispeed; | |
180 | tmode.sg_ospeed = tabp->ospeed; | |
181 | tmode.sg_flags = tabp->iflags; | |
182 | tmode.sg_ispeed = tabp->ispeed; | |
183 | tmode.sg_ospeed = tabp->ospeed; | |
184 | stty(0, &tmode); | |
185 | tc.t_intrc = CINTR; | |
186 | tc.t_quitc = CQUIT; | |
187 | tc.t_stopc = CSTOP; | |
188 | tc.t_startc = CSTART; | |
189 | tc.t_brkc = CBRK; | |
190 | tc.t_eofc = CEOT; | |
191 | ioctl(0, TIOCSETC, &tc); | |
192 | if (tmode.sg_ospeed > B1200) | |
193 | puts("\n\r\n\r"); | |
194 | else | |
195 | puts("\n\r\r\r\r\r\n\r\r\r\r\r"); | |
196 | puts("Virtual "); | |
197 | puts(myname); | |
198 | puts("\n\r\r\r\r"); | |
199 | puts(tabp->message); | |
200 | /* | |
201 | * Wait a while, then flush input to get rid | |
202 | * of noise from open lines | |
203 | */ | |
204 | sleep(1); | |
205 | stty(0, &tmode); | |
206 | if(getname()) { | |
207 | if (upper == 0 && lower == 0) | |
208 | continue; | |
209 | tmode.sg_erase = ERASE; | |
210 | tmode.sg_kill = KILL; | |
211 | tmode.sg_flags = tabp->fflags; | |
212 | if(crmod) | |
213 | tmode.sg_flags |= CRMOD; | |
214 | if(upper) | |
215 | tmode.sg_flags |= LCASE; | |
216 | if(lower) | |
217 | tmode.sg_flags &= ~LCASE; | |
218 | stty(0, &tmode); | |
219 | putchr('\n'); | |
220 | execl("/bin/login", "login", name, 0); | |
221 | exit(1); | |
222 | } | |
223 | tname = tabp->nname; | |
224 | } | |
225 | } | |
226 | ||
227 | getname() | |
228 | { | |
229 | register char *np; | |
230 | register c; | |
231 | char cs; | |
232 | ||
233 | crmod = 0; | |
234 | upper = 0; | |
235 | lower = 0; | |
236 | np = name; | |
237 | for (;;) { | |
238 | if (read(0, &cs, 1) <= 0) | |
239 | exit(0); | |
240 | if ((c = cs&0177) == 0) | |
241 | return(0); | |
242 | if (c==EOT) | |
243 | exit(1); | |
244 | if (c=='\r' || c=='\n' || np >= &name[16]) | |
245 | break; | |
246 | putchr(cs); | |
247 | if (c>='a' && c <='z') | |
248 | lower++; | |
249 | else if (c>='A' && c<='Z') { | |
250 | upper++; | |
251 | c += 'a'-'A'; | |
252 | } else if (c==ERASE) { | |
253 | if (np > name) | |
254 | np--; | |
255 | continue; | |
256 | } else if (c==KILL) { | |
257 | putchr('\r'); | |
258 | putchr('\n'); | |
259 | np = name; | |
260 | continue; | |
261 | } else if(c == ' ') | |
262 | c = '_'; | |
263 | *np++ = c; | |
264 | } | |
265 | *np = 0; | |
266 | if (c == '\r') | |
267 | crmod++; | |
268 | return(1); | |
269 | } | |
270 | ||
271 | puts(as) | |
272 | char *as; | |
273 | { | |
274 | register char *s; | |
275 | ||
276 | s = as; | |
277 | while (*s) | |
278 | putchr(*s++); | |
279 | } | |
280 | ||
281 | putchr(cc) | |
282 | { | |
283 | char c; | |
284 | c = cc; | |
285 | c |= partab[c&0177] & 0200; | |
286 | write(1, &c, 1); | |
287 | } |