|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <sys/ttyio.h> ! 3: #include <sys/nttyio.h> ! 4: #include <sys/filio.h> ! 5: ! 6: #define Ioctl(a, b, c) if(ioctl(a,b,c) < 0){perror("b");} ! 7: ! 8: #define CTRL(x) ('x'&037) ! 9: ! 10: extern int errno, ntty_ld, tty_ld; ! 11: int ttyfd; ! 12: ! 13: struct { ! 14: char *s_name; ! 15: int s_define; ! 16: int s_speed; ! 17: } speeds[] = { ! 18: "0", B0, 0, ! 19: "50", B50, 50, ! 20: "75", B75, 75, ! 21: "110", B110, 110, ! 22: "134", B134, 134, ! 23: "150", B150, 150, ! 24: "200", B200, 200, ! 25: "300", B300, 300, ! 26: "600", B600, 600, ! 27: "1200", B1200, 1200, ! 28: "1800", B1800, 1800, ! 29: "2400", B2400, 2400, ! 30: "4800", B4800, 4800, ! 31: "9600", B9600, 9600, ! 32: "exta", EXTA, 19200, ! 33: "extb", EXTB, 0, ! 34: "19200", EXTA, 19200, /* must follow extb */ ! 35: 0, ! 36: }; ! 37: ! 38: #define SGTTY 0 ! 39: #define TTYDEV 1 ! 40: #define NTTY 2 ! 41: ! 42: struct { ! 43: char *string; ! 44: int set; ! 45: int reset; ! 46: int where; ! 47: } modes[] = { ! 48: { "raw", RAW, 0, SGTTY}, ! 49: { "-raw", 0, RAW, SGTTY}, ! 50: { "cooked", 0, RAW, SGTTY}, ! 51: { "-nl", CRMOD, 0, SGTTY}, ! 52: { "nl", 0, CRMOD, SGTTY}, ! 53: { "echo", ECHO, 0, SGTTY}, ! 54: { "-echo", 0, ECHO, SGTTY}, ! 55: { "LCASE", LCASE, 0, SGTTY}, ! 56: { "lcase", LCASE, 0, SGTTY}, ! 57: { "-LCASE", 0, LCASE, SGTTY}, ! 58: { "-lcase", 0, LCASE, SGTTY}, ! 59: { "-tabs", XTABS, 0, SGTTY}, ! 60: { "tabs", 0, XTABS, SGTTY}, ! 61: { "tandem", TANDEM, 0, SGTTY}, ! 62: { "-tandem", 0, TANDEM, SGTTY}, ! 63: { "cbreak", CBREAK, 0, SGTTY}, ! 64: { "-cbreak", 0, CBREAK, SGTTY}, ! 65: { "cr0", CR0, CR3, SGTTY}, ! 66: { "cr1", CR1, CR3, SGTTY}, ! 67: { "cr2", CR2, CR3, SGTTY}, ! 68: { "cr3", CR3, CR3, SGTTY}, ! 69: { "tab0", TAB0, XTABS, SGTTY}, ! 70: { "tab1", TAB1, XTABS, SGTTY}, ! 71: { "tab2", TAB2, XTABS, SGTTY}, ! 72: { "nl0", NL0, NL3, SGTTY}, ! 73: { "nl1", NL1, NL3, SGTTY}, ! 74: { "nl2", NL2, NL3, SGTTY}, ! 75: { "nl3", NL3, NL3, SGTTY}, ! 76: { "ff0", FF0, FF1, SGTTY}, ! 77: { "ff1", FF1, FF1, SGTTY}, ! 78: { "bs0", BS0, BS1, SGTTY}, ! 79: { "bs1", BS1, BS1, SGTTY}, ! 80: { "8bit", F8BIT, 0, TTYDEV}, ! 81: { "-8bit", 0, F8BIT, TTYDEV}, ! 82: { "even", EVENP, 0, TTYDEV}, ! 83: { "-even", 0, EVENP, TTYDEV}, ! 84: { "odd", ODDP, 0, TTYDEV}, ! 85: { "-odd", 0, ODDP, TTYDEV}, ! 86: { "crtbs", LCRTBS, LPRTERA, NTTY}, ! 87: { "-crtbs", 0, LCRTBS, NTTY}, ! 88: { "prterase", LPRTERA, LCRTBS+LCRTKIL+LCRTERA, NTTY}, ! 89: { "-prterase", 0, LPRTERA, NTTY}, ! 90: { "crterase", LCRTERA, LPRTERA, NTTY}, ! 91: { "-crterase", 0, LCRTERA, NTTY}, ! 92: { "crtkill", LCRTKIL, LPRTERA, NTTY}, ! 93: { "-crtkill", 0, LCRTKIL, NTTY}, ! 94: { "ctlecho", LCTLECH, 0, NTTY}, ! 95: { "-ctlecho", 0, LCTLECH, NTTY}, ! 96: { "tilde", LTILDE, 0, NTTY}, ! 97: { "-tilde", 0, LTILDE, NTTY}, ! 98: { "litout", LLITOUT, 0, NTTY}, ! 99: { "-litout", 0, LLITOUT, NTTY}, ! 100: { "flusho", LFLUSHO, 0, NTTY}, ! 101: { "-flusho", 0, LFLUSHO, NTTY}, ! 102: { "nohang", LNOHANG, 0, NTTY}, ! 103: { "-nohang", 0, LNOHANG, NTTY}, ! 104: { "decctq", LDECCTQ, 0, NTTY}, ! 105: { "-decctq", 0, LDECCTQ, NTTY}, ! 106: 0, ! 107: }; ! 108: ! 109: struct sgttyb mode; ! 110: struct ttydevb speed; ! 111: struct tchars tc; ! 112: struct ltchars ltc; ! 113: struct luchars luc; ! 114: ! 115: struct special { ! 116: char *name; ! 117: char *cp; ! 118: char def; ! 119: } special[] = { ! 120: "erase", &mode.sg_erase, CTRL(h), ! 121: "kill", &mode.sg_kill, '@', ! 122: "intr", &tc.t_intrc, 0177, ! 123: "quit", &tc.t_quitc, CTRL(\\), ! 124: "start", &tc.t_startc, CTRL(q), ! 125: "stop", &tc.t_stopc, CTRL(s), ! 126: "eof", &tc.t_eofc, CTRL(d), ! 127: "brk", &tc.t_brkc, 0377, ! 128: ! 129: "susp", <c.t_suspc, CTRL(z), ! 130: "dsusp", <c.t_dsuspc, CTRL(y), ! 131: "rprnt", <c.t_rprntc, CTRL(r), ! 132: "flush", <c.t_flushc, CTRL(o), ! 133: "werase", <c.t_werasc, CTRL(w), ! 134: "lnext", <c.t_lnextc, CTRL(v), ! 135: ! 136: "undo", &luc.t_undoc, 0377, ! 137: "urot", &luc.t_urotc, 0377, ! 138: 0 ! 139: }; ! 140: ! 141: char *ego; ! 142: int ldisc; /* current line disc */ ! 143: int lmode; /* new tty local mode bits */ ! 144: ! 145: main (argc, argv) ! 146: int argc; ! 147: char *argv[]; ! 148: { ! 149: char *arg, obuf[BUFSIZ]; ! 150: int i; ! 151: struct special *sp; ! 152: ! 153: ego = argv[0]; ! 154: setbuf(stdout, obuf); ! 155: if ((ttyfd = open("/dev/tty", 1)) < 0) { ! 156: fprintf(stderr, "%s: can't open /dev/tty\n", ego); ! 157: exit(1); ! 158: } ! 159: (void) getmodes(); ! 160: if (argc < 2) { ! 161: prmodes(); ! 162: exit (0); ! 163: } ! 164: for (arg = *++argv; --argc > 0; arg = *++argv) { ! 165: ! 166: #define eq(x) (strcmp(arg, x)==0) ! 167: ! 168: if (eq ("all")) { ! 169: prmodes(); ! 170: continue; ! 171: } ! 172: if (eq ("old") || eq ("-new")) { ! 173: if (swdisc(tty_ld, 0)) ! 174: goto done1; ! 175: continue; ! 176: } ! 177: if (eq ("new")) { ! 178: if (swdisc(ntty_ld, 0)) ! 179: goto done1; ! 180: continue; ! 181: } ! 182: if (eq ("old!")) { ! 183: if (swdisc(tty_ld, 1)) ! 184: goto done1; ! 185: continue; ! 186: } ! 187: if (eq ("crt")) { ! 188: lmode |= LCRTBS | LCTLECH; ! 189: if (speeds[mode.sg_ispeed].s_speed >= 1200) ! 190: lmode |= LCRTERA | LCRTKIL; ! 191: continue; ! 192: } ! 193: if (eq ("ek")) { ! 194: mode.sg_erase = '#'; ! 195: mode.sg_kill = '@'; ! 196: continue; ! 197: } ! 198: if (eq ("hup")) { ! 199: (void) ioctl (ttyfd, TIOCHPCL, NULL); ! 200: continue; ! 201: } ! 202: for (sp = special; sp->name; sp++) ! 203: if (eq (sp->name)) { ! 204: if (--argc > 0) { ! 205: arg = *++argv; ! 206: if (*arg == 'u') ! 207: *sp->cp = 0377; ! 208: else if (*arg == '^') ! 209: *sp->cp = (arg[1] == '?') ? ! 210: 0177 : arg[1] & 037; ! 211: else *sp->cp = *arg; ! 212: goto cont; ! 213: } ! 214: fprintf(stderr, "%s: missing %s character\n", ! 215: ego, arg); ! 216: goto done1; ! 217: } ! 218: for (i = 0; speeds[i].s_name; i++) ! 219: if (eq (speeds[i].s_name)) { ! 220: mode.sg_ispeed = mode.sg_ospeed = ! 221: speeds[i].s_define; /* temp compat */ ! 222: speed.ispeed = speed.ospeed = speeds[i].s_define; ! 223: goto cont; ! 224: } ! 225: for (i = 0; modes[i].string; i++) ! 226: if (eq (modes[i].string)) ! 227: switch (modes[i].where) { ! 228: case SGTTY: ! 229: mode.sg_flags &=~ modes[i].reset; ! 230: mode.sg_flags |= modes[i].set; ! 231: goto cont; ! 232: ! 233: case TTYDEV: ! 234: speed.flags &=~ modes[i].reset; ! 235: speed.flags |= modes[i].set; ! 236: goto cont; ! 237: ! 238: case NTTY: ! 239: lmode &=~ modes[i].reset; ! 240: lmode |= modes[i].set; ! 241: goto cont; ! 242: } ! 243: fprintf(stderr, "%s: %s: unknown mode\n", ego, arg); ! 244: done1: ! 245: setmodes(); ! 246: exit(1); ! 247: cont: ! 248: ; ! 249: } ! 250: setmodes(); ! 251: exit(0); ! 252: } ! 253: ! 254: getmodes() ! 255: { ! 256: int ret; ! 257: ldisc = ioctl (ttyfd, FIOLOOKLD, 0); ! 258: ret = ioctl (ttyfd, TIOCGETP, &mode) == -1; ! 259: if (ioctl(ttyfd, TIOCGDEV, &speed) < 0) { ! 260: speed.ispeed = mode.sg_ispeed; ! 261: speed.ospeed = mode.sg_ospeed; ! 262: speed.flags = mode.sg_flags & (EVENP|ODDP); ! 263: } ! 264: (void) ioctl (ttyfd, TIOCGETC, &tc); ! 265: if (ldisc == ntty_ld) { ! 266: Ioctl(ttyfd, TIOCLGET, &lmode); ! 267: Ioctl(ttyfd, TIOCGLTC, <c); ! 268: } ! 269: return ret; ! 270: } ! 271: ! 272: pit (what, itsname, sep) ! 273: unsigned char what; ! 274: char *itsname, *sep; ! 275: { ! 276: printf("%s", itsname); ! 277: if (what == 0377) { ! 278: printf(" <undef>%s", sep); ! 279: return; ! 280: } ! 281: printf(" = "); ! 282: if (what & 0200) { ! 283: printf("M-"); ! 284: what &= ~ 0200; ! 285: } ! 286: if (what == 0177) { ! 287: printf("^"); ! 288: what = '?'; ! 289: } ! 290: else if (what < ' ') { ! 291: printf("^"); ! 292: what += '@'; ! 293: } ! 294: printf("%c%s", what, sep); ! 295: return; ! 296: } ! 297: ! 298: ! 299: prmodes() ! 300: { ! 301: register int m; ! 302: ! 303: if (speed.ispeed != speed.ospeed) ! 304: printf("input speed: %d baud, output speed: %d baud\n", ! 305: speeds[speed.ispeed].s_speed, ! 306: speeds[speed.ospeed].s_speed); ! 307: else ! 308: printf("speed: %d baud\n", ! 309: speeds[speed.ispeed].s_speed); ! 310: pit (mode.sg_erase, "erase", "; "); ! 311: pit (mode.sg_kill, "kill", "; "); ! 312: pit (tc.t_intrc, "intr", "; "); ! 313: pit (tc.t_quitc, "quit", "\n"); ! 314: pit (tc.t_startc, "start", "; "); ! 315: pit (tc.t_stopc, "stop", "; "); ! 316: pit (tc.t_eofc, "eof", "; "); ! 317: pit (tc.t_brkc, "brk", "\n"); ! 318: ! 319: if (ldisc == ntty_ld) { ! 320: pit (ltc.t_werasc, "werase", "; "); ! 321: pit (ltc.t_rprntc, "rprnt", "; "); ! 322: pit (ltc.t_flushc, "flush", "; "); ! 323: pit (ltc.t_lnextc, "lnext", "\n"); ! 324: pit (ltc.t_suspc, "susp", "; "); ! 325: pit (ltc.t_dsuspc, "dsusp", "; "); ! 326: pit (luc.t_undoc, "undo", "; "); ! 327: pit (luc.t_urotc, "urot", "\n"); ! 328: } ! 329: if (ldisc == tty_ld) ! 330: printf("old "); ! 331: else if (ldisc == ntty_ld) ! 332: printf("new "); ! 333: if (speed.flags & EVENP) ! 334: printf("even "); ! 335: if (speed.flags & ODDP) ! 336: printf("odd "); ! 337: if (speed.flags & F8BIT) ! 338: printf("8bit "); ! 339: m = mode.sg_flags; ! 340: #define mpit(what,str) printf(str + ((m & what) != 0)) ! 341: mpit (RAW, "-raw "); ! 342: printf("-nl " + ((m & CRMOD) == 0)); ! 343: mpit (ECHO, "-echo "); ! 344: mpit (LCASE, "-lcase "); ! 345: printf("-tabs " + ((m & XTABS) != XTABS)); ! 346: mpit (CBREAK, "-cbreak "); ! 347: mpit (TANDEM, "-tandem "); ! 348: #define delay(x,y) if (x) printf("%s%d ", y, x) ! 349: delay ((m & NLDELAY) / NL1, "nl"); ! 350: if ((m & TBDELAY) != XTABS) ! 351: delay ((m & TBDELAY) / TAB1, "tab"); ! 352: delay ((m & CRDELAY) / CR1, "cr"); ! 353: delay ((m & VTDELAY) / FF1, "ff"); ! 354: delay ((m & BSDELAY) / BS1, "bs"); ! 355: printf("\n"); ! 356: ! 357: if (ldisc == ntty_ld) { ! 358: m = lmode; ! 359: mpit (LCRTBS, "-crtbs "); ! 360: mpit (LCRTERA, "-crterase "); ! 361: mpit (LCRTKIL, "-crtkill "); ! 362: mpit (LCTLECH, "-ctlecho "); ! 363: mpit (LPRTERA, "-prterase "); ! 364: printf("\n"); ! 365: ! 366: mpit (LTILDE, "-tilde "); ! 367: mpit (LFLUSHO, "-flusho "); ! 368: mpit (LLITOUT, "-litout "); ! 369: mpit (LNOHANG, "-nohang "); ! 370: mpit (LDECCTQ, "-decctq "); ! 371: printf("\n"); ! 372: } ! 373: } ! 374: ! 375: setmodes() ! 376: { ! 377: Ioctl(ttyfd, TIOCSETN, &mode); ! 378: Ioctl(ttyfd, TIOCSDEV, &speed); ! 379: Ioctl(ttyfd, TIOCSETC, &tc); ! 380: if (ldisc == ntty_ld) { ! 381: Ioctl(ttyfd, TIOCSLTC, <c); ! 382: Ioctl(ttyfd, TIOCLSET, &lmode); ! 383: } ! 384: } ! 385: ! 386: int ! 387: swdisc(newld, force) ! 388: int newld, force; ! 389: { ! 390: int curld = ioctl(ttyfd, FIOLOOKLD, 0); ! 391: ! 392: if (force == 0 && curld != tty_ld && curld != ntty_ld) ! 393: return (0); /* silly but less confusing */ ! 394: if (curld == tty_ld || curld == ntty_ld || curld == newld) { ! 395: if (ioctl(ttyfd, FIOPOPLD, 0) < 0) { ! 396: fprintf(stderr, "%s: can't pop line discipline\n", ego); ! 397: return (-1); ! 398: } ! 399: } ! 400: if (ioctl(ttyfd, FIOPUSHLD, &newld) < 0) { ! 401: Ioctl(ttyfd, FIOPUSHLD, &ldisc); ! 402: fprintf(stderr, "%s: can't push line discipline\n", ego); ! 403: return (-1); ! 404: } ! 405: /* what follows is a bit silly */ ! 406: Ioctl(ttyfd, TIOCSETN, &mode); ! 407: Ioctl(ttyfd, TIOCSETC, &tc); ! 408: getmodes(); ! 409: return (0); ! 410: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.