|
|
1.1 root 1: static char *sccsid = "@(#)getty.c 4.1 (Berkeley) 10/1/80";
2: /*
3: * getty -- adapt to terminal speed on dialup, and call login
4: */
5:
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 (;;) {
170: int ldisp = 0;
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);
189: ioctl(0, TIOCSETD, &ldisp);
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.