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