|
|
1.1 ! root 1: #ifndef lint ! 2: static char *sccsid ="@(#)stty.c 4.14 (Berkeley) 7/6/83"; ! 3: #endif ! 4: /* ! 5: * set teletype modes ! 6: */ ! 7: ! 8: #include <stdio.h> ! 9: #include <sgtty.h> ! 10: ! 11: struct ! 12: { ! 13: char *string; ! 14: int speed; ! 15: } speeds[] = { ! 16: "0", B0, ! 17: "50", B50, ! 18: "75", B75, ! 19: "110", B110, ! 20: "134", B134, ! 21: "134.5",B134, ! 22: "150", B150, ! 23: "200", B200, ! 24: "300", B300, ! 25: "600", B600, ! 26: "1200", B1200, ! 27: "1800", B1800, ! 28: "2400", B2400, ! 29: "4800", B4800, ! 30: "9600", B9600, ! 31: "exta", EXTA, ! 32: "19200", EXTA, ! 33: "extb", EXTB, ! 34: "38400", EXTB, ! 35: 0, ! 36: }; ! 37: struct ! 38: { ! 39: char *string; ! 40: int numbits; ! 41: } stopbits[] = { ! 42: "1", STOP1, ! 43: "2", STOP2, ! 44: "3", STOP3, ! 45: 0, ! 46: }; ! 47: struct ! 48: { ! 49: char *string; ! 50: int set; ! 51: int reset; ! 52: int lset; ! 53: int lreset; ! 54: } modes[] = { ! 55: "even", EVENP, 0, 0, 0, ! 56: "-even", 0, EVENP, 0, 0, ! 57: "odd", ODDP, 0, 0, 0, ! 58: "-odd", 0, ODDP, 0, 0, ! 59: "raw", RAW, 0, 0, 0, ! 60: "-raw", 0, RAW, 0, 0, ! 61: "cooked", 0, RAW, 0, 0, ! 62: "-nl", CRMOD, 0, 0, 0, ! 63: "nl", 0, CRMOD, 0, 0, ! 64: "echo", ECHO, 0, 0, 0, ! 65: "-echo", 0, ECHO, 0, 0, ! 66: "LCASE", LCASE, 0, 0, 0, ! 67: "lcase", LCASE, 0, 0, 0, ! 68: "-LCASE", 0, LCASE, 0, 0, ! 69: "-lcase", 0, LCASE, 0, 0, ! 70: "-tabs", XTABS, 0, 0, 0, ! 71: "tabs", 0, XTABS, 0, 0, ! 72: "tandem", TANDEM, 0, 0, 0, ! 73: "-tandem", 0, TANDEM, 0, 0, ! 74: "cbreak", CBREAK, 0, 0, 0, ! 75: "-cbreak", 0, CBREAK, 0, 0, ! 76: "cr0", CR0, CR3, 0, 0, ! 77: "cr1", CR1, CR3, 0, 0, ! 78: "cr2", CR2, CR3, 0, 0, ! 79: "cr3", CR3, CR3, 0, 0, ! 80: "tab0", TAB0, XTABS, 0, 0, ! 81: "tab1", TAB1, XTABS, 0, 0, ! 82: "tab2", TAB2, XTABS, 0, 0, ! 83: "nl0", NL0, NL3, 0, 0, ! 84: "nl1", NL1, NL3, 0, 0, ! 85: "nl2", NL2, NL3, 0, 0, ! 86: "nl3", NL3, NL3, 0, 0, ! 87: "ff0", FF0, FF1, 0, 0, ! 88: "ff1", FF1, FF1, 0, 0, ! 89: "bs0", BS0, BS1, 0, 0, ! 90: "bs1", BS1, BS1, 0, 0, ! 91: "33", CR1, ALLDELAY, 0, 0, ! 92: "tty33", CR1, ALLDELAY, 0, 0, ! 93: "37", FF1+CR2+TAB1+NL1, ALLDELAY, 0, 0, ! 94: "tty37", FF1+CR2+TAB1+NL1, ALLDELAY, 0, 0, ! 95: "05", NL2, ALLDELAY, 0, 0, ! 96: "vt05", NL2, ALLDELAY, 0, 0, ! 97: "tn", CR1, ALLDELAY, 0, 0, ! 98: "tn300", CR1, ALLDELAY, 0, 0, ! 99: "ti", CR2, ALLDELAY, 0, 0, ! 100: "ti700", CR2, ALLDELAY, 0, 0, ! 101: "tek", FF1, ALLDELAY, 0, 0, ! 102: "crtbs", 0, 0, LCRTBS, LPRTERA, ! 103: "-crtbs", 0, 0, 0, LCRTBS, ! 104: "prterase", 0, 0, LPRTERA, LCRTBS+LCRTKIL+LCRTERA, ! 105: "-prterase", 0, 0, 0, LPRTERA, ! 106: "crterase", 0, 0, LCRTERA, LPRTERA, ! 107: "-crterase", 0, 0, 0, LCRTERA, ! 108: "crtkill", 0, 0, LCRTKIL, LPRTERA, ! 109: "-crtkill", 0, 0, 0, LCRTKIL, ! 110: "tilde", 0, 0, LTILDE, 0, ! 111: "-tilde", 0, 0, 0, LTILDE, ! 112: "mdmbuf", 0, 0, LMDMBUF, 0, ! 113: "-mdmbuf", 0, 0, 0, LMDMBUF, ! 114: "litout", 0, 0, LLITOUT, 0, ! 115: "-litout", 0, 0, 0, LLITOUT, ! 116: "tostop", 0, 0, LTOSTOP, 0, ! 117: "-tostop", 0, 0, 0, LTOSTOP, ! 118: "flusho", 0, 0, LFLUSHO, 0, ! 119: "-flusho", 0, 0, 0, LFLUSHO, ! 120: "nohang", 0, 0, LNOHANG, 0, ! 121: "-nohang", 0, 0, 0, LNOHANG, ! 122: #ifdef notdef ! 123: "etxack", 0, 0, LETXACK, 0, ! 124: "-etxack", 0, 0, 0, LETXACK, ! 125: #endif ! 126: "ctlecho", 0, 0, LCTLECH, 0, ! 127: "-ctlecho", 0, 0, 0, LCTLECH, ! 128: "pendin", 0, 0, LPENDIN, 0, ! 129: "-pendin", 0, 0, 0, LPENDIN, ! 130: "decctlq", 0, 0, LDECCTQ, 0, ! 131: "-decctlq", 0, 0, 0, LDECCTQ, ! 132: "noflsh", 0, 0, LNOFLSH, 0, ! 133: "-noflsh", 0, 0, 0, LNOFLSH, ! 134: 0, ! 135: }; ! 136: ! 137: struct tchars tc; ! 138: struct ltchars ltc; ! 139: struct sgttyb mode; ! 140: int lmode; ! 141: int oldisc, ldisc; ! 142: ! 143: struct special { ! 144: char *name; ! 145: char *cp; ! 146: char def; ! 147: } special[] = { ! 148: "erase", &mode.sg_erase, CERASE, ! 149: "kill", &mode.sg_kill, CKILL, ! 150: "intr", &tc.t_intrc, CINTR, ! 151: "quit", &tc.t_quitc, CQUIT, ! 152: "start", &tc.t_startc, CSTART, ! 153: "stop", &tc.t_stopc, CSTOP, ! 154: "eof", &tc.t_eofc, CEOF, ! 155: "brk", &tc.t_brkc, CBRK, ! 156: "susp", <c.t_suspc, CSUSP, ! 157: "dsusp", <c.t_dsuspc, CDSUSP, ! 158: "rprnt", <c.t_rprntc, CRPRNT, ! 159: "flush", <c.t_flushc, CFLUSH, ! 160: "werase", <c.t_werasc, CWERASE, ! 161: "lnext", <c.t_lnextc, CLNEXT, ! 162: 0 ! 163: }; ! 164: char *arg; ! 165: ! 166: int argc; ! 167: char **argv; ! 168: main(iargc, iargv) ! 169: char **iargv; ! 170: { ! 171: int i; ! 172: register struct special *sp; ! 173: char obuf[BUFSIZ]; ! 174: ! 175: setbuf(stderr, obuf); ! 176: argc = iargc; ! 177: argv = iargv; ! 178: ioctl(1, TIOCGETP, &mode); ! 179: ioctl(1, TIOCGETD, &ldisc); ! 180: oldisc = ldisc; ! 181: ioctl(1, TIOCGETC, &tc); ! 182: ioctl(1, TIOCLGET, &lmode); ! 183: ioctl(1, TIOCGLTC, <c); ! 184: if(argc == 1) { ! 185: prmodes(0); ! 186: exit(0); ! 187: } ! 188: if (argc == 2 && !strcmp(argv[1], "all")) { ! 189: prmodes(1); ! 190: exit(0); ! 191: } ! 192: if (argc == 2 && !strcmp(argv[1], "everything")) { ! 193: prmodes(2); ! 194: exit(0); ! 195: } ! 196: /* ! 197: if (argc == 2 && !strcmp(argv[1], "all")) { ! 198: prmodes(2); ! 199: exit(0); ! 200: } ! 201: */ ! 202: while(--argc > 0) { ! 203: arg = *++argv; ! 204: if (eq("ek")){ ! 205: mode.sg_erase = '#'; ! 206: mode.sg_kill = '@'; ! 207: continue; ! 208: } ! 209: if (eq("new")){ ! 210: ldisc = NTTYDISC; ! 211: if (ioctl(1, TIOCSETD, &ldisc)<0) ! 212: perror("ioctl"); ! 213: continue; ! 214: } ! 215: if (eq("newcrt")){ ! 216: ldisc = NTTYDISC; ! 217: lmode &= ~LPRTERA; ! 218: lmode |= LCRTBS|LCTLECH; ! 219: if (mode.sg_ospeed >= B1200) ! 220: lmode |= LCRTERA|LCRTKIL; ! 221: if (ioctl(1, TIOCSETD, &ldisc)<0) ! 222: perror("ioctl"); ! 223: continue; ! 224: } ! 225: if (eq("crt")){ ! 226: lmode &= ~LPRTERA; ! 227: lmode |= LCRTBS|LCTLECH; ! 228: if (mode.sg_ospeed >= B1200) ! 229: lmode |= LCRTERA|LCRTKIL; ! 230: continue; ! 231: } ! 232: if (eq("old")){ ! 233: ldisc = 0; ! 234: if (ioctl(1, TIOCSETD, &ldisc)<0) ! 235: perror("ioctl"); ! 236: continue; ! 237: } ! 238: if (eq("dec")){ ! 239: mode.sg_erase = 0177; ! 240: mode.sg_kill = CTRL(u); ! 241: tc.t_intrc = CTRL(c); ! 242: ldisc = NTTYDISC; ! 243: lmode &= ~LPRTERA; ! 244: lmode |= LCRTBS|LCTLECH|LDECCTQ; ! 245: if (mode.sg_ospeed >= B1200) ! 246: lmode |= LCRTERA|LCRTKIL; ! 247: if (ioctl(1, TIOCSETD, &ldisc)<0) ! 248: perror("ioctl"); ! 249: continue; ! 250: } ! 251: for (sp = special; sp->name; sp++) ! 252: if (eq(sp->name)) { ! 253: if (--argc == 0) ! 254: goto done; ! 255: if (**++argv == 'u') ! 256: *sp->cp = 0377; ! 257: else if (**argv == '^') ! 258: *sp->cp = ((*argv)[1] == '?') ? ! 259: 0177 : (*argv)[1] & 037; ! 260: else ! 261: *sp->cp = **argv; ! 262: goto cont; ! 263: } ! 264: if (eq("gspeed")) { ! 265: mode.sg_ispeed = B300; ! 266: mode.sg_ospeed = B9600; ! 267: continue; ! 268: } ! 269: if (eq("hup")) { ! 270: ioctl(1, TIOCHPCL, NULL); ! 271: continue; ! 272: } ! 273: for(i=0; speeds[i].string; i++) ! 274: if(eq(speeds[i].string)) { ! 275: mode.sg_ispeed = mode.sg_ospeed = speeds[i].speed; ! 276: goto cont; ! 277: } ! 278: for(i=0; stopbits[i].string; i++) ! 279: if(eq(stopbits[i].string)) { ! 280: mode.sg_stopbits = stopbits[i].numbits; ! 281: goto cont; ! 282: } ! 283: if (eq("speed")) { ! 284: ioctl(open("/dev/tty", 0), TIOCGETP, &mode); ! 285: for(i=0; speeds[i].string; i++) ! 286: if (mode.sg_ospeed == speeds[i].speed) { ! 287: printf("%s\n", speeds[i].string); ! 288: exit(0); ! 289: } ! 290: printf("unknown\n"); ! 291: exit(1); ! 292: } ! 293: for(i=0; modes[i].string; i++) ! 294: if(eq(modes[i].string)) { ! 295: mode.sg_flags &= ~modes[i].reset; ! 296: mode.sg_flags |= modes[i].set; ! 297: lmode &= ~modes[i].lreset; ! 298: lmode |= modes[i].lset; ! 299: } ! 300: if(arg) ! 301: fprintf(stderr,"unknown mode: %s\n", arg); ! 302: cont: ! 303: ; ! 304: } ! 305: done: ! 306: ioctl(1, TIOCSETN, &mode); ! 307: ioctl(1, TIOCSETC, &tc); ! 308: ioctl(1, TIOCSLTC, <c); ! 309: ioctl(1, TIOCLSET, &lmode); ! 310: } ! 311: ! 312: eq(string) ! 313: char *string; ! 314: { ! 315: int i; ! 316: ! 317: if(!arg) ! 318: return(0); ! 319: i = 0; ! 320: loop: ! 321: if(arg[i] != string[i]) ! 322: return(0); ! 323: if(arg[i++] != '\0') ! 324: goto loop; ! 325: arg = 0; ! 326: return(1); ! 327: } ! 328: ! 329: prmodes(all) ! 330: { ! 331: register m; ! 332: int any ; ! 333: int numbits = 1; ! 334: ! 335: if(ldisc==NETLDISC) ! 336: fprintf(stderr, "net discipline, "); ! 337: else if(ldisc==NTTYDISC) ! 338: fprintf(stderr, "new tty, "); ! 339: else if(all==2) ! 340: fprintf(stderr, "old tty, "); ! 341: if(mode.sg_ispeed != mode.sg_ospeed) { ! 342: prspeed("input speed ", mode.sg_ispeed); ! 343: prspeed("output speed ", mode.sg_ospeed); ! 344: } else ! 345: prspeed("speed ", mode.sg_ispeed); ! 346: if (all==2) { ! 347: switch (mode.sg_stopbits) { ! 348: case STOP1: ! 349: numbits=1; ! 350: break; ! 351: ! 352: case STOP2: ! 353: numbits=2; ! 354: break; ! 355: ! 356: case STOP3: ! 357: numbits=3; ! 358: } ! 359: fprintf(stderr, "; stopbits = %d", numbits); ! 360: } ! 361: fprintf(stderr, all==2 ? "\n" : "; "); ! 362: m = mode.sg_flags; ! 363: if(all==2 || (m&(EVENP|ODDP))!=(EVENP|ODDP)) { ! 364: if(m & EVENP) fprintf(stderr,"even "); ! 365: if(m & ODDP) fprintf(stderr,"odd "); ! 366: } ! 367: if(all==2 || m&RAW) ! 368: fprintf(stderr,"-raw "+((m&RAW)!=0)); ! 369: if(all==2 || (m&CRMOD)==0) ! 370: fprintf(stderr,"-nl "+((m&CRMOD)==0)); ! 371: if(all==2 || (m&ECHO)==0) ! 372: fprintf(stderr,"-echo "+((m&ECHO)!=0)); ! 373: if(all==2 || (m&LCASE)) ! 374: fprintf(stderr,"-lcase "+((m&LCASE)!=0)); ! 375: if(all==2 || (m&TANDEM)) ! 376: fprintf(stderr,"-tandem "+((m&TANDEM)!=0)); ! 377: fprintf(stderr,"-tabs "+((m&XTABS)!=XTABS)); ! 378: if(all==2 || (m&CBREAK)) ! 379: fprintf(stderr,"-cbreak "+((m&CBREAK)!=0)); ! 380: if(all==2 || (m&NLDELAY)) ! 381: delay((m&NLDELAY)/NL1, "nl"); ! 382: if ((m&TBDELAY)!=XTABS) ! 383: delay((m&TBDELAY)/TAB1, "tab"); ! 384: if(all==2 || (m&CRDELAY)) ! 385: delay((m&CRDELAY)/CR1, "cr"); ! 386: if(all==2 || (m&VTDELAY)) ! 387: delay((m&VTDELAY)/FF1, "ff"); ! 388: if(all==2 || (m&BSDELAY)) ! 389: delay((m&BSDELAY)/BS1, "bs"); ! 390: if (all) ! 391: fprintf(stderr,"\n"); ! 392: #define lpit(what,str) \ ! 393: if (all==2||(lmode&what)) { \ ! 394: fprintf(stderr,str+((lmode&what)!=0)); any++; \ ! 395: } ! 396: if (ldisc == NTTYDISC) { ! 397: int newcrt = (lmode&(LCTLECH|LCRTBS)) == (LCTLECH|LCRTBS) && ! 398: (lmode&(LCRTERA|LCRTKIL)) == ! 399: ((mode.sg_ospeed > B300) ? LCRTERA|LCRTKIL : 0); ! 400: int nothing = 1; ! 401: if (newcrt) { ! 402: if (all==2) ! 403: fprintf(stderr, "crt: (crtbs crterase crtkill ctlecho) "); ! 404: else ! 405: fprintf(stderr, "crt "); ! 406: any++; ! 407: } else { ! 408: lpit(LCRTBS, "-crtbs "); ! 409: lpit(LCRTERA, "-crterase "); ! 410: lpit(LCRTKIL, "-crtkill "); ! 411: lpit(LCTLECH, "-ctlecho "); ! 412: lpit(LPRTERA, "-prterase "); ! 413: } ! 414: lpit(LTOSTOP, "-tostop "); ! 415: if (all==2) { ! 416: fprintf(stderr, "\n"); ! 417: any = 0; ! 418: nothing = 0; ! 419: } ! 420: lpit(LTILDE, "-tilde "); ! 421: lpit(LFLUSHO, "-flusho "); ! 422: lpit(LMDMBUF, "-mdmbuf "); ! 423: lpit(LLITOUT, "-litout "); ! 424: lpit(LNOHANG, "-nohang "); ! 425: if (any) { ! 426: fprintf(stderr,"\n"); ! 427: any = 0; ! 428: nothing = 0; ! 429: } ! 430: #ifdef notdef ! 431: lpit(LETXACK, "-etxack "); ! 432: #endif ! 433: lpit(LPENDIN, "-pendin "); ! 434: lpit(LDECCTQ, "-decctlq "); ! 435: lpit(LNOFLSH, "-noflsh "); ! 436: if (any || nothing) ! 437: fprintf(stderr,"\n"); ! 438: } else if (!all) ! 439: fprintf(stderr,"\n"); ! 440: if (all) { ! 441: switch (ldisc) { ! 442: ! 443: case 0: ! 444: fprintf(stderr,"\ ! 445: erase kill intr quit stop eof\ ! 446: \n"); ! 447: pcol(mode.sg_erase, -1); ! 448: pcol(mode.sg_kill, -1); ! 449: pcol(tc.t_intrc, -1); ! 450: pcol(tc.t_quitc, -1); ! 451: pcol(tc.t_stopc, tc.t_startc); ! 452: pcol(tc.t_eofc, tc.t_brkc); ! 453: fprintf(stderr,"\n"); ! 454: break; ! 455: ! 456: case NTTYDISC: ! 457: fprintf(stderr,"\ ! 458: erase kill werase rprnt flush lnext susp intr quit stop eof\ ! 459: \n"); ! 460: pcol(mode.sg_erase, -1); ! 461: pcol(mode.sg_kill, -1); ! 462: pcol(ltc.t_werasc, -1); ! 463: pcol(ltc.t_rprntc, -1); ! 464: pcol(ltc.t_flushc, -1); ! 465: pcol(ltc.t_lnextc, -1); ! 466: pcol(ltc.t_suspc, ltc.t_dsuspc); ! 467: pcol(tc.t_intrc, -1); ! 468: pcol(tc.t_quitc, -1); ! 469: pcol(tc.t_stopc, tc.t_startc); ! 470: pcol(tc.t_eofc, tc.t_brkc); ! 471: fprintf(stderr,"\n"); ! 472: break; ! 473: } ! 474: } else if (ldisc != NETLDISC) { ! 475: register struct special *sp; ! 476: int first = 1; ! 477: ! 478: for (sp = special; sp->name; sp++) { ! 479: if ((*sp->cp&0377) != (sp->def&0377)) { ! 480: pit(*sp->cp, sp->name, first ? "" : ", "); ! 481: first = 0; ! 482: }; ! 483: if (sp->cp == &tc.t_brkc && ldisc == 0) ! 484: break; ! 485: } ! 486: if (!first) ! 487: fprintf(stderr, "\n"); ! 488: } ! 489: } ! 490: ! 491: pcol(ch1, ch2) ! 492: int ch1, ch2; ! 493: { ! 494: int nout = 0; ! 495: ! 496: ch1 &= 0377; ! 497: ch2 &= 0377; ! 498: if (ch1 == ch2) ! 499: ch2 = 0377; ! 500: for (; ch1 != 0377 || ch2 != 0377; ch1 = ch2, ch2 = 0377) { ! 501: if (ch1 == 0377) ! 502: continue; ! 503: if (ch1 & 0200) { ! 504: fprintf(stderr, "M-"); ! 505: nout += 2; ! 506: ch1 &= ~ 0200; ! 507: } ! 508: if (ch1 == 0177) { ! 509: fprintf(stderr, "^"); ! 510: nout++; ! 511: ch1 = '?'; ! 512: } else if (ch1 < ' ') { ! 513: fprintf(stderr, "^"); ! 514: nout++; ! 515: ch1 += '@'; ! 516: } ! 517: fprintf(stderr, "%c", ch1); ! 518: nout++; ! 519: if (ch2 != 0377) { ! 520: fprintf(stderr, "/"); ! 521: nout++; ! 522: } ! 523: } ! 524: while (nout < 7) { ! 525: fprintf(stderr, " "); ! 526: nout++; ! 527: } ! 528: } ! 529: ! 530: pit(what, itsname, sep) ! 531: unsigned what; ! 532: char *itsname, *sep; ! 533: { ! 534: ! 535: what &= 0377; ! 536: fprintf(stderr, "%s%s", sep, itsname); ! 537: if (what == 0377) { ! 538: fprintf(stderr, " <undef>"); ! 539: return; ! 540: } ! 541: fprintf(stderr, " = "); ! 542: if (what & 0200) { ! 543: fprintf(stderr, "M-"); ! 544: what &= ~ 0200; ! 545: } ! 546: if (what == 0177) { ! 547: fprintf(stderr, "^"); ! 548: what = '?'; ! 549: } else if (what < ' ') { ! 550: fprintf(stderr, "^"); ! 551: what += '@'; ! 552: } ! 553: fprintf(stderr, "%c", what); ! 554: } ! 555: ! 556: delay(m, s) ! 557: char *s; ! 558: { ! 559: ! 560: if(m) ! 561: fprintf(stderr,"%s%d ", s, m); ! 562: } ! 563: ! 564: int speed[] = { ! 565: 0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400 ! 566: }; ! 567: ! 568: prspeed(c, s) ! 569: char *c; ! 570: { ! 571: ! 572: fprintf(stderr,"%s%d baud", c, speed[s]); ! 573: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.