|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.