|
|
1.1 root 1: /*
2: * getty -- adapt to terminal speed on dialup, and call login
3: */
4:
5: #include <sys/ttyio.h>
6: #include <signal.h>
7: #include <sys/utsname.h>
8:
9: #define ERASE '\b'
10: #define KILL '@'
11:
12: #define CEOT 004
13: #define CKILL '@'
14: #define CQUIT 034 /* FS, cntl shift L */
15: #define CINTR 0177 /* DEL */
16: #define CSTOP 023 /* Stop output: ctl-s */
17: #define CSTART 021 /* Start output: ctl-q */
18: #define CBRK 0377
19:
20: struct sgttyb tmode;
21: struct ttydevb tspeed;
22:
23: struct tab {
24: char tname; /* this table name */
25: char nname; /* successor table name */
26: int iflags; /* initial flags */
27: int fflags; /* final flags */
28: int ispeed; /* input speed */
29: int ospeed; /* output speed */
30: char *message; /* login message */
31: } itab[] = {
32:
33: /* table '0'-1-2-3 300,1200,150,110 */
34:
35: '0', 1,
36: ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+CR2,
37: B300, B300,
38: "login: ",
39:
40: 1, 2,
41: ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1,
42: B1200, B1200,
43: "login: ",
44:
45: 2, 3,
46: ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1,
47: B150, B150,
48: "login: ",
49:
50: 3, '0',
51: ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1,
52: B110, B110,
53: "login: ",
54:
55: /* table '2' -- 9600 */
56: '2', '2',
57: ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD,
58: B9600, B9600,
59: "login: ",
60:
61: /* table '3'-'5' -- 1200,300 */
62: '3', '5',
63: ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1,
64: B1200, B1200,
65: "login: ",
66:
67: /* table '5'-'3' -- 300,1200 */
68: '5', '3',
69: ANYP+RAW+NL1+CR1, ANYP+ECHO+CR1,
70: B300, B300,
71: "login: ",
72:
73: /* table '4' -- Console Decwriter */
74: '4', '4',
75: ANYP+CRMOD+CBREAK, ANYP+ECHO+CRMOD+XTABS,
76: B300, B300,
77: "login: ",
78:
79: /* table '6' -- 2400 */
80: '6', '6' ,
81: ANYP+RAW , ANYP+ECHO+CRMOD ,
82: B2400 , B2400 ,
83: "login: ",
84:
85: /* table '7' - - 4800 */
86: '7' , '7' ,
87: ANYP+RAW , ANYP+ECHO+CRMOD ,
88: B4800 , B4800 ,
89: "login: " ,
90:
91: /* table '8'-10-'9' - - 9600 - 1200 - 300 */
92: '8', 10,
93: ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD,
94: B9600, B9600,
95: "login: ",
96:
97: 10, '9',
98: ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1,
99: B1200, B1200,
100: "login: ",
101:
102: '9', '8',
103: ANYP+RAW+NL1+CR1, ANYP+ECHO+CR1,
104: B300, B300,
105: "login: ",
106:
107: /* table 'j' -- 19200 */
108: 'j', 'j',
109: ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD,
110: EXTA, EXTA,
111: "login: ",
112:
113: /* table 'a'-'b' - - 2400 - 1200 */
114: 'a', 'b',
115: ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD,
116: B2400, B2400,
117: "login: ",
118:
119: 'b', 'a',
120: ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD,
121: B1200, B1200,
122: "login: ",
123: };
124:
125:
126: #define NITAB sizeof itab/sizeof itab[0]
127: #define EOT 04 /* EOT char */
128:
129: char name[16];
130: int crmod;
131: int upper;
132: int lower;
133:
134: char partab[] = {
135: 0001,0201,0201,0001,0201,0001,0001,0201,
136: 0202,0004,0003,0205,0005,0206,0201,0001,
137: 0201,0001,0001,0201,0001,0201,0201,0001,
138: 0001,0201,0201,0001,0201,0001,0001,0201,
139: 0200,0000,0000,0200,0000,0200,0200,0000,
140: 0000,0200,0200,0000,0200,0000,0000,0200,
141: 0000,0200,0200,0000,0200,0000,0000,0200,
142: 0200,0000,0000,0200,0000,0200,0200,0000,
143: 0200,0000,0000,0200,0000,0200,0200,0000,
144: 0000,0200,0200,0000,0200,0000,0000,0200,
145: 0000,0200,0200,0000,0200,0000,0000,0200,
146: 0200,0000,0000,0200,0000,0200,0200,0000,
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,0201
151: };
152:
153: main(argc, argv)
154: char **argv;
155: {
156: register struct tab *tabp;
157: char tname;
158: struct tchars tc;
159: struct utsname myname;
160:
161: tname = '0';
162: if (argc > 1)
163: tname = argv[1][0];
164: for (;;) {
165: for(tabp = itab; tabp < &itab[NITAB]; tabp++)
166: if(tabp->tname == tname)
167: break;
168: if(tabp >= &itab[NITAB])
169: tabp = itab;
170: tmode.sg_ispeed = tabp->ispeed;
171: tmode.sg_ospeed = tabp->ospeed;
172: tmode.sg_flags = tabp->iflags;
173: tspeed.ispeed = tabp->ispeed;
174: tspeed.ospeed = tabp->ospeed;
175: tspeed.flags = tabp->iflags & ANYP;
176: ioctl(0, TIOCSETP, &tmode);
177: ioctl(0, TIOCSDEV, &tspeed);
178: tc.t_intrc = CINTR;
179: tc.t_quitc = CQUIT;
180: tc.t_stopc = CSTOP;
181: tc.t_startc = CSTART;
182: tc.t_brkc = CBRK;
183: tc.t_eofc = CEOT;
184: ioctl(0, TIOCSETC, &tc);
185: ioctl(0, TIOCNXCL, 0);
186: if (tmode.sg_ospeed > B1200)
187: puts("\n\r");
188: else
189: puts("\n\r\r\r\r\r");
190: uname(&myname);
191: puts(myname.nodename);
192: puts("\n\r\r\r");
193: puts(tabp->message);
194: if(getname()) {
195: if (upper == 0 && lower == 0)
196: continue;
197: tmode.sg_erase = ERASE;
198: tmode.sg_kill = KILL;
199: tmode.sg_flags = tabp->fflags;
200: if(crmod)
201: tmode.sg_flags |= CRMOD;
202: if(upper)
203: tmode.sg_flags |= LCASE;
204: if(lower)
205: tmode.sg_flags &= ~LCASE;
206: ioctl(0, TIOCSETP, &tmode);
207: putchr('\n');
208: execl("/etc/login", "login", name, 0);
209: exit(1);
210: }
211: tname = tabp->nname;
212: }
213: }
214:
215: getname()
216: {
217: register char *np;
218: register c;
219: char cs;
220:
221: crmod = 0;
222: upper = 0;
223: lower = 0;
224: np = name;
225: for (;;) {
226: if (read(0, &cs, 1) <= 0)
227: exit(0);
228: if ((c = cs&0177) == 0)
229: return(0);
230: if (c==EOT)
231: exit(1);
232: if (c=='\r' || c=='\n' || np >= &name[16])
233: break;
234: putchr(cs);
235: if (c>='a' && c <='z')
236: lower++;
237: else if (c>='A' && c<='Z') {
238: upper++;
239: c += 'a'-'A';
240: } else if (c==ERASE) {
241: if (np > name)
242: np--;
243: continue;
244: } else if (c==KILL) {
245: putchr('\r');
246: putchr('\n');
247: np = name;
248: continue;
249: }
250: *np++ = c;
251: }
252: *np = 0;
253: if (c == '\r')
254: crmod++;
255: return(1);
256: }
257:
258: puts(as)
259: char *as;
260: {
261: register char *s;
262:
263: s = as;
264: while (*s)
265: putchr(*s++);
266: }
267:
268: putchr(cc)
269: {
270: char c;
271: c = cc;
272: c |= partab[c&0177] & 0200;
273: write(1, &c, 1);
274: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.