BSD 3 development
[unix-history] / usr / src / cmd / getty.vm.c
CommitLineData
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
26struct sgttyb tmode;
27
28struct 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
135char name[16];
136int crmod;
137int upper;
138int lower;
139
140char 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
159main(argc, argv)
160char **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
227getname()
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
271puts(as)
272char *as;
273{
274 register char *s;
275
276 s = as;
277 while (*s)
278 putchr(*s++);
279}
280
281putchr(cc)
282{
283 char c;
284 c = cc;
285 c |= partab[c&0177] & 0200;
286 write(1, &c, 1);
287}