|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)subr.c 4.2 (Berkeley) 83/07/07"; ! 3: #endif ! 4: ! 5: /* ! 6: * Melbourne getty. ! 7: */ ! 8: #include <sgtty.h> ! 9: #include "gettytab.h" ! 10: ! 11: extern struct sgttyb tmode; ! 12: extern struct tchars tc; ! 13: extern struct ltchars ltc; ! 14: ! 15: /* ! 16: * Get a table entry. ! 17: */ ! 18: gettable(name, buf, area) ! 19: char *name, *buf, *area; ! 20: { ! 21: register struct gettystrs *sp; ! 22: register struct gettynums *np; ! 23: register struct gettyflags *fp; ! 24: register n; ! 25: ! 26: hopcount = 0; /* new lookup, start fresh */ ! 27: if (getent(buf, name) != 1) ! 28: return; ! 29: ! 30: for (sp = gettystrs; sp->field; sp++) ! 31: sp->value = getstr(sp->field, &area); ! 32: for (np = gettynums; np->field; np++) { ! 33: n = getnum(np->field); ! 34: if (n == -1) ! 35: np->set = 0; ! 36: else { ! 37: np->set = 1; ! 38: np->value = n; ! 39: } ! 40: } ! 41: for (fp = gettyflags; fp->field; fp++) { ! 42: n = getflag(fp->field); ! 43: if (n == -1) ! 44: fp->set = 0; ! 45: else { ! 46: fp->set = 1; ! 47: fp->value = n ^ fp->invrt; ! 48: } ! 49: } ! 50: } ! 51: ! 52: gendefaults() ! 53: { ! 54: register struct gettystrs *sp; ! 55: register struct gettynums *np; ! 56: register struct gettyflags *fp; ! 57: ! 58: for (sp = gettystrs; sp->field; sp++) ! 59: if (sp->value) ! 60: sp->defalt = sp->value; ! 61: for (np = gettynums; np->field; np++) ! 62: if (np->set) ! 63: np->defalt = np->value; ! 64: for (fp = gettyflags; fp->field; fp++) ! 65: if (fp->set) ! 66: fp->defalt = fp->value; ! 67: else ! 68: fp->defalt = fp->invrt; ! 69: } ! 70: ! 71: setdefaults() ! 72: { ! 73: register struct gettystrs *sp; ! 74: register struct gettynums *np; ! 75: register struct gettyflags *fp; ! 76: ! 77: for (sp = gettystrs; sp->field; sp++) ! 78: if (!sp->value) ! 79: sp->value = sp->defalt; ! 80: for (np = gettynums; np->field; np++) ! 81: if (!np->set) ! 82: np->value = np->defalt; ! 83: for (fp = gettyflags; fp->field; fp++) ! 84: if (!fp->set) ! 85: fp->value = fp->defalt; ! 86: } ! 87: ! 88: static char ** ! 89: charnames[] = { ! 90: &ER, &KL, &IN, &QU, &XN, &XF, &ET, &BK, ! 91: &SU, &DS, &RP, &FL, &WE, &LN, 0 ! 92: }; ! 93: ! 94: static char * ! 95: charvars[] = { ! 96: &tmode.sg_erase, &tmode.sg_kill, &tc.t_intrc, ! 97: &tc.t_quitc, &tc.t_startc, &tc.t_stopc, ! 98: &tc.t_eofc, &tc.t_brkc, <c.t_suspc, ! 99: <c.t_dsuspc, <c.t_rprntc, <c.t_flushc, ! 100: <c.t_werasc, <c.t_lnextc, 0 ! 101: }; ! 102: ! 103: setchars() ! 104: { ! 105: register int i; ! 106: register char *p; ! 107: ! 108: for (i = 0; charnames[i]; i++) { ! 109: p = *charnames[i]; ! 110: if (p && *p) ! 111: *charvars[i] = *p; ! 112: else ! 113: *charvars[i] = '\0377'; ! 114: } ! 115: } ! 116: ! 117: long ! 118: setflags(n) ! 119: { ! 120: register long f; ! 121: ! 122: switch (n) { ! 123: case 0: ! 124: if (F0set) ! 125: return(F0); ! 126: break; ! 127: case 1: ! 128: if (F1set) ! 129: return(F1); ! 130: break; ! 131: default: ! 132: if (F2set) ! 133: return(F2); ! 134: break; ! 135: } ! 136: ! 137: f = 0; ! 138: ! 139: if (AP) ! 140: f |= ANYP; ! 141: else if (OP) ! 142: f |= ODDP; ! 143: else if (EP) ! 144: f |= EVENP; ! 145: ! 146: if (UC) ! 147: f |= LCASE; ! 148: ! 149: if (NL) ! 150: f |= CRMOD; ! 151: ! 152: f |= delaybits(); ! 153: ! 154: if (n == 1) { /* read mode flags */ ! 155: if (RW) ! 156: f |= RAW; ! 157: else ! 158: f |= CBREAK; ! 159: return (f); ! 160: } ! 161: ! 162: if (!HT) ! 163: f |= XTABS; ! 164: ! 165: if (n == 0) ! 166: return (f); ! 167: ! 168: if (CB) ! 169: f |= CRTBS; ! 170: ! 171: if (CE) ! 172: f |= CRTERA; ! 173: ! 174: if (PE) ! 175: f |= PRTERA; ! 176: ! 177: if (EC) ! 178: f |= ECHO; ! 179: ! 180: if (XC) ! 181: f |= CTLECH; ! 182: ! 183: return (f); ! 184: } ! 185: ! 186: struct delayval { ! 187: unsigned delay; /* delay in ms */ ! 188: int bits; ! 189: }; ! 190: ! 191: /* ! 192: * below are random guesses, I can't be bothered checking ! 193: */ ! 194: ! 195: struct delayval crdelay[] = { ! 196: 1, CR1, ! 197: 2, CR2, ! 198: 3, CR3, ! 199: 83, CR1, ! 200: 166, CR2, ! 201: 0, CR3, ! 202: }; ! 203: ! 204: struct delayval nldelay[] = { ! 205: 1, NL1, /* special, calculated */ ! 206: 2, NL2, ! 207: 3, NL3, ! 208: 100, NL2, ! 209: 0, NL3, ! 210: }; ! 211: ! 212: struct delayval bsdelay[] = { ! 213: 1, BS1, ! 214: 0, 0, ! 215: }; ! 216: ! 217: struct delayval ffdelay[] = { ! 218: 1, FF1, ! 219: 1750, FF1, ! 220: 0, FF1, ! 221: }; ! 222: ! 223: struct delayval tbdelay[] = { ! 224: 1, TAB1, ! 225: 2, TAB2, ! 226: 3, XTABS, /* this is expand tabs */ ! 227: 100, TAB1, ! 228: 0, TAB2, ! 229: }; ! 230: ! 231: delaybits() ! 232: { ! 233: register f; ! 234: ! 235: f = adelay(CD, crdelay); ! 236: f |= adelay(ND, nldelay); ! 237: f |= adelay(FD, ffdelay); ! 238: f |= adelay(TD, tbdelay); ! 239: f |= adelay(BD, bsdelay); ! 240: return (f); ! 241: } ! 242: ! 243: adelay(ms, dp) ! 244: register ms; ! 245: register struct delayval *dp; ! 246: { ! 247: if (ms == 0) ! 248: return (0); ! 249: while (dp->delay && ms > dp->delay) ! 250: dp++; ! 251: return (dp->bits); ! 252: } ! 253: ! 254: char editedhost[32]; ! 255: ! 256: edithost(pat) ! 257: register char *pat; ! 258: { ! 259: register char *host = HN; ! 260: register char *res = editedhost; ! 261: ! 262: if (!pat) ! 263: pat = ""; ! 264: while (*pat) { ! 265: switch (*pat) { ! 266: ! 267: case '#': ! 268: if (*host) ! 269: host++; ! 270: break; ! 271: ! 272: case '@': ! 273: if (*host) ! 274: *res++ = *host++; ! 275: break; ! 276: ! 277: default: ! 278: *res++ = *pat; ! 279: break; ! 280: ! 281: } ! 282: if (res == &editedhost[sizeof editedhost - 1]) { ! 283: *res = '\0'; ! 284: return; ! 285: } ! 286: pat++; ! 287: } ! 288: if (*host) ! 289: strncpy(res, host, sizeof editedhost - (res - editedhost) - 1); ! 290: else ! 291: *res = '\0'; ! 292: editedhost[sizeof editedhost - 1] = '\0'; ! 293: } ! 294: ! 295: struct speedtab { ! 296: int speed; ! 297: int uxname; ! 298: } speedtab[] = { ! 299: 50, B50, ! 300: 75, B75, ! 301: 110, B110, ! 302: 134, B134, ! 303: 150, B150, ! 304: 200, B200, ! 305: 300, B300, ! 306: 600, B600, ! 307: 1200, B1200, ! 308: 1800, B1800, ! 309: 2400, B2400, ! 310: 4800, B4800, ! 311: 9600, B9600, ! 312: 19200, EXTA, ! 313: 19, EXTA, /* for people who say 19.2K */ ! 314: 38400, EXTB, ! 315: 38, EXTB, ! 316: 7200, EXTB, /* alternative */ ! 317: 0 ! 318: }; ! 319: ! 320: speed(val) ! 321: { ! 322: register struct speedtab *sp; ! 323: ! 324: if (val <= 15) ! 325: return(val); ! 326: ! 327: for (sp = speedtab; sp->speed; sp++) ! 328: if (sp->speed == val) ! 329: return (sp->uxname); ! 330: ! 331: return (B300); /* default in impossible cases */ ! 332: } ! 333: ! 334: makeenv(env) ! 335: char *env[]; ! 336: { ! 337: static char termbuf[128] = "TERM="; ! 338: register char *p, *q; ! 339: register char **ep; ! 340: char *index(); ! 341: ! 342: ep = env; ! 343: if (TT && *TT) { ! 344: strcat(termbuf, TT); ! 345: *ep++ = termbuf; ! 346: } ! 347: if (p = EV) { ! 348: q = p; ! 349: while (q = index(q, ',')) { ! 350: *q++ = '\0'; ! 351: *ep++ = p; ! 352: p = q; ! 353: } ! 354: if (*p) ! 355: *ep++ = p; ! 356: } ! 357: *ep = (char *)0; ! 358: } ! 359: ! 360: /* ! 361: * This speed select mechanism is written for the Develcon DATASWITCH. ! 362: * The Develcon sends a string of the form "B{speed}\n" at a predefined ! 363: * baud rate. This string indicates the user's actual speed. ! 364: * The routine below returns the terminal type mapped from derived speed. ! 365: */ ! 366: struct portselect { ! 367: char *ps_baud; ! 368: char *ps_type; ! 369: } portspeeds[] = { ! 370: { "B110", "std.110" }, ! 371: { "B134", "std.134" }, ! 372: { "B150", "std.150" }, ! 373: { "B300", "std.300" }, ! 374: { "B600", "std.600" }, ! 375: { "B1200", "std.1200" }, ! 376: { "B2400", "std.2400" }, ! 377: { "B4800", "std.4800" }, ! 378: { "B9600", "std.9600" }, ! 379: { 0 } ! 380: }; ! 381: ! 382: char * ! 383: portselector() ! 384: { ! 385: char c, baud[20], *type = "default"; ! 386: register struct portselect *ps; ! 387: int len; ! 388: ! 389: alarm(5*60); ! 390: for (len = 0; len < sizeof (baud) - 1; len++) { ! 391: if (read(0, &c, 1) <= 0) ! 392: break; ! 393: c &= 0177; ! 394: if (c == '\n' || c == '\r') ! 395: break; ! 396: if (c == 'B') ! 397: len = 0; /* in case of leading garbage */ ! 398: baud[len] = c; ! 399: } ! 400: baud[len] = '\0'; ! 401: for (ps = portspeeds; ps->ps_baud; ps++) ! 402: if (strcmp(ps->ps_baud, baud) == 0) { ! 403: type = ps->ps_type; ! 404: break; ! 405: } ! 406: sleep(2); /* wait for connection to complete */ ! 407: return (type); ! 408: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.