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