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