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