|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)main.c 4.5 (Berkeley) 83/08/01"; ! 3: #endif ! 4: ! 5: /* ! 6: * getty -- adapt to terminal speed on dialup, and call login ! 7: * ! 8: * Melbourne getty, June 83, kre. ! 9: */ ! 10: ! 11: #include <sgtty.h> ! 12: #include <signal.h> ! 13: #include <ctype.h> ! 14: #include <setjmp.h> ! 15: #include "gettytab.h" ! 16: ! 17: struct sgttyb tmode = { ! 18: 0, 0, CERASE, CKILL, 0 ! 19: }; ! 20: struct tchars tc = { ! 21: CINTR, CQUIT, CSTART, ! 22: CSTOP, CEOF, CBRK, ! 23: }; ! 24: struct ltchars ltc = { ! 25: CSUSP, CDSUSP, CRPRNT, ! 26: CFLUSH, CWERASE, CLNEXT ! 27: }; ! 28: ! 29: int crmod; ! 30: int upper; ! 31: int lower; ! 32: int digit; ! 33: ! 34: char hostname[32]; ! 35: char name[16]; ! 36: char *portselector(); ! 37: ! 38: #define OBUFSIZ 128 ! 39: #define TABBUFSIZ 512 ! 40: ! 41: char defent[TABBUFSIZ]; ! 42: char defstrs[TABBUFSIZ]; ! 43: char tabent[TABBUFSIZ]; ! 44: char tabstrs[TABBUFSIZ]; ! 45: ! 46: char *env[128]; ! 47: ! 48: char partab[] = { ! 49: 0001,0201,0201,0001,0201,0001,0001,0201, ! 50: 0202,0004,0003,0205,0005,0206,0201,0001, ! 51: 0201,0001,0001,0201,0001,0201,0201,0001, ! 52: 0001,0201,0201,0001,0201,0001,0001,0201, ! 53: 0200,0000,0000,0200,0000,0200,0200,0000, ! 54: 0000,0200,0200,0000,0200,0000,0000,0200, ! 55: 0000,0200,0200,0000,0200,0000,0000,0200, ! 56: 0200,0000,0000,0200,0000,0200,0200,0000, ! 57: 0200,0000,0000,0200,0000,0200,0200,0000, ! 58: 0000,0200,0200,0000,0200,0000,0000,0200, ! 59: 0000,0200,0200,0000,0200,0000,0000,0200, ! 60: 0200,0000,0000,0200,0000,0200,0200,0000, ! 61: 0000,0200,0200,0000,0200,0000,0000,0200, ! 62: 0200,0000,0000,0200,0000,0200,0200,0000, ! 63: 0200,0000,0000,0200,0000,0200,0200,0000, ! 64: 0000,0200,0200,0000,0200,0000,0000,0201 ! 65: }; ! 66: ! 67: #define ERASE tmode.sg_erase ! 68: #define KILL tmode.sg_kill ! 69: #define EOT tc.t_eofc ! 70: ! 71: jmp_buf timeout; ! 72: ! 73: dingdong() ! 74: { ! 75: ! 76: alarm(0); ! 77: signal(SIGALRM, SIG_DFL); ! 78: longjmp(timeout, 1); ! 79: } ! 80: ! 81: jmp_buf intrupt; ! 82: ! 83: interrupt() ! 84: { ! 85: ! 86: signal(SIGINT, interrupt); ! 87: longjmp(intrupt, 1); ! 88: } ! 89: ! 90: main(argc, argv) ! 91: char *argv[]; ! 92: { ! 93: char *tname; ! 94: long allflags; ! 95: ! 96: signal(SIGINT, SIG_IGN); ! 97: /* ! 98: signal(SIGQUIT, SIG_DFL); ! 99: */ ! 100: gethostname(hostname, sizeof(hostname)); ! 101: if (hostname[0] == '\0') ! 102: strcpy(hostname, "Amnesiac"); ! 103: gettable("default", defent, defstrs); ! 104: gendefaults(); ! 105: tname = "default"; ! 106: if (argc > 1) ! 107: tname = argv[1]; ! 108: for (;;) { ! 109: int ldisp = OTTYDISC; ! 110: ! 111: gettable(tname, tabent, tabstrs); ! 112: if (OPset || EPset || APset) ! 113: APset++, OPset++, EPset++; ! 114: setdefaults(); ! 115: ioctl(0, TIOCFLUSH, 0); /* clear out the crap */ ! 116: if (IS) ! 117: tmode.sg_ispeed = speed(IS); ! 118: else if (SP) ! 119: tmode.sg_ispeed = speed(SP); ! 120: if (OS) ! 121: tmode.sg_ospeed = speed(OS); ! 122: else if (SP) ! 123: tmode.sg_ospeed = speed(SP); ! 124: tmode.sg_flags = setflags(0); ! 125: ioctl(0, TIOCSETP, &tmode); ! 126: setchars(); ! 127: ioctl(0, TIOCSETC, &tc); ! 128: ioctl(0, TIOCSETD, &ldisp); ! 129: if (HC) ! 130: ioctl(0, TIOCHPCL, 0); ! 131: if (PS) { ! 132: tname = portselector(); ! 133: continue; ! 134: } ! 135: if (CL && *CL) ! 136: putpad(CL); ! 137: edithost(HE); ! 138: if (IM && *IM) ! 139: putf(IM); ! 140: if (setjmp(timeout)) { ! 141: tmode.sg_ispeed = tmode.sg_ospeed = 0; ! 142: ioctl(0, TIOCSETP, &tmode); ! 143: exit(1); ! 144: } ! 145: if (TO) { ! 146: signal(SIGALRM, dingdong); ! 147: alarm(TO); ! 148: } ! 149: if (getname()) { ! 150: alarm(0); ! 151: signal(SIGALRM, SIG_DFL); ! 152: if (!(upper || lower || digit)) ! 153: continue; ! 154: allflags = setflags(2); ! 155: tmode.sg_flags = allflags & 0xffff; ! 156: allflags >>= 16; ! 157: if (crmod || NL) ! 158: tmode.sg_flags |= CRMOD; ! 159: if (upper || UC) ! 160: tmode.sg_flags |= LCASE; ! 161: if (lower || LC) ! 162: tmode.sg_flags &= ~LCASE; ! 163: ioctl(0, TIOCSETP, &tmode); ! 164: ioctl(0, TIOCSLTC, <c); ! 165: ioctl(0, TIOCLSET, &allflags); ! 166: putchr('\n'); ! 167: oflush(); ! 168: makeenv(env); ! 169: signal(SIGINT, SIG_DFL); ! 170: execle(LO, "login", name, (char *)0, env); ! 171: exit(1); ! 172: } ! 173: alarm(0); ! 174: signal(SIGALRM, SIG_DFL); ! 175: signal(SIGINT, SIG_IGN); ! 176: if (NX && *NX) ! 177: tname = NX; ! 178: } ! 179: } ! 180: ! 181: getname() ! 182: { ! 183: register char *np; ! 184: register c; ! 185: char cs; ! 186: ! 187: /* ! 188: * Interrupt may happen if we use CBREAK mode ! 189: */ ! 190: if (setjmp(intrupt)) { ! 191: signal(SIGINT, SIG_IGN); ! 192: return (0); ! 193: } ! 194: signal(SIGINT, interrupt); ! 195: tmode.sg_flags = setflags(0); ! 196: ioctl(0, TIOCSETP, &tmode); ! 197: tmode.sg_flags = setflags(1); ! 198: prompt(); ! 199: if (PF > 0) { ! 200: oflush(); ! 201: sleep(PF); ! 202: PF = 0; ! 203: } ! 204: ioctl(0, TIOCSETP, &tmode); ! 205: crmod = 0; ! 206: upper = 0; ! 207: lower = 0; ! 208: digit = 0; ! 209: np = name; ! 210: for (;;) { ! 211: oflush(); ! 212: if (read(0, &cs, 1) <= 0) ! 213: exit(0); ! 214: if ((c = cs&0177) == 0) ! 215: return (0); ! 216: if (c == EOT) ! 217: exit(1); ! 218: if (c == '\r' || c == '\n' || np >= &name[16]) ! 219: break; ! 220: ! 221: if (c >= 'a' && c <= 'z') ! 222: lower++; ! 223: else if (c >= 'A' && c <= 'Z') { ! 224: upper++; ! 225: } else if (c == ERASE || c == '#' || c == '\b') { ! 226: if (np > name) { ! 227: np--; ! 228: if (tmode.sg_ospeed >= B1200) ! 229: puts("\b \b"); ! 230: else ! 231: putchr(cs); ! 232: } ! 233: continue; ! 234: } else if (c == KILL || c == '@') { ! 235: putchr(cs); ! 236: putchr('\r'); ! 237: if (tmode.sg_ospeed < B1200) ! 238: putchr('\n'); ! 239: /* this is the way they do it down under ... */ ! 240: else if (np > name) ! 241: puts(" \r"); ! 242: prompt(); ! 243: np = name; ! 244: continue; ! 245: } else if (c == ' ') ! 246: c = '_'; ! 247: else if (c >= '0' && c <= '9') ! 248: digit++; ! 249: if (IG && (c < ' ' || c > 0176)) ! 250: continue; ! 251: *np++ = c; ! 252: putchr(cs); ! 253: } ! 254: signal(SIGINT, SIG_IGN); ! 255: *np = 0; ! 256: if (c == '\r') ! 257: crmod++; ! 258: if (upper && !lower && !LC || UC) ! 259: for (np = name; *np; np++) ! 260: if (isupper(*np)) ! 261: *np = tolower(*np); ! 262: return (1); ! 263: } ! 264: ! 265: static ! 266: short tmspc10[] = { ! 267: 0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5, 15 ! 268: }; ! 269: ! 270: putpad(s) ! 271: register char *s; ! 272: { ! 273: register pad = 0; ! 274: register mspc10; ! 275: ! 276: if (isdigit(*s)) { ! 277: while (isdigit(*s)) { ! 278: pad *= 10; ! 279: pad += *s++ - '0'; ! 280: } ! 281: pad *= 10; ! 282: if (*s == '.' && isdigit(s[1])) { ! 283: pad += s[1] - '0'; ! 284: s += 2; ! 285: } ! 286: } ! 287: ! 288: puts(s); ! 289: /* ! 290: * If no delay needed, or output speed is ! 291: * not comprehensible, then don't try to delay. ! 292: */ ! 293: if (pad == 0) ! 294: return; ! 295: if (tmode.sg_ospeed <= 0 || ! 296: tmode.sg_ospeed >= (sizeof tmspc10 / sizeof tmspc10[0])) ! 297: return; ! 298: ! 299: /* ! 300: * Round up by a half a character frame, ! 301: * and then do the delay. ! 302: * Too bad there are no user program accessible programmed delays. ! 303: * Transmitting pad characters slows many ! 304: * terminals down and also loads the system. ! 305: */ ! 306: mspc10 = tmspc10[tmode.sg_ospeed]; ! 307: pad += mspc10 / 2; ! 308: for (pad /= mspc10; pad > 0; pad--) ! 309: putchr(*PC); ! 310: } ! 311: ! 312: puts(s) ! 313: register char *s; ! 314: { ! 315: ! 316: while (*s) ! 317: putchr(*s++); ! 318: } ! 319: ! 320: char outbuf[OBUFSIZ]; ! 321: int obufcnt = 0; ! 322: ! 323: putchr(cc) ! 324: { ! 325: char c; ! 326: ! 327: c = cc; ! 328: c |= partab[c&0177] & 0200; ! 329: if (OP) ! 330: c ^= 0200; ! 331: if (!UB) { ! 332: outbuf[obufcnt++] = c; ! 333: if (obufcnt >= OBUFSIZ) ! 334: oflush(); ! 335: } else ! 336: write(1, &c, 1); ! 337: } ! 338: ! 339: oflush() ! 340: { ! 341: if (obufcnt) ! 342: write(1, outbuf, obufcnt); ! 343: obufcnt = 0; ! 344: } ! 345: ! 346: prompt() ! 347: { ! 348: ! 349: putf(LM); ! 350: if (CO) ! 351: putchr('\n'); ! 352: } ! 353: ! 354: putf(cp) ! 355: register char *cp; ! 356: { ! 357: extern char editedhost[]; ! 358: ! 359: while (*cp) { ! 360: if (*cp != '%') { ! 361: putchr(*cp++); ! 362: continue; ! 363: } ! 364: switch (*++cp) { ! 365: ! 366: case 'h': ! 367: puts(editedhost); ! 368: break; ! 369: ! 370: case '%': ! 371: putchr('%'); ! 372: break; ! 373: } ! 374: cp++; ! 375: } ! 376: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.