Annotation of coherent/d/bin/stty.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Set options for the current output terminal.
        !             3:  */
        !             4: 
        !             5: #include <stdio.h>
        !             6: #include <sgtty.h>
        !             7: 
        !             8: #define        ON      1
        !             9: #define        OFF     2
        !            10: #define        NONE    (-1)            /* Disabled character */
        !            11: #define        NEXT    (-2)            /* Get next arg */
        !            12: #define        DEL     0177            /* Del/rubout in ASCII */
        !            13: 
        !            14: /* Functions to set and reset parameters */
        !            15: int    smode();
        !            16: int    sspeed();
        !            17: int    sedit();
        !            18: int    stchars();
        !            19: int    sflag();
        !            20: int    sane();
        !            21: 
        !            22: struct sgttyb  sgttyb;
        !            23: struct tchars  tchars;
        !            24: 
        !            25: int    hupflag;                /* Set hangup on close mode */
        !            26: int    exclflag;               /* Set exclusive mode */
        !            27: int    allflag;                /* Display all modes */
        !            28: int    scmd = TIOCSETP;        /* Ordinary stty command */
        !            29: int    printflag;              /* On for printing modes */
        !            30: 
        !            31: #define        NOPTS   (sizeof(sopts)/sizeof(struct sopts))
        !            32: 
        !            33: struct sopts {
        !            34:        char    *s_opt;
        !            35:        int     (*s_func)();    /* Function takes arg1 & arg2 */
        !            36:        char    *s_arg1;
        !            37:        int     s_arg2;
        !            38:        int     s_arg3;
        !            39: }      sopts[] = {
        !            40:        "flush", sflag, &scmd, TIOCSETP, 0,
        !            41:        "-flush", sflag, &scmd, TIOCSETN, 0,
        !            42:        "even", smode, NULL, EVENP, 0,
        !            43:        "-even", smode, NULL, 0, EVENP,
        !            44:        "odd", smode, NULL, ODDP, 0,
        !            45:        "-odd", smode, NULL, 0, ODDP,
        !            46:        "raw", smode, NULL, RAW, 0,
        !            47:        "-raw", smode, NULL, 0, RAW,
        !            48:        "cooked", smode, NULL, 0, RAW,
        !            49:        "rawin", smode, NULL, RAWIN, 0,
        !            50:        "-rawin", smode, NULL, 0, RAWIN,
        !            51:        "rawout", smode, NULL, RAWOUT, 0,
        !            52:        "-rawout", smode, NULL, 0, RAWOUT,
        !            53:        "cbreak", smode, NULL, CBREAK, 0,
        !            54:        "-cbreak", smode, NULL, 0, CBREAK,
        !            55:        "-nl", smode, NULL, CRMOD, 0,
        !            56:        "nl", smode, NULL, 0, CRMOD,
        !            57:        "echo", smode, NULL, ECHO, 0,
        !            58:        "-echo", smode, NULL, 0, ECHO,
        !            59:        "lcase", smode, NULL, LCASE, 0,
        !            60:        "-lcase", smode, NULL, 0, LCASE,
        !            61:        "-tabs", smode, NULL, XTABS, 0,
        !            62:        "tabs", smode, NULL, 0, XTABS,
        !            63:        "tandem", smode, NULL, TANDEM, 0,
        !            64:        "-tandem", smode, NULL, 0, TANDEM,
        !            65:        "crt", smode, NULL, CRT, 0,
        !            66:        "-crt", smode, NULL, 0, CRT,
        !            67:        "ek", sedit, NULL, '#', '@',
        !            68: #if DELAY
        !            69:        "cr0", smode, NULL, CR0, CRDELAY,
        !            70:        "cr1", smode, NULL, CR1, CRDELAY,
        !            71:        "cr2", smode, NULL, CR2, CRDELAY,
        !            72:        "cr3", smode, NULL, CR3, CRDELAY,
        !            73:        "nl0", smode, NULL, NL0, NLDELAY,
        !            74:        "nl1", smode, NULL, NL1, NLDELAY,
        !            75:        "nl2", smode, NULL, NL2, NLDELAY,
        !            76:        "nl3", smode, NULL, NL3, NLDELAY,
        !            77:        "ff0", smode, NULL, FF0, VTDELAY,
        !            78:        "ff1", smode, NULL, FF1, VTDELAY,
        !            79:        "bs0", smode, NULL, BS0, BSDELAY,
        !            80:        "bs1", smode, NULL, BS1, BSDELAY,
        !            81:        "tab0", smode, NULL, TAB0, TBDELAY,
        !            82:        "tab1", smode, NULL, TAB1, TBDELAY,
        !            83:        "tab2", smode, NULL, TAB2, TBDELAY,
        !            84:        "tab3", smode, NULL, TAB3, TBDELAY,
        !            85: #endif
        !            86:        "0", sspeed, NULL, B0, B0,
        !            87:        "50", sspeed, NULL, B50, B50,
        !            88:        "75", sspeed, NULL, B75, B75,
        !            89:        "110", sspeed, NULL, B110, B110,
        !            90:        "134", sspeed, NULL, B134, B134,
        !            91:        "134.5", sspeed, NULL, B134, B134,
        !            92:        "150", sspeed, NULL, B150, B150,
        !            93:        "200", sspeed, NULL, B200, B200,
        !            94:        "300", sspeed, NULL, B300, B300,
        !            95:        "600", sspeed, NULL, B600, B600,
        !            96:        "1200", sspeed, NULL, B1200, B1200,
        !            97:        "1800", sspeed, NULL, B1800, B1800,
        !            98:        "2000", sspeed, NULL, B2000, B2000,
        !            99:        "2400", sspeed, NULL, B2400, B2400,
        !           100:        "3600", sspeed, NULL, B3600, B3600,
        !           101:        "4800", sspeed, NULL, B4800, B4800,
        !           102:        "7200", sspeed, NULL, B7200, B7200,
        !           103:        "9600", sspeed, NULL, B9600, B9600,
        !           104:        "19200", sspeed, NULL, B19200, B19200,
        !           105:        "exta", sspeed, NULL, EXTA, EXTA,
        !           106:        "extb", sspeed, NULL, EXTB, EXTB,
        !           107:        "hup", sflag, &hupflag, TIOCHPCL, 0,
        !           108:        "-hup", sflag, &hupflag, TIOCCHPCL, 0,
        !           109:        "excl", sflag, &exclflag, TIOCEXCL, 0,
        !           110:        "-excl", sflag, &exclflag, TIOCNXCL, 0,
        !           111:        "print", sflag, &printflag, 1, 0,
        !           112:        "erase", sedit, NULL, NEXT, 0,
        !           113:        "kill", sedit, NULL, 0, NEXT,
        !           114:        "start", stchars, &tchars.t_startc, 0, 0,
        !           115:        "stop", stchars, &tchars.t_stopc, 0, 0,
        !           116:        "eof", stchars, &tchars.t_eofc, 0, 0,
        !           117:        "break", stchars, &tchars.t_brkc, 0, 0,
        !           118:        "quit", stchars, &tchars.t_quitc, 0, 0,
        !           119:        "intr", stchars, &tchars.t_intrc, 0, 0,         /* compatibility */
        !           120:        "int", stchars, &tchars.t_intrc, 0, 0,
        !           121:        "sane", sane, NULL, 0, 0
        !           122: };
        !           123: 
        !           124: /*
        !           125:  * Names of the speeds
        !           126:  */
        !           127: char   *speeds[] = {
        !           128:        "(hang up line)",
        !           129:        "50 baud",
        !           130:        "75 baud",
        !           131:        "110 baud",
        !           132:        "134.5 baud",
        !           133:        "150 baud",
        !           134:        "200 baud",
        !           135:        "300 baud",
        !           136:        "600 baud",
        !           137:        "1200 baud",
        !           138:        "1800 baud",
        !           139:        "2000 baud",
        !           140:        "2400 baud",
        !           141:        "3600 baud",
        !           142:        "4800 baud",
        !           143:        "7200 baud",
        !           144:        "9600 baud",
        !           145:        "19.2 Kbaud",
        !           146:        "exta",
        !           147:        "extb",
        !           148: };
        !           149: 
        !           150: int    sgtflag;                /* Says need sgtty */
        !           151: int    tcflag;                 /* Set terminal characters */
        !           152: int    ttyfd;                  /* Fd for setting attributes */
        !           153: 
        !           154: int    gargc;
        !           155: char   **gargv;
        !           156: char   *argv0;                 /* For usage() */
        !           157: 
        !           158: /*
        !           159:  * Main routine reads options and
        !           160:  * calls appropriate mode setting routines.
        !           161:  */
        !           162: main(argc, argv)
        !           163: char *argv[];
        !           164: {
        !           165:        char ttyname[40];
        !           166:        register struct sopts *sp;
        !           167:        register char *ap;
        !           168: 
        !           169:        ttyfd = fileno(stdout);
        !           170:        gargc = argc;
        !           171:        gargv = argv;
        !           172:        argv0 = argv[0];
        !           173:        while (argc > 1)  {
        !           174:                if (argv[1][0] == '-')  {
        !           175:                        if (argv[1][1] == 't')  {
        !           176:                                sprintf(ttyname, "/dev/%s", &argv[1][2]);
        !           177:                                if ((ttyfd = open(ttyname, 1)) >= 0) {
        !           178:                                        argv++;
        !           179:                                        gargv++;
        !           180:                                        argc--;
        !           181:                                        gargc--;
        !           182:                                } else {
        !           183:                                        ttyfd = fileno(stdout);
        !           184:                                        argv++;
        !           185:                                        argc--;
        !           186:                                }
        !           187:                        } else if (argv[1][1] == 'a')  {
        !           188:                                allflag = 1;
        !           189:                                argv++;
        !           190:                                gargv++;
        !           191:                                argc--;
        !           192:                                gargc--;
        !           193:                        } else {
        !           194:                                argv++;
        !           195:                                argc--;
        !           196:                        }
        !           197:                } else {
        !           198:                        argv++;
        !           199:                        argc--;
        !           200:                }
        !           201:        }
        !           202:        getmodes();
        !           203:        if (gargc <= 1)
        !           204:                prmodes();
        !           205:        else
        !           206:                while (gargc-- > 1) {
        !           207:                        ap = *++gargv;
        !           208:                        for (sp = sopts; sp < &sopts[NOPTS]; sp++)
        !           209:                                if (strcmp(sp->s_opt, ap) == 0) {
        !           210:                                        (*sp->s_func)(sp->s_arg1, sp->s_arg2,
        !           211:                                                sp->s_arg3);
        !           212:                                        break;
        !           213:                                }
        !           214:                        if (sp == &sopts[NOPTS])
        !           215:                                sterr("bad mode `%s'", ap);
        !           216:                }
        !           217:        setmodes();
        !           218:        if (printflag)
        !           219:                prmodes();
        !           220:        exit(0);
        !           221: }
        !           222: 
        !           223: /*
        !           224:  * smode - sets mode part of TIOCSETP structure.
        !           225:  * First clears out bits in `reset' and then
        !           226:  * sets bits in `set'.
        !           227:  */
        !           228: smode(junkp, set, reset)
        !           229: char *junkp;
        !           230: int set, reset;
        !           231: {
        !           232:        sgtflag = 1;
        !           233:        sgttyb.sg_flags &= ~reset;
        !           234:        sgttyb.sg_flags |= set;
        !           235: }
        !           236: 
        !           237: /*
        !           238:  * Set input and output speeds into sgttyb.
        !           239:  */
        !           240: sspeed(junkp, ispeed, ospeed)
        !           241: char *junkp;
        !           242: int ispeed, ospeed;
        !           243: {
        !           244:        sgtflag = 1;
        !           245:        sgttyb.sg_ispeed = ispeed;
        !           246:        sgttyb.sg_ospeed = ospeed;
        !           247: }
        !           248: 
        !           249: /*
        !           250:  * Set up erase and kill line editing
        !           251:  * characters.
        !           252:  */
        !           253: sedit(junkp, erase, kill)
        !           254: char *junkp;
        !           255: int erase, kill;
        !           256: {
        !           257:        sgtflag = 1;
        !           258:        if (erase != 0)
        !           259:                if (erase == NEXT)
        !           260:                        sgttyb.sg_erase = cget(); else
        !           261:                        sgttyb.sg_erase = erase;
        !           262:        if (kill != 0)
        !           263:                if (kill == NEXT)
        !           264:                        sgttyb.sg_kill = cget(); else
        !           265:                        sgttyb.sg_kill = kill;
        !           266: }
        !           267: 
        !           268: /*
        !           269:  * set a flag
        !           270:  * (e.g. hup, excl, flush)
        !           271:  */
        !           272: sflag(flagp, val, junk)
        !           273: int *flagp;
        !           274: int val, junk;
        !           275: {
        !           276:        *flagp = val;
        !           277: }
        !           278: 
        !           279: /*
        !           280:  * Set one of the terminal chars.
        !           281:  */
        !           282: /* ARGSUSED */
        !           283: stchars(cp, junk, morejunk)
        !           284: char *cp;
        !           285: int junk, morejunk;
        !           286: {
        !           287:        tcflag = 1;
        !           288:        *cp = cget();
        !           289: }
        !           290: 
        !           291: /*
        !           292:  * Print out the attributes
        !           293:  * of the terminal.
        !           294:  */
        !           295: prmodes()
        !           296: {
        !           297:        prchar("Erase = ", sgttyb.sg_erase);
        !           298:        prchar(", kill = ", sgttyb.sg_kill);
        !           299:        putc('\n', stderr);
        !           300:        prchar("Interrupt = ", tchars.t_intrc);
        !           301:        prchar(", quit = ", tchars.t_quitc);
        !           302:        prchar(", break = ", tchars.t_brkc);
        !           303:        putc('\n', stderr);
        !           304:        prchar("Start = ", tchars.t_startc);
        !           305:        prchar(", stop = ", tchars.t_stopc);
        !           306:        prchar(", eof = ", tchars.t_eofc);
        !           307:        putc('\n', stderr);
        !           308:        if (sgttyb.sg_ispeed == sgttyb.sg_ospeed)
        !           309:                fprintf(stderr, "Speed: %s\n", speeds[sgttyb.sg_ispeed]);
        !           310:        else
        !           311:                fprintf(stderr, "Speed: %s (in), %s (out)\n",
        !           312:                        speeds[sgttyb.sg_ispeed],
        !           313:                        speeds[sgttyb.sg_ospeed]);
        !           314:        fprintf(stderr, "Modes:");
        !           315:        prflag(EVENP, "even", NULL);
        !           316:        prflag(ODDP, "odd", NULL);
        !           317:        prdelay(RAW, "rawin", "rawout", "raw");
        !           318:        if (allflag) {
        !           319:                prflag(CRMOD, "-nl", "nl");
        !           320:                prflag(ECHO, "echo", "-echo");
        !           321:                prflag(LCASE, "lcase", "-lcase");
        !           322:                prflag(CBREAK, "cbreak", "-cbreak");
        !           323:                prflag(TANDEM, "tandem", "-tandem");
        !           324:                prflag(CRT, "crt", "-crt");
        !           325: /* The following code gives misinformation.  Removed 91/11/17 - hws */
        !           326: #if 0
        !           327:                if (exclflag)
        !           328:                        fprintf(stderr, " excl");
        !           329:                else
        !           330:                        fprintf(stderr, " -excl");
        !           331:                if (hupflag)
        !           332:                        fprintf(stderr, " hup");
        !           333:                else
        !           334:                        fprintf(stderr, " -hup");
        !           335: #endif
        !           336:        } else {
        !           337:                prflag(CRMOD, NULL, "nl");
        !           338:                prflag(ECHO, "echo", NULL);
        !           339:                prflag(LCASE, "lcase", NULL);
        !           340:                prflag(CBREAK, "cbreak", NULL);
        !           341:                prflag(TANDEM, "tandem", NULL);
        !           342:                prflag(CRT, "crt", NULL);
        !           343:        }
        !           344:        /* Delays not supported but should be included here */
        !           345:        prflag(XTABS, "-tabs", "tabs");
        !           346:        putc('\n', stderr);
        !           347: }
        !           348: 
        !           349: /*
        !           350:  * Print out a single flag
        !           351:  */
        !           352: prflag(mask, ons, offs)
        !           353: int mask;
        !           354: char *ons, *offs;
        !           355: {
        !           356:        if (sgttyb.sg_flags & mask) {
        !           357:                if (ons != NULL)
        !           358:                        fprintf(stderr, " %s", ons);
        !           359:        } else
        !           360:                if (offs != NULL)
        !           361:                        fprintf(stderr, " %s", offs);
        !           362: }
        !           363: 
        !           364: /*
        !           365:  * Print out a 4-value delay-type (or raw)
        !           366:  * flag.
        !           367:  */
        !           368: prdelay(mask, s1, s2, s3)
        !           369: register int mask;
        !           370: char *s1, *s2, *s3;
        !           371: {
        !           372:        register int t;
        !           373:        register int mode;
        !           374:        register char *s = NULL;
        !           375: 
        !           376:        mode = sgttyb.sg_flags;
        !           377:        while ((mask & 01) == 0) {
        !           378:                mask >>= 1;
        !           379:                mode >>= 1;
        !           380:        }
        !           381:        t = mode&mask;
        !           382:        if (t == 1)
        !           383:                s = s1;
        !           384:        else if (t == 2)
        !           385:                s = s2;
        !           386:        else if (t == 3)
        !           387:                s = s3;
        !           388:        if (s != NULL)
        !           389:                fprintf(stderr, " %s", s);
        !           390: }
        !           391: 
        !           392: /*
        !           393:  * Print out a character taking into
        !           394:  * account special characters.
        !           395:  */
        !           396: prchar(s, c)
        !           397: char *s;
        !           398: register unsigned char c;
        !           399: {
        !           400:        fprintf(stderr, "%s", s);
        !           401:        if (c == -1)
        !           402:                fprintf(stderr, "off");
        !           403:        else if (c == DEL)
        !           404:                fprintf(stderr, "DEL");
        !           405:        else if (c < ' ')
        !           406:                fprintf(stderr, "ctrl-%c", c+'A'-1);
        !           407:        else if (c > DEL)
        !           408:                fprintf(stderr, "'\\%3o'", c&0377);
        !           409:        else
        !           410:                fprintf(stderr, "'%c'", c);
        !           411: }
        !           412: 
        !           413: /*
        !           414:  * Get the modes and tchars value.
        !           415:  */
        !           416: getmodes()
        !           417: {
        !           418:        if (ioctl(ttyfd, TIOCGETC, &tchars) < 0
        !           419:         || ioctl(ttyfd, TIOCGETP, &sgttyb) < 0)
        !           420:                sterr("not a terminal");
        !           421: }
        !           422: 
        !           423: /*
        !           424:  * Set the modes as appropriate
        !           425:  * for the commands given.
        !           426:  */
        !           427: setmodes()
        !           428: {
        !           429:        if (sgtflag)
        !           430:                ioctl(ttyfd, scmd, &sgttyb);
        !           431:        if (tcflag)
        !           432:                ioctl(ttyfd, TIOCSETC, &tchars);
        !           433:        if (hupflag)
        !           434:                ioctl(ttyfd, hupflag, 0);
        !           435:        if (exclflag)
        !           436:                ioctl(ttyfd, exclflag, 0);
        !           437: }
        !           438: 
        !           439: /*
        !           440:  * Get another character from
        !           441:  * the command line (e.g. stty erase x)
        !           442:  */
        !           443: cget()
        !           444: {
        !           445:        register char *ap;
        !           446: 
        !           447:        if (gargc < 2)
        !           448:                usage();
        !           449:        ap = gargv[1];
        !           450:        gargv++;
        !           451:        gargc--;
        !           452:        if (strcmp(ap, "off") == 0)
        !           453:                return (NONE);
        !           454:        if (strcmp(ap, "DEL") == 0)
        !           455:                return (DEL);
        !           456:        if (strncmp(ap, "ctrl-", 5)==0 && ap[5]!='\0' && ap[6]=='\0')
        !           457:                return (ap[5]&~0140);
        !           458:        if (*ap=='\\' && ap[1]>='0' && ap[1]<='7') {
        !           459:                register char *cp;
        !           460:                register int n;
        !           461: 
        !           462:                n = 0;
        !           463:                cp = ap+1;
        !           464:                while (*cp>='0' && *cp<='7')
        !           465:                        n = n*8 + *cp++-'0';
        !           466:                if (*cp == '\0')
        !           467:                        return (n);
        !           468:        }
        !           469:        if (*ap=='^' && ap[1]!='\0') {
        !           470:                if (ap[2]=='\0' && ap[1]&0100)
        !           471:                        return (ap[1]&~0140);
        !           472:        } else if (*ap!='\0' && ap[1]=='\0')
        !           473:                return (*ap);
        !           474:        sterr("Badly-formed character `%s'", ap);
        !           475: }
        !           476: 
        !           477: /*
        !           478:  * Print out usage message
        !           479:  */
        !           480: usage()
        !           481: {
        !           482:        fprintf(stderr, "Usage: %s [-a] [-tttyname] [modes|speeds|chars|]\n",
        !           483:                argv0);
        !           484:        exit(1);
        !           485: }
        !           486: 
        !           487: /*
        !           488:  * Error messages with exit from stty.
        !           489:  */
        !           490: /* VARARGS */
        !           491: sterr(x)
        !           492: {
        !           493:        if (isatty(fileno(stdout)))
        !           494:                fprintf(stderr, "stty: ");
        !           495:        fprintf(stderr, "%r", &x);
        !           496:        fprintf(stderr, "\n");
        !           497:        exit (1);
        !           498: }
        !           499: 
        !           500: /*
        !           501:  * Set terminal parameters to something reasonable.
        !           502:  */
        !           503: sane()
        !           504: {
        !           505:        sgtflag = 1;
        !           506:        sgttyb.sg_flags &= ~(RAW | CBREAK);     /* cooked -cbreak */
        !           507:        sgttyb.sg_flags |= (CRMOD | ECHO);      /* -nl echo */
        !           508: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.