|
|
1.1 root 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:
26: struct sgttyb tmode;
27:
28: struct 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:
135: char name[16];
136: int crmod;
137: int upper;
138: int lower;
139:
140: char 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:
159: main(argc, argv)
160: char **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:
227: getname()
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:
271: puts(as)
272: char *as;
273: {
274: register char *s;
275:
276: s = as;
277: while (*s)
278: putchr(*s++);
279: }
280:
281: putchr(cc)
282: {
283: char c;
284: c = cc;
285: c |= partab[c&0177] & 0200;
286: write(1, &c, 1);
287: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.