|
|
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.