1: # 2: /* 3: * getty -- adapt to terminal speed on dialup, and call login 4: */ 5: 6: #include <sgtty.h> 7: #include <signal.h> 8: #define ERASE '#' 9: #define KILL '@' 10: 11: struct sgttyb tmode; 12: struct tchars tchars = { '\177', '\034', '\021', '\023', '\004', '\377' }; 13: 14: struct tab { 15: char tname; /* this table name */ 16: char nname; /* successor table name */ 17: int iflags; /* initial flags */ 18: int fflags; /* final flags */ 19: int ispeed; /* input speed */ 20: int ospeed; /* output speed */ 21: char *message; /* login message */ 22: } itab[] = { 23: 24: /* table '0'-1-2-3 300,1200,150,110 */ 25: 26: '0', 1, 27: ANYP+RAW+NL1+CR1, ANYP+ECHO+CR1, 28: B300, B300, 29: "\n\r\033;\007login: ", 30: 31: 1, 2, 32: ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1, 33: B1200, B1200, 34: "\n\r\033;login: ", 35: 36: 2, 3, 37: ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1, 38: B150, B150, 39: "\n\r\033:\006\006\017login: ", 40: 41: 3, '0', 42: ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1, 43: B110, B110, 44: "\n\rlogin: ", 45: 46: /* table '-' -- Console TTY 110 */ 47: '-', '-', 48: ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1, 49: B110, B110, 50: "\n\rlogin: ", 51: 52: /* table '1' -- 150 */ 53: '1', '1', 54: ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1, 55: B150, B150, 56: "\n\r\033:\006\006\017login: ", 57: 58: /* table '2' -- 9600 */ 59: '2', '2', 60: ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1, 61: B9600, B9600, 62: "\n\r\033;login: ", 63: 64: /* table '3'-'5' -- 1200,300 */ 65: '3', '5', 66: ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1, 67: B1200, B1200, 68: "\n\r\033;login: ", 69: 70: /* table '5'-'3' -- 300,1200 */ 71: '5', '3', 72: ANYP+RAW+NL1+CR1, ANYP+ECHO+CR1, 73: B300, B300, 74: "\n\r\033;\007login: ", 75: 76: /* table '4' -- Console Decwriter */ 77: '4', '4', 78: ANYP+RAW, ANYP+ECHO+CRMOD+XTABS, 79: B300, B300, 80: "\n\rlogin: ", 81: 82: /* table 'i' -- Interdata Console */ 83: 'i', 'i', 84: RAW+CRMOD, CRMOD+ECHO+LCASE, 85: 0, 0, 86: "\n\rlogin: ", 87: 88: /* table 'l' -- LSI Chess Terminal */ 89: 'l', 'l', 90: ANYP+RAW/*+HUPCL*/, ANYP+ECHO/*+HUPCL*/, 91: B300, B300, 92: "*", 93: /* table '6' -- 2400 11/23 line */ 94: '6', '6', 95: ANYP+RAW+NL1+CR1, ANYP+ECHO, 96: B2400, B2400, 97: "\n\rlogin: ", 98: 99: }; 100: 101: #define NITAB sizeof itab/sizeof itab[0] 102: #define EOT 04 /* EOT char */ 103: 104: char name[16]; 105: int crmod; 106: int upper; 107: int lower; 108: 109: char partab[] = { 110: 0001,0201,0201,0001,0201,0001,0001,0201, 111: 0202,0004,0003,0205,0005,0206,0201,0001, 112: 0201,0001,0001,0201,0001,0201,0201,0001, 113: 0001,0201,0201,0001,0201,0001,0001,0201, 114: 0200,0000,0000,0200,0000,0200,0200,0000, 115: 0000,0200,0200,0000,0200,0000,0000,0200, 116: 0000,0200,0200,0000,0200,0000,0000,0200, 117: 0200,0000,0000,0200,0000,0200,0200,0000, 118: 0200,0000,0000,0200,0000,0200,0200,0000, 119: 0000,0200,0200,0000,0200,0000,0000,0200, 120: 0000,0200,0200,0000,0200,0000,0000,0200, 121: 0200,0000,0000,0200,0000,0200,0200,0000, 122: 0000,0200,0200,0000,0200,0000,0000,0200, 123: 0200,0000,0000,0200,0000,0200,0200,0000, 124: 0200,0000,0000,0200,0000,0200,0200,0000, 125: 0000,0200,0200,0000,0200,0000,0000,0201 126: }; 127: 128: main(argc, argv) 129: char **argv; 130: { 131: register struct tab *tabp; 132: int tname; 133: 134: tname = '0'; 135: if (argc > 1) 136: tname = argv[1][0]; 137: switch (tname) { 138: 139: case '3': /* adapt to connect speed (212) */ 140: ioctl(0, TIOCGETP, &tmode); 141: if (tmode.sg_ispeed==B300) 142: tname = '0'; 143: else 144: tname = '3'; 145: break; 146: } 147: for (;;) { 148: for(tabp = itab; tabp < &itab[NITAB]; tabp++) 149: if(tabp->tname == tname) 150: break; 151: if(tabp >= &itab[NITAB]) 152: tabp = itab; 153: tmode.sg_flags = tabp->iflags; 154: tmode.sg_ispeed = tabp->ispeed; 155: tmode.sg_ospeed = tabp->ospeed; 156: ioctl(0, TIOCSETP, &tmode); 157: ioctl(0, TIOCSETC, &tchars); 158: puts(tabp->message); 159: if(getname()) { 160: tmode.sg_erase = ERASE; 161: tmode.sg_kill = KILL; 162: tmode.sg_flags = tabp->fflags; 163: if(crmod) 164: tmode.sg_flags |= CRMOD; 165: if(upper) 166: tmode.sg_flags |= LCASE; 167: if(lower) 168: tmode.sg_flags &= ~LCASE; 169: stty(0, &tmode); 170: putchr('\n'); 171: execl("/bin/login", "login", name, 0); 172: exit(1); 173: } 174: tname = tabp->nname; 175: } 176: } 177: 178: getname() 179: { 180: register char *np; 181: register c; 182: char cs; 183: 184: crmod = 0; 185: upper = 0; 186: lower = 0; 187: np = name; 188: for (;;) { 189: if (read(0, &cs, 1) <= 0) 190: exit(0); 191: if ((c = cs&0177) == 0) 192: return(0); 193: if (c==EOT) 194: exit(1); 195: if (c=='\r' || c=='\n' || np >= &name[16]) 196: break; 197: putchr(cs); 198: if (c>='a' && c <='z') 199: lower++; 200: else if (c>='A' && c<='Z') { 201: upper++; 202: c += 'a'-'A'; 203: } else if (c==ERASE) { 204: if (np > name) 205: np--; 206: continue; 207: } else if (c==KILL) { 208: putchr('\r'); 209: putchr('\n'); 210: np = name; 211: continue; 212: } else if(c == ' ') 213: c = '_'; 214: *np++ = c; 215: } 216: *np = 0; 217: if (c == '\r') 218: crmod++; 219: return(1); 220: } 221: 222: puts(as) 223: char *as; 224: { 225: register char *s; 226: 227: s = as; 228: while (*s) 229: putchr(*s++); 230: } 231: 232: putchr(cc) 233: { 234: char c; 235: c = cc; 236: c |= partab[c&0177] & 0200; 237: write(1, &c, 1); 238: }