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