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

1.1     ! root        1: /*
        !             2:  * File:       stty.c
        !             3:  *
        !             4:  * Purpose:    COH 386 stty command, based on termio
        !             5:  *     This version is more S5 compliant than COH 286's was.
        !             6:  *     It gets status from stdin, and writes to stdout.
        !             7:  *     Using -g flag reports termio contents as hex dump
        !             8:  *     Input can be a string of 12 hex numbers separated by colons,
        !             9:  *       same as output using -g flag.
        !            10:  *
        !            11:  * $Log:       stty.c,v $
        !            12:  * Revision 1.8  93/09/08  08:52:20  bin
        !            13:  * hal:report tabs/-tabs in brief output
        !            14:  * 
        !            15:  * Revision 1.4  92/08/11  15:59:27  root
        !            16:  * COH 4.0.1
        !            17:  * 
        !            18:  */
        !            19: 
        !            20: /*
        !            21:  * ----------------------------------------------------------------------
        !            22:  * Includes.
        !            23:  */
        !            24: #include <stdio.h>
        !            25: #include <termio.h>
        !            26: 
        !            27: /*
        !            28:  * ----------------------------------------------------------------------
        !            29:  * Definitions.
        !            30:  *     Constants.
        !            31:  *     Macros with argument lists.
        !            32:  *     Typedefs.
        !            33:  *     Enums.
        !            34:  */
        !            35: #define NAMELN         8
        !            36: #define OPTNAMELEN     16
        !            37: 
        !            38: #define DEL    0x7F
        !            39: #define NUL    0
        !            40: 
        !            41: typedef unsigned char uchar;
        !            42: typedef unsigned int  uint;
        !            43: typedef unsigned long ulong;
        !            44: /*
        !            45:  * For fields in c_[iocl]flag field in termio,
        !            46:  *     optname is the name of the stty command switch
        !            47:  *     mask has 1's where bits are modified
        !            48:  *     val has the correct value at the bits in question
        !            49:  */
        !            50: typedef struct {
        !            51:        char    optname[OPTNAMELEN];
        !            52:        short   mask;
        !            53:        short   val;
        !            54: } FLAG_OPT;
        !            55: 
        !            56: /*
        !            57:  * ----------------------------------------------------------------------
        !            58:  * Functions.
        !            59:  *     Import Functions.
        !            60:  *     Export Functions.
        !            61:  *     Local Functions.
        !            62:  */
        !            63: static void baudstr();
        !            64: static int c_opt();
        !            65: static int combo();
        !            66: static void dump_all();
        !            67: static void dump_brief();
        !            68: static void dump_cc();
        !            69: static void dump_ch();
        !            70: static void dump_cflag();
        !            71: static void dump_hex();
        !            72: static void dump_iflag();
        !            73: static void dump_lflag();
        !            74: static void dump_oflag();
        !            75: static int num_opt();
        !            76: static void panic();
        !            77: static int set_ch();
        !            78: static int set_num();
        !            79: static int set_speed();
        !            80: static void set_hex();
        !            81: static int simple();
        !            82: 
        !            83: /*
        !            84:  * ----------------------------------------------------------------------
        !            85:  * Global Data.
        !            86:  *     Import Variables.
        !            87:  *     Export Variables.
        !            88:  *     Local Variables.
        !            89:  */
        !            90: static int gflag;
        !            91: static int sflag;      /* true if setting termio rather than getting */
        !            92: static struct termio t;
        !            93: 
        !            94: int    g_argc;
        !            95: char   ** g_argv;
        !            96: char   lbuf[200];
        !            97: 
        !            98: FLAG_OPT i_list[] = {
        !            99:        { "ignbrk", IGNBRK, IGNBRK },
        !           100:        { "-ignbrk", IGNBRK, 0 },
        !           101:        { "brkint", BRKINT, BRKINT },
        !           102:        { "-brkint", BRKINT, 0 },
        !           103:        { "ignpar", IGNPAR, IGNPAR },
        !           104:        { "-ignpar", IGNPAR, 0 },
        !           105:        { "parmrk", PARMRK, PARMRK },
        !           106:        { "-parmrk", PARMRK, 0 },
        !           107:        { "inpck", INPCK, INPCK },
        !           108:        { "-inpck", INPCK, 0 },
        !           109:        { "istrip", ISTRIP, ISTRIP },
        !           110:        { "-istrip", ISTRIP, 0 },
        !           111:        { "inlcr", INLCR, INLCR },
        !           112:        { "-inlcr", INLCR, 0 },
        !           113:        { "igncr", IGNCR, IGNCR },
        !           114:        { "-igncr", IGNCR, 0 },
        !           115:        { "icrnl", ICRNL, ICRNL },
        !           116:        { "-icrnl", ICRNL, 0 },
        !           117:        { "iuclc", IUCLC, IUCLC },
        !           118:        { "-iuclc", IUCLC, 0 },
        !           119:        { "ixon", IXON, IXON },
        !           120:        { "-ixon", IXON, 0 },
        !           121:        { "ixany", IXANY, IXANY },
        !           122:        { "-ixany", IXANY, 0 },
        !           123:        { "ixoff", IXOFF, IXOFF },
        !           124:        { "-ixoff", IXOFF, 0 },
        !           125:        { "", 0, 0 }
        !           126: };
        !           127: FLAG_OPT o_list[] = {
        !           128:        { "opost", OPOST, OPOST },
        !           129:        { "-opost", OPOST, 0 },
        !           130:        { "olcuc", OLCUC, OLCUC },
        !           131:        { "-olcuc", OLCUC, 0 },
        !           132:        { "onlcr", ONLCR, ONLCR },
        !           133:        { "-onlcr", ONLCR, 0 },
        !           134:        { "ocrnl", OCRNL, OCRNL },
        !           135:        { "-ocrnl", OCRNL, 0 },
        !           136:        { "onocr", ONOCR, ONOCR },
        !           137:        { "-onocr", ONOCR, 0 },
        !           138:        { "onlret", ONLRET, ONLRET },
        !           139:        { "-onlret", ONLRET, 0 },
        !           140:        { "ofill", OFILL, OFILL },
        !           141:        { "-ofill", OFILL, 0 },
        !           142:        { "ofdel", OFDEL, OFDEL },
        !           143:        { "-ofdel", OFDEL, 0 },
        !           144:        { "nl0", NLDLY, NL0 },
        !           145:        { "nl1", NLDLY, NL1 },
        !           146:        { "cr0", CRDLY, CR0 },
        !           147:        { "cr1", CRDLY, CR1 },
        !           148:        { "cr2", CRDLY, CR2 },
        !           149:        { "cr3", CRDLY, CR3 },
        !           150:        { "tab0", TABDLY, TAB0 },
        !           151:        { "tab1", TABDLY, TAB1 },
        !           152:        { "tab2", TABDLY, TAB2 },
        !           153:        { "tab3", TABDLY, TAB3 },
        !           154:        { "bs0", BSDLY, BS0 },
        !           155:        { "bs1", BSDLY, BS1 },
        !           156:        { "vt0", VTDLY, VT0 },
        !           157:        { "vt1", VTDLY, VT1 },
        !           158:        { "ff0", FFDLY, FF0 },
        !           159:        { "ff1", FFDLY, FF1 },
        !           160:        { "", 0, 0 }
        !           161: };
        !           162: FLAG_OPT c_list[] = {
        !           163:        { "0", CBAUD, B0 },
        !           164:        { "50", CBAUD, B50 },
        !           165:        { "75", CBAUD, B75 },
        !           166:        { "110", CBAUD, B110 },
        !           167:        { "134", CBAUD, B134 },
        !           168:        { "150", CBAUD, B150 },
        !           169:        { "200", CBAUD, B200 },
        !           170:        { "300", CBAUD, B300 },
        !           171:        { "600", CBAUD, B600 },
        !           172:        { "1200", CBAUD, B1200 },
        !           173:        { "1800", CBAUD, B1800 },
        !           174:        { "2400", CBAUD, B2400 },
        !           175:        { "4800", CBAUD, B4800 },
        !           176:        { "9600", CBAUD, B9600 },
        !           177:        { "19200", CBAUD, B19200 },
        !           178:        { "38400", CBAUD, B38400 },
        !           179:        { "cs5", CSIZE, CS5 },
        !           180:        { "cs6", CSIZE, CS6 },
        !           181:        { "cs7", CSIZE, CS7 },
        !           182:        { "cs8", CSIZE, CS8 },
        !           183:        { "cstopb", CSTOPB, CSTOPB },
        !           184:        { "-cstopb", CSTOPB, 0 },
        !           185:        { "cread", CREAD, CREAD },
        !           186:        { "-cread", CREAD, 0 },
        !           187:        { "parenb", PARENB, PARENB },
        !           188:        { "-parenb", PARENB, 0 },
        !           189:        { "parodd", PARODD, PARODD },
        !           190:        { "-parodd", PARODD, 0 },
        !           191:        { "hupcl", HUPCL, HUPCL },
        !           192:        { "-hupcl", HUPCL, 0 },
        !           193:        { "hup", HUPCL, HUPCL },
        !           194:        { "-hup", HUPCL, 0 },
        !           195:        { "clocal", CLOCAL, CLOCAL },
        !           196:        { "-clocal", CLOCAL, 0 },
        !           197:        { "", 0, 0 }
        !           198: };
        !           199: FLAG_OPT l_list[] = {
        !           200:        { "isig", ISIG, ISIG },
        !           201:        { "-isig", ISIG, 0 },
        !           202:        { "icanon", ICANON, ICANON },
        !           203:        { "-icanon", ICANON, 0 },
        !           204:        { "xcase", XCASE, XCASE },
        !           205:        { "-xcase", XCASE, 0 },
        !           206:        { "echo", ECHO, ECHO },
        !           207:        { "-echo", ECHO, 0 },
        !           208:        { "echoe", ECHOE, ECHOE },
        !           209:        { "-echoe", ECHOE, 0 },
        !           210:        { "echok", ECHOK, ECHOK },
        !           211:        { "-echok", ECHOK, 0 },
        !           212:        { "echonl", ECHONL, ECHONL },
        !           213:        { "-echonl", ECHONL, 0 },
        !           214:        { "noflsh", NOFLSH, NOFLSH },
        !           215:        { "-noflsh", NOFLSH, 0 },
        !           216:        { "", 0, 0 }
        !           217: };
        !           218: 
        !           219: /*
        !           220:  * ----------------------------------------------------------------------
        !           221:  * Code.
        !           222:  */
        !           223: 
        !           224: main(argc, argv, envp)
        !           225: int argc;
        !           226: char ** argv, ** envp;
        !           227: {
        !           228:        int     argn;
        !           229:        int     want_ch = -1;
        !           230:        int     want_num = -1;
        !           231:        int     want_line = 0;
        !           232:        unsigned int    line;
        !           233:        char    * arg;
        !           234:        int     speed;
        !           235: 
        !           236:        g_argc = argc;
        !           237:        g_argv = argv;
        !           238: 
        !           239:        if (ioctl(0, TCGETA, &t) == -1)
        !           240:                panic("can't get terminal parameters for stdin");
        !           241:        /*
        !           242:         * Decide which format the command line is:
        !           243:         *      stty
        !           244:         *      stty -a
        !           245:         *      stty -g
        !           246:         *      stty x:x:...:x  (12 hex values with colon separators)
        !           247:         *      stty arglist...
        !           248:         */
        !           249:        if (argc == 1) {
        !           250:                dump_brief();
        !           251:                goto stty_done;
        !           252:        }
        !           253:        if (argc == 2) {
        !           254:                if (strcmp(argv[1], "-a") == 0) {
        !           255:                        dump_all();
        !           256:                        goto stty_done;
        !           257:                }
        !           258:                if (strcmp(argv[1], "-g") == 0) {
        !           259:                        dump_hex();
        !           260:                        goto stty_done;
        !           261:                }
        !           262:                if (index(argv[1], ':')) {
        !           263:                        set_hex();
        !           264:                        goto stty_done;
        !           265:                }
        !           266:        }
        !           267:        
        !           268:        /*
        !           269:         * Process an argument list.
        !           270:         * Possible argument formats are:
        !           271:         *      nnnn            (decimal baud rate)
        !           272:         *      line nnnn       (line discipline spec)
        !           273:         *      {intr|quit|erase|kill|eof|eol} {c|^c|^?|^-|0xnn}
        !           274:         *      {min|time} {nnn}
        !           275:         *      simple_option
        !           276:         *      combined_option
        !           277:         */
        !           278:        for (argn = 1; argn < argc; argn++) {
        !           279:                arg = argv[argn];
        !           280:                if (want_ch >= 0) {
        !           281:                        if (!set_ch(want_ch, arg))
        !           282:                                fprintf(stderr,
        !           283:                                  "stty: invalid option %s %s\n",
        !           284:                                  argv[argn-1], arg);
        !           285:                        want_ch = -1;
        !           286:                        continue;
        !           287:                }
        !           288:                if (want_num >= 0) {
        !           289:                        if (!set_num(want_num, arg))
        !           290:                                fprintf(stderr,
        !           291:                                  "stty: invalid option %s %s\n",
        !           292:                                  argv[argn-1], arg);
        !           293:                        want_num = -1;
        !           294:                        continue;
        !           295:                }
        !           296:                if (want_line) {
        !           297:                        if (sscanf(arg, "%d", &line) == 1 && line < 128)
        !           298:                                t.c_line = line;
        !           299:                        else
        !           300:                                fprintf(stderr,
        !           301:                                  "stty: invalid option line %s\n", arg);
        !           302:                        want_line = 0;
        !           303:                        continue;
        !           304:                }
        !           305: #if 0
        !           306:                if (sscanf(arg, "%d", &speed) == 1) {
        !           307:                        if (!set_speed(speed))
        !           308:                                fprintf(stderr,
        !           309:                                  "stty: invalid speed %d\n", speed);
        !           310:                        continue;
        !           311:                }
        !           312: #endif
        !           313:                if (strcmp(arg, "line") == 0) {
        !           314:                        want_line = 1;
        !           315:                        continue;
        !           316:                }
        !           317:                if ((want_ch = c_opt(arg)) >= 0)
        !           318:                        continue;
        !           319:                if ((want_num = num_opt(arg)) >= 0)
        !           320:                        continue;
        !           321:                if (simple(arg, i_list, &t.c_iflag))
        !           322:                        continue;
        !           323:                if (simple(arg, o_list, &t.c_oflag))
        !           324:                        continue;
        !           325:                if (simple(arg, c_list, &t.c_cflag))
        !           326:                        continue;
        !           327:                if (simple(arg, l_list, &t.c_lflag))
        !           328:                        continue;
        !           329:                if (combo(arg))
        !           330:                        continue;
        !           331:                fprintf(stderr, "stty: invalid option %s\n", arg);
        !           332:        }
        !           333:        if (ioctl(0, TCSETA, &t) == -1)
        !           334:                panic("can't set terminal parameters");
        !           335:        if (want_ch >= 0 || want_line)
        !           336:                fprintf(stderr, "stty: incomplete option %s\n", argv[argn-1]);
        !           337: stty_done:
        !           338:        exit(0);
        !           339: }
        !           340: 
        !           341: /*
        !           342:  * dump_all()
        !           343:  *
        !           344:  * Display all termio settings.
        !           345:  */
        !           346: void
        !           347: dump_all()
        !           348: {
        !           349:        dump_iflag();
        !           350:        dump_oflag();
        !           351:        dump_cflag();
        !           352:        dump_lflag();
        !           353:        printf("line=%d\n", t.c_line);
        !           354:        dump_cc();
        !           355: }
        !           356: 
        !           357: void
        !           358: dump_iflag()
        !           359: {
        !           360:        short f = t.c_iflag;
        !           361: 
        !           362:        lbuf[0] = '\0';
        !           363:        strcat(lbuf, (f&IGNBRK)?"ignbrk\t":"-ignbrk\t");
        !           364:        strcat(lbuf, (f&BRKINT)?"brkint\t":"-brkint\t");
        !           365:        strcat(lbuf, (f&IGNPAR)?"ignpar\t":"-ignpar\t");
        !           366:        strcat(lbuf, (f&PARMRK)?"parmrk\t":"-parmrk\t");
        !           367:        strcat(lbuf, (f&INPCK)?"inpck\t":"-inpck\t");
        !           368:        strcat(lbuf, (f&ISTRIP)?"istrip\t":"-istrip\t");
        !           369:        strcat(lbuf, (f&INLCR)?"inlcr\t":"-inlcr\t");
        !           370:        strcat(lbuf, (f&IGNCR)?"igncr\n":"-igncr\n");
        !           371:        fputs(lbuf, stdout);
        !           372: 
        !           373:        lbuf[0] = '\0';
        !           374:        strcat(lbuf, (f&ICRNL)?"icrnl\t":"-icrnl\t");
        !           375:        strcat(lbuf, (f&IUCLC)?"iuclc\t":"-iuclc\t");
        !           376:        strcat(lbuf, (f&IXON)?"ixon\t":"-ixon\t");
        !           377:        strcat(lbuf, (f&IXANY)?"ixany\t":"-ixany\t");
        !           378:        strcat(lbuf, (f&IXOFF)?"ixoff\n":"-ixoff\n");
        !           379:        fputs(lbuf, stdout);
        !           380: }
        !           381: 
        !           382: void
        !           383: dump_oflag()
        !           384: {
        !           385:        short f = t.c_oflag;
        !           386: 
        !           387:        lbuf[0] = '\0';
        !           388:        strcat(lbuf, (f&OPOST)?"opost\t":"-opost\t");
        !           389:        strcat(lbuf, (f&OLCUC)?"olcuc\t":"-olcuc\t");
        !           390:        strcat(lbuf, (f&ONLCR)?"onlcr\t":"-onlcr\t");
        !           391:        strcat(lbuf, (f&OCRNL)?"ocrnl\t":"-ocrnl\t");
        !           392:        strcat(lbuf, (f&ONOCR)?"onocr\t":"-onocr\t");
        !           393:        strcat(lbuf, (f&ONLRET)?"onlret\t":"-onlret\t");
        !           394:        strcat(lbuf, (f&OFILL)?"ofill\t":"-ofill\t");
        !           395:        strcat(lbuf, (f&OFDEL)?"ofdel\n":"-ofdel\n");
        !           396:        fputs(lbuf, stdout);
        !           397: 
        !           398:        lbuf[0] = '\0';
        !           399:        strcat(lbuf, (f&NLDLY)?"nl1\t":"nl0\t");
        !           400:        switch(f&CRDLY) {
        !           401:        case 0x0000:  strcat(lbuf, "cr0\t");  break;
        !           402:        case 0x0200:  strcat(lbuf, "cr1\t");  break;
        !           403:        case 0x0400:  strcat(lbuf, "cr2\t");  break;
        !           404:        case 0x0600:  strcat(lbuf, "cr3\t");  break;
        !           405:        }
        !           406:        switch(f&TABDLY) {
        !           407:        case 0x0000:  strcat(lbuf, "tab0\t");  break;
        !           408:        case 0x0800:  strcat(lbuf, "tab1\t");  break;
        !           409:        case 0x1000:  strcat(lbuf, "tab2\t");  break;
        !           410:        case 0x1800:  strcat(lbuf, "tab3\t");  break;
        !           411:        }
        !           412:        strcat(lbuf, (f&BSDLY)?"bs1\t":"bs0\t");
        !           413:        strcat(lbuf, (f&VTDLY)?"vt1\t":"vt0\t");
        !           414:        strcat(lbuf, (f&FFDLY)?"ff1\n":"ff0\n");
        !           415:        fputs(lbuf, stdout);
        !           416: }
        !           417: 
        !           418: void
        !           419: dump_cflag()
        !           420: {
        !           421:        short f = t.c_cflag;
        !           422: 
        !           423:        lbuf[0] = '\0';
        !           424:        baudstr(f);
        !           425:        switch(f&CSIZE) {
        !           426:        case 0x0000:  strcat(lbuf, "cs5\t");  break;
        !           427:        case 0x0010:  strcat(lbuf, "cs6\t");  break;
        !           428:        case 0x0020:  strcat(lbuf, "cs7\t");  break;
        !           429:        case 0x0030:  strcat(lbuf, "cs8\t");  break;
        !           430:        }
        !           431:        strcat(lbuf, (f&CSTOPB)?"cstopb\t":"-cstopb\t");
        !           432:        strcat(lbuf, (f&CREAD)?"cread\t":"-cread\t");
        !           433:        strcat(lbuf, (f&PARENB)?"parenb\t":"-parenb\t");
        !           434:        strcat(lbuf, (f&PARODD)?"parodd\t":"-parodd\t");
        !           435:        strcat(lbuf, (f&HUPCL)?"hupcl\t":"-hupcl\t");
        !           436:        strcat(lbuf, (f&CLOCAL)?"clocal\n":"-clocal\n");
        !           437:        fputs(lbuf, stdout);
        !           438: }
        !           439: 
        !           440: void
        !           441: dump_lflag()
        !           442: {
        !           443:        short f = t.c_lflag;
        !           444: 
        !           445:        lbuf[0] = '\0';
        !           446:        strcat(lbuf, (f&ISIG)?"isig\t":"-isig\t");
        !           447:        strcat(lbuf, (f&ICANON)?"icanon\t":"-icanon\t");
        !           448:        strcat(lbuf, (f&XCASE)?"xcase\t":"-xcase\t");
        !           449:        strcat(lbuf, (f&ECHO)?"echo\t":"-echo\t");
        !           450:        strcat(lbuf, (f&ECHOE)?"echoe\t":"-echoe\t");
        !           451:        strcat(lbuf, (f&ECHOK)?"echok\t":"-echok\t");
        !           452:        strcat(lbuf, (f&ECHONL)?"echonl\t":"-echonl\t");
        !           453:        strcat(lbuf, (f&NOFLSH)?"noflsh\n":"-noflsh\n");
        !           454:        fputs(lbuf, stdout);
        !           455: }
        !           456: 
        !           457: void
        !           458: dump_cc()
        !           459: {
        !           460:        dump_ch("intr", t.c_cc[VINTR]);
        !           461:        dump_ch("quit", t.c_cc[VQUIT]);
        !           462:        dump_ch("erase", t.c_cc[VERASE]);
        !           463:        dump_ch("kill", t.c_cc[VKILL]);
        !           464:        if (t.c_lflag & ICANON) {
        !           465:                dump_ch("eof", t.c_cc[VEOF]);
        !           466:                dump_ch("eol", t.c_cc[VEOL]);
        !           467:                dump_ch("eol2", t.c_cc[VEOL2]);
        !           468:        } else {
        !           469:                printf("min=%d  time=%d  ", t.c_cc[VMIN], t.c_cc[VTIME]);
        !           470:                dump_ch("swtch", t.c_cc[VSWTCH]);
        !           471:        }
        !           472:        putchar('\n');
        !           473: }
        !           474: 
        !           475: void
        !           476: dump_ch(tag, ch)
        !           477: char   * tag;
        !           478: unsigned char  ch;
        !           479: {
        !           480:        if (ch == '\0')
        !           481:                printf("%s=<undef>  ", tag);
        !           482:        else if (ch < 0x20)
        !           483:                printf("%s=^%c  ", tag, ch|0x60);
        !           484: #if 0
        !           485:        else if (ch > 0x7f)
        !           486:                printf("%s=%x  ", tag, ch);
        !           487: #endif
        !           488:        else if (ch != 0x7f)
        !           489:                printf("%s=%c  ", tag, ch);
        !           490:        else
        !           491:                printf("%s=DEL  ", tag);
        !           492: }
        !           493: 
        !           494: /*
        !           495:  * dump_brief()
        !           496:  *
        !           497:  * Display names for selected settings.
        !           498:  */
        !           499: void
        !           500: dump_brief()
        !           501: {
        !           502:        short f;
        !           503: 
        !           504:        f = t.c_iflag;
        !           505:        lbuf[0] = '\0';
        !           506:        strcat(lbuf, (f&BRKINT)?"brkint\t":"-brkint\t");
        !           507:        strcat(lbuf, (f&INPCK)?"inpck\t":"-inpck\t");
        !           508:        strcat(lbuf, (f&ICRNL)?"icrnl\t":"-icrnl\t");
        !           509: 
        !           510:        f = t.c_oflag;
        !           511:        strcat(lbuf, (f&OPOST)?"opost\t":"-opost\t");
        !           512:        strcat(lbuf, (f&ONLCR)?"onlcr\t":"-onlcr\t");
        !           513:        switch(f&TABDLY) {
        !           514:        case 0x0000:  strcat(lbuf, "tab0\n");  break;
        !           515:        case 0x0800:  strcat(lbuf, "tab1\n");  break;
        !           516:        case 0x1000:  strcat(lbuf, "tab2\n");  break;
        !           517:        case 0x1800:  strcat(lbuf, "tab3\n");  break;
        !           518:        }
        !           519:        fputs(lbuf, stdout);
        !           520: 
        !           521: 
        !           522:        f = t.c_cflag;
        !           523:        lbuf[0] = '\0';
        !           524:        baudstr(f);
        !           525:        strcat(lbuf, (f&PARENB)?"parenb\t":"-parenb\t");
        !           526:        strcat(lbuf, (f&PARODD)?"parodd\t":"-parodd\t");
        !           527:        strcat(lbuf, (f&HUPCL)?"hupcl\n":"-hupcl\n");
        !           528:        fputs(lbuf, stdout);
        !           529: 
        !           530:        f = t.c_lflag;
        !           531:        lbuf[0] = '\0';
        !           532:        strcat(lbuf, (f&ICANON)?"icanon\t":"-icanon\t");
        !           533:        strcat(lbuf, (f&ECHO)?"echo\t":"-echo\t");
        !           534:        strcat(lbuf, (f&ECHOE)?"echoe\t":"-echoe\t");
        !           535:        strcat(lbuf, (f&ECHOK)?"echok\n":"-echok\n");
        !           536:        fputs(lbuf, stdout);
        !           537: 
        !           538:        dump_ch("intr", t.c_cc[VINTR]);
        !           539:        dump_ch("quit", t.c_cc[VQUIT]);
        !           540:        dump_ch("erase", t.c_cc[VERASE]);
        !           541:        dump_ch("kill", t.c_cc[VKILL]);
        !           542:        putchar('\n');
        !           543: }
        !           544: 
        !           545: /*
        !           546:  * set_hex()
        !           547:  *
        !           548:  * Copy sequence of 12 hex input values to termio struct
        !           549:  * and send to device.
        !           550:  */
        !           551: void
        !           552: set_hex()
        !           553: {
        !           554:        int j[12];      /* need int size for %x input */
        !           555: 
        !           556:        /*
        !           557:         * Arg must be 12 hex numbers separated by colons.
        !           558:         */
        !           559:        t.c_line = 0;
        !           560:        if (12 == sscanf(g_argv[1],
        !           561:          "%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x",
        !           562:          j,j+1,j+2,j+3,j+4,j+5,
        !           563:          j+6,j+7,j+8,j+9,j+10,j+11)) { t.c_iflag = j[0];
        !           564:                t.c_oflag = j[1];
        !           565:                t.c_cflag = j[2];
        !           566:                t.c_lflag = j[3];
        !           567:                t.c_cc[0] = j[4];
        !           568:                t.c_cc[1] = j[5];
        !           569:                t.c_cc[2] = j[6];
        !           570:                t.c_cc[3] = j[7];
        !           571:                t.c_cc[4] = j[8];
        !           572:                t.c_cc[5] = j[9];
        !           573:                t.c_cc[6] = j[10];
        !           574:                t.c_cc[7] = j[11];
        !           575:                if (ioctl(0, TCSETA, &t) == -1)
        !           576:                        panic("can't set terminal parameters");
        !           577:        } else
        !           578:                panic("bad argument - expected 12 hex values");
        !           579: }
        !           580: 
        !           581: /*
        !           582:  * dump_hex()
        !           583:  *
        !           584:  * Dump hex contents of termio struct "t" to stdout.
        !           585:  */
        !           586: void
        !           587: dump_hex()
        !           588: {
        !           589:        printf("%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x\n",
        !           590:          t.c_iflag, t.c_oflag, t.c_cflag, t.c_lflag,
        !           591:          t.c_cc[0], t.c_cc[1], t.c_cc[2], t.c_cc[3],
        !           592:          t.c_cc[4], t.c_cc[5], t.c_cc[6], t.c_cc[7]);
        !           593: }
        !           594: 
        !           595: /*
        !           596:  * panic()
        !           597:  *
        !           598:  * Display fatal error message and quit.
        !           599:  */
        !           600: void
        !           601: panic(s)
        !           602: char * s;
        !           603: {
        !           604:        fprintf(stderr, "stty: %s\n", s);
        !           605:        exit(1);
        !           606: }
        !           607: 
        !           608: /*
        !           609:  * baudstr()
        !           610:  *
        !           611:  * Append to lbuf the ASCII text for a given baud rate in f.
        !           612:  */
        !           613: void
        !           614: baudstr(f)
        !           615: int f;
        !           616: {
        !           617:        switch(f&CBAUD) {
        !           618:        case B0:  strcat(lbuf, "0\t");  break;
        !           619:        case B50:  strcat(lbuf, "50\t");  break;
        !           620:        case B75:  strcat(lbuf, "75\t");  break;
        !           621:        case B110:  strcat(lbuf, "110\t");  break;
        !           622:        case B134:  strcat(lbuf, "134\t");  break;
        !           623:        case B150:  strcat(lbuf, "150\t");  break;
        !           624:        case B200:  strcat(lbuf, "200\t");  break;
        !           625:        case B300:  strcat(lbuf, "300\t");  break;
        !           626:        case B600:  strcat(lbuf, "600\t");  break;
        !           627:        case B1200:  strcat(lbuf, "1200\t");  break;
        !           628:        case B1800:  strcat(lbuf, "1800\t");  break;
        !           629:        case B2400:  strcat(lbuf, "2400\t");  break;
        !           630:        case B4800:  strcat(lbuf, "4800\t");  break;
        !           631:        case B9600:  strcat(lbuf, "9600\t");  break;
        !           632:        case B19200:  strcat(lbuf, "19200\t");  break;
        !           633:        case B38400:  strcat(lbuf, "38400\t");  break;
        !           634:        }
        !           635: }
        !           636: 
        !           637: int
        !           638: simple(opt, list, flagp)
        !           639: char           * opt;
        !           640: FLAG_OPT       * list;
        !           641: short          * flagp;
        !           642: {
        !           643:        int     ret = 0;
        !           644:        int     i;
        !           645: 
        !           646:        for (i = 0; list[i].optname[0] && !ret; i++) {
        !           647:                if (strcmp(opt, list[i].optname) == 0) {
        !           648:                        *flagp &= ~(list[i].mask);
        !           649:                        *flagp |= list[i].val;
        !           650:                        ret = 1;
        !           651:                }
        !           652:        }
        !           653:        return ret;
        !           654: }
        !           655: 
        !           656: int
        !           657: combo(opt)
        !           658: char * opt;
        !           659: {
        !           660:        int     ret = 1;
        !           661: 
        !           662:        if (strcmp(opt, "sane") == 0) {
        !           663:                simple("icrnl", c_list, &t.c_iflag);
        !           664:                simple("opost", o_list, &t.c_oflag);
        !           665:                simple("onlcr", o_list, &t.c_oflag);
        !           666:                simple("isig", l_list, &t.c_lflag);
        !           667:                simple("icanon", l_list, &t.c_lflag);
        !           668:                simple("-xcase", l_list, &t.c_lflag);
        !           669:                simple("echo", l_list, &t.c_lflag);
        !           670:                simple("echoe", l_list, &t.c_lflag);
        !           671:                simple("echok", l_list, &t.c_lflag);
        !           672:                t.c_cc[VERASE] = '\b';
        !           673:                goto combo_done;
        !           674:        }
        !           675:        if (strcmp(opt, "evenp") == 0) {
        !           676:                simple("parenb", c_list, &t.c_cflag);
        !           677:                simple("-parodd", c_list, &t.c_cflag);
        !           678:                simple("cs7", c_list, &t.c_cflag);
        !           679:                goto combo_done;
        !           680:        }
        !           681:        if (strcmp(opt, "parity") == 0) {
        !           682:                combo("evenp");
        !           683:                goto combo_done;
        !           684:        }
        !           685:        if (strcmp(opt, "oddp") == 0) {
        !           686:                simple("parenb", c_list, &t.c_cflag);
        !           687:                simple("parodd", c_list, &t.c_cflag);
        !           688:                simple("cs7", c_list, &t.c_cflag);
        !           689:                goto combo_done;
        !           690:        }
        !           691:        if (strcmp(opt, "-parity") == 0) {
        !           692:                simple("-parenb", c_list, &t.c_cflag);
        !           693:                simple("cs8", c_list, &t.c_cflag);
        !           694:                goto combo_done;
        !           695:        }
        !           696:        if (strcmp(opt, "-evenp") == 0) {
        !           697:                simple("-parenb", c_list, &t.c_cflag);
        !           698:                simple("cs8", c_list, &t.c_cflag);
        !           699:                goto combo_done;
        !           700:        }
        !           701:        if (strcmp(opt, "-oddp") == 0) {
        !           702:                simple("-parenb", c_list, &t.c_cflag);
        !           703:                simple("cs8", c_list, &t.c_cflag);
        !           704:                goto combo_done;
        !           705:        }
        !           706:        if (strcmp(opt, "raw") == 0) {
        !           707:                t.c_iflag = 0;
        !           708:                t.c_oflag &= ~OPOST;
        !           709:                t.c_cflag &= ~(PARODD|PARENB);
        !           710:                t.c_cflag |= (CS8|CREAD);
        !           711:                t.c_lflag &= ~(ECHONL|ISIG|ICANON|XCASE);
        !           712:                goto combo_done;
        !           713:        }
        !           714:        if (strcmp(opt, "-raw") == 0) {
        !           715:                t.c_iflag |= BRKINT|IGNPAR|ISTRIP|ICRNL|IXON;
        !           716:                t.c_oflag |= OPOST|ONLCR;
        !           717:                t.c_cflag |= (PARENB|CS7|CREAD);
        !           718:                t.c_iflag |= ISIG|ICANON;
        !           719:                goto combo_done;
        !           720:        }
        !           721:        if (strcmp(opt, "cooked") == 0) {
        !           722:                combo("-raw");
        !           723:                goto combo_done;
        !           724:        }
        !           725:        if (strcmp(opt, "nl") == 0) {
        !           726:                simple("-icrnl", i_list, &t.c_iflag);
        !           727:                simple("-onlcr", o_list, &t.c_oflag);
        !           728:                goto combo_done;
        !           729:        }
        !           730:        if (strcmp(opt, "-nl") == 0) {
        !           731:                simple("icrnl", i_list, &t.c_iflag);
        !           732:                simple("-inlcr", i_list, &t.c_iflag);
        !           733:                simple("-igncr", i_list, &t.c_iflag);
        !           734:                simple("onlcr", o_list, &t.c_oflag);
        !           735:                simple("-ocrnl", o_list, &t.c_oflag);
        !           736:                simple("-onlret", o_list, &t.c_oflag);
        !           737:                goto combo_done;
        !           738:        }
        !           739:        if (strcmp(opt, "lcase") == 0) {
        !           740:                t.c_lflag |= XCASE;
        !           741:                t.c_iflag |= IUCLC;
        !           742:                t.c_oflag |= OLCUC;
        !           743:                goto combo_done;
        !           744:        }
        !           745:        if (strcmp(opt, "-lcase") == 0) {
        !           746:                t.c_lflag &= ~XCASE;
        !           747:                t.c_iflag &= ~IUCLC;
        !           748:                t.c_oflag &= ~OLCUC;
        !           749:                goto combo_done;
        !           750:        }
        !           751:        if (strcmp(opt, "LCASE") == 0) {
        !           752:                combo("lcase");
        !           753:                goto combo_done;
        !           754:        }
        !           755:        if (strcmp(opt, "-LCASE") == 0) {
        !           756:                combo("-lcase");
        !           757:                goto combo_done;
        !           758:        }
        !           759:        if (strcmp(opt, "tabs") == 0) {
        !           760:                simple("tab0", o_list, &t.c_oflag);
        !           761:                goto combo_done;
        !           762:        }
        !           763:        if (strcmp(opt, "-tabs") == 0) {
        !           764:                simple("tab3", o_list, &t.c_oflag);
        !           765:                goto combo_done;
        !           766:        }
        !           767:        if (strcmp(opt, "ek") == 0) {
        !           768:                t.c_cc[VERASE] = '#';
        !           769:                t.c_cc[VKILL] = '@';
        !           770:                goto combo_done;
        !           771:        }
        !           772: 
        !           773:        ret = 0;
        !           774: combo_done:
        !           775:        return ret;
        !           776: }
        !           777: 
        !           778: /*
        !           779:  * See if current argument specifies a character option.
        !           780:  * If so, return the index into the c_cc array.
        !           781:  * Else, return -1.
        !           782:  */
        !           783: int
        !           784: c_opt(opt)
        !           785: char * opt;
        !           786: {
        !           787:        int     ret = -1;
        !           788:        int     i;
        !           789:        static struct {
        !           790:                char    name[NAMELN];
        !           791:                int     index;
        !           792:        } vlist[] = {
        !           793:                { "intr",       0},
        !           794:                { "quit",       1},
        !           795:                { "erase",      2},
        !           796:                { "kill",       3},
        !           797:                { "eof",        4},
        !           798:                { "eol",        5},
        !           799:        };
        !           800: 
        !           801:        for (i = 0; i < sizeof(vlist)/sizeof(vlist[0]); i++) {
        !           802:                if (strcmp(opt, vlist[i].name) == 0) {
        !           803:                        ret = vlist[i].index;
        !           804:                        break;
        !           805:                }
        !           806:        }
        !           807:        return ret;
        !           808: }
        !           809: 
        !           810: /*
        !           811:  * See if current argument specifies a numeric option.
        !           812:  * If so, return the index into the c_cc array.
        !           813:  * Else, return -1.
        !           814:  */
        !           815: int
        !           816: num_opt(opt)
        !           817: char * opt;
        !           818: {
        !           819:        int     ret = -1;
        !           820:        int     i;
        !           821:        static struct {
        !           822:                char    name[NAMELN];
        !           823:                int     index;
        !           824:        } vlist[] = {
        !           825:                { "min",        4},
        !           826:                { "time",       5}
        !           827:        };
        !           828: 
        !           829:        for (i = 0; i < sizeof(vlist)/sizeof(vlist[0]); i++) {
        !           830:                if (strcmp(opt, vlist[i].name) == 0) {
        !           831:                        ret = vlist[i].index;
        !           832:                        break;
        !           833:                }
        !           834:        }
        !           835:        return ret;
        !           836: }
        !           837: 
        !           838: /*
        !           839:  * set_ch()
        !           840:  *
        !           841:  * Given index into c_cc[] array in termio and an argument string,
        !           842:  * decode the string and store into specified array element.
        !           843:  *
        !           844:  * Return 1 if argument passed can be decoded, else return 0.
        !           845:  * Valid argument strings are "0xnn", "c", "^c", "^?" denoting DEL,
        !           846:  * and "^-" denoting NUL, which means unused.
        !           847:  */
        !           848: int
        !           849: set_ch(want_ch, arg)
        !           850: int    want_ch;
        !           851: char   * arg;
        !           852: {
        !           853:        int     ret = 0;
        !           854:        unsigned int n;
        !           855: 
        !           856:        if (strlen(arg) == 1) {
        !           857:                n = arg[0];
        !           858:                ret = 1;
        !           859:                goto set_ch_end;
        !           860:        }
        !           861:        if (strlen(arg) == 2 && arg[0] == '^') {
        !           862:                if (arg[1] == '?')
        !           863:                        n = DEL;
        !           864:                else if (arg[1] == '-')
        !           865:                        n = NUL;
        !           866:                else
        !           867:                        n = arg[1] & ~0x60;
        !           868:                ret = 1;
        !           869:                goto set_ch_end;
        !           870:        }
        !           871:        if (strncmp(arg, "0x", 2) == 0  && sscanf(arg+2, "%x", &n) == 1) {
        !           872:                ret = 1;
        !           873:                goto set_ch_end;
        !           874:        }
        !           875: set_ch_end:
        !           876:        if (ret)
        !           877:                t.c_cc[want_ch] = n;
        !           878:        return ret;
        !           879: }
        !           880: 
        !           881: /*
        !           882:  * set_num()
        !           883:  *
        !           884:  * Given index into c_cc[] array in termio and an argument string,
        !           885:  * decode the string and store into specified array element.
        !           886:  *
        !           887:  * Return 1 if argument passed can be decoded, else return 0.
        !           888:  * Valid argument strings are "nnn", a decimal value.
        !           889:  */
        !           890: int
        !           891: set_num(want_num, arg)
        !           892: int    want_num;
        !           893: char   * arg;
        !           894: {
        !           895:        int     ret = 0;
        !           896:        unsigned int n;
        !           897: 
        !           898:        if (sscanf(arg, "%d", &n) == 1) {
        !           899:                ret = 1;
        !           900:                t.c_cc[want_num] = n;
        !           901:        }
        !           902:        return ret;
        !           903: }
        !           904: 
        !           905: #if 0
        !           906: /*
        !           907:  * set_speed()
        !           908:  *
        !           909:  * Given baud rate, set speed in termio struct.
        !           910:  * Return 1 if valid baud rate, else return 0.
        !           911:  */
        !           912: int
        !           913: set_speed(rate)
        !           914: int rate;
        !           915: {
        !           916:        int     ret = 1;
        !           917:        int     x;
        !           918: 
        !           919:        switch (rate) {
        !           920:        case 0:  x = B0;  break;
        !           921:        case 50:  x = B50;  break;
        !           922:        case 75:  x = B75;  break;
        !           923:        case 110:  x = B110;  break;
        !           924:        case 134:  x = B134;  break;
        !           925:        case 150:  x = B150;  break;
        !           926:        case 200:  x = B200;  break;
        !           927:        case 300:  x = B300;  break;
        !           928:        case 600:  x = B600;  break;
        !           929:        case 1200:  x = B1200;  break;
        !           930:        case 1800:  x = B1800;  break;
        !           931:        case 2400:  x = B2400;  break;
        !           932:        case 4800:  x = B4800;  break;
        !           933:        case 9600:  x = B9600;  break;
        !           934:        case 19200:  x = B19200;  break;
        !           935:        case 38400:  x = B38400;  break;
        !           936:        default:  ret = 0;
        !           937:        }
        !           938:        if (ret) {
        !           939:                t.c_cflag &= ~CBAUD;
        !           940:                t.c_cflag |= x;
        !           941:        }
        !           942:        return ret;
        !           943: }
        !           944: #endif

unix.superglobalmegacorp.com

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