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