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