BSD 4 release
[unix-history] / usr / src / cmd / getty.c
CommitLineData
31cef89c 1static 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
22struct sgttyb tmode;
23
24struct 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
131char name[16];
132int crmod;
133int upper;
134int lower;
135
136char 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
155main(argc, argv)
156char **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
225getname()
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
269puts(as)
270char *as;
271{
272 register char *s;
273
274 s = as;
275 while (*s)
276 putchr(*s++);
277}
278
279putchr(cc)
280{
281 char c;
282 c = cc;
283 c |= partab[c&0177] & 0200;
284 write(1, &c, 1);
285}