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