Research V7 development
[unix-history] / usr / src / cmd / getty.c
CommitLineData
41af962f
KT
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
11struct sgttyb tmode;
12struct tchars tchars = { '\177', '\034', '\021', '\023', '\004', '\377' };
13
14struct tab {
15 char tname; /* this table name */
16 char nname; /* successor table name */
17 int iflags; /* initial flags */
18 int fflags; /* final flags */
19 int ispeed; /* input speed */
20 int ospeed; /* output speed */
21 char *message; /* login message */
22} itab[] = {
23
24/* table '0'-1-2-3 300,1200,150,110 */
25
26 '0', 1,
27 ANYP+RAW+NL1+CR1, ANYP+ECHO+CR1,
28 B300, B300,
29 "\n\r\033;\007login: ",
30
31 1, 2,
32 ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1,
33 B1200, B1200,
34 "\n\r\033;login: ",
35
36 2, 3,
37 ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1,
38 B150, B150,
39 "\n\r\033:\006\006\017login: ",
40
41 3, '0',
42 ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1,
43 B110, B110,
44 "\n\rlogin: ",
45
46/* table '-' -- Console TTY 110 */
47 '-', '-',
48 ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1,
49 B110, B110,
50 "\n\rlogin: ",
51
52/* table '1' -- 150 */
53 '1', '1',
54 ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1,
55 B150, B150,
56 "\n\r\033:\006\006\017login: ",
57
58/* table '2' -- 9600 */
59 '2', '2',
60 ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1,
61 B9600, B9600,
62 "\n\r\033;login: ",
63
64/* table '3'-'5' -- 1200,300 */
65 '3', '5',
66 ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1,
67 B1200, B1200,
68 "\n\r\033;login: ",
69
70/* table '5'-'3' -- 300,1200 */
71 '5', '3',
72 ANYP+RAW+NL1+CR1, ANYP+ECHO+CR1,
73 B300, B300,
74 "\n\r\033;\007login: ",
75
76/* table '4' -- Console Decwriter */
77 '4', '4',
78 ANYP+RAW, ANYP+ECHO+CRMOD+XTABS,
79 B300, B300,
80 "\n\rlogin: ",
81
82/* table 'i' -- Interdata Console */
83 'i', 'i',
84 RAW+CRMOD, CRMOD+ECHO+LCASE,
85 0, 0,
86 "\n\rlogin: ",
87
88/* table 'l' -- LSI Chess Terminal */
89 'l', 'l',
90 ANYP+RAW/*+HUPCL*/, ANYP+ECHO/*+HUPCL*/,
91 B300, B300,
92 "*",
93/* table '6' -- 2400 11/23 line */
94 '6', '6',
95 ANYP+RAW+NL1+CR1, ANYP+ECHO,
96 B2400, B2400,
97 "\n\rlogin: ",
98
99};
100
101#define NITAB sizeof itab/sizeof itab[0]
102#define EOT 04 /* EOT char */
103
104char name[16];
105int crmod;
106int upper;
107int lower;
108
109char partab[] = {
110 0001,0201,0201,0001,0201,0001,0001,0201,
111 0202,0004,0003,0205,0005,0206,0201,0001,
112 0201,0001,0001,0201,0001,0201,0201,0001,
113 0001,0201,0201,0001,0201,0001,0001,0201,
114 0200,0000,0000,0200,0000,0200,0200,0000,
115 0000,0200,0200,0000,0200,0000,0000,0200,
116 0000,0200,0200,0000,0200,0000,0000,0200,
117 0200,0000,0000,0200,0000,0200,0200,0000,
118 0200,0000,0000,0200,0000,0200,0200,0000,
119 0000,0200,0200,0000,0200,0000,0000,0200,
120 0000,0200,0200,0000,0200,0000,0000,0200,
121 0200,0000,0000,0200,0000,0200,0200,0000,
122 0000,0200,0200,0000,0200,0000,0000,0200,
123 0200,0000,0000,0200,0000,0200,0200,0000,
124 0200,0000,0000,0200,0000,0200,0200,0000,
125 0000,0200,0200,0000,0200,0000,0000,0201
126};
127
128main(argc, argv)
129char **argv;
130{
131 register struct tab *tabp;
132 int tname;
133
134 tname = '0';
135 if (argc > 1)
136 tname = argv[1][0];
137 switch (tname) {
138
139 case '3': /* adapt to connect speed (212) */
140 ioctl(0, TIOCGETP, &tmode);
141 if (tmode.sg_ispeed==B300)
142 tname = '0';
143 else
144 tname = '3';
145 break;
146 }
147 for (;;) {
148 for(tabp = itab; tabp < &itab[NITAB]; tabp++)
149 if(tabp->tname == tname)
150 break;
151 if(tabp >= &itab[NITAB])
152 tabp = itab;
153 tmode.sg_flags = tabp->iflags;
154 tmode.sg_ispeed = tabp->ispeed;
155 tmode.sg_ospeed = tabp->ospeed;
156 ioctl(0, TIOCSETP, &tmode);
157 ioctl(0, TIOCSETC, &tchars);
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
178getname()
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
222puts(as)
223char *as;
224{
225 register char *s;
226
227 s = as;
228 while (*s)
229 putchr(*s++);
230}
231
232putchr(cc)
233{
234 char c;
235 c = cc;
236 c |= partab[c&0177] & 0200;
237 write(1, &c, 1);
238}