Annotation of sys/compat/svr4/svr4_termios.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: svr4_termios.c,v 1.12 2002/03/14 01:26:51 millert Exp $ */
2: /* $NetBSD: svr4_termios.c,v 1.9 1996/04/11 12:53:48 christos Exp $ */
3:
4: /*
5: * Copyright (c) 1994 Christos Zoulas
6: * All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. The name of the author may not be used to endorse or promote products
17: * derived from this software without specific prior written permission
18: *
19: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29: */
30:
31: #include <sys/param.h>
32: #include <sys/proc.h>
33: #include <sys/systm.h>
34: #include <sys/file.h>
35: #include <sys/filedesc.h>
36: #include <sys/ioctl.h>
37: #include <sys/termios.h>
38: #include <sys/tty.h>
39: #include <sys/socket.h>
40: #include <sys/mount.h>
41: #include <net/if.h>
42: #include <sys/malloc.h>
43:
44: #include <sys/syscallargs.h>
45:
46: #include <compat/svr4/svr4_types.h>
47: #include <compat/svr4/svr4_util.h>
48: #include <compat/svr4/svr4_signal.h>
49: #include <compat/svr4/svr4_ioctl.h>
50: #include <compat/svr4/svr4_syscallargs.h>
51: #include <compat/svr4/svr4_stropts.h>
52: #include <compat/svr4/svr4_termios.h>
53:
54: #define SVR4_OXTABS SVR4_XTABS /* XXX */
55:
56: #ifndef __CONCAT3
57: # if __STDC__
58: # define __CONCAT3(a,b,c) a ## b ## c
59: # else
60: # define __CONCAT3(a,b,c) a/**/b/**/c
61: # endif
62: #endif
63:
64: u_long bsd_to_svr4_speed(u_long, u_long);
65: u_long svr4_to_bsd_speed(u_long, u_long);
66: void svr4_to_bsd_termios(const struct svr4_termios *, struct termios *,
67: int);
68: void bsd_to_svr4_termios(const struct termios *, struct svr4_termios *);
69: void svr4_termio_to_termios(const struct svr4_termio *,
70: struct svr4_termios *);
71: void svr4_termios_to_termio(const struct svr4_termios *,
72: struct svr4_termio *);
73: #ifdef DEBUG_SVR4
74: void print_svr4_termios(const struct svr4_termios *);
75: void print_bsd_termios(const struct termios *);
76: #endif /* DEBUG_SVR4 */
77:
78: #define undefined_char(a,b) /**/
79: #define undefined_flag1(f,a,b) /**/
80: #define undefined_flag2(f,a,b,c1,t1,c2,t2) /**/
81: #define undefined_flag4(f,a,b,c1,t1,c2,t2,c3,t3,c4,t4) /**/
82:
83: #define svr4_to_bsd_char(a,b) \
84: if (new || __CONCAT3(SVR4_,a,b) < SVR4_NCC) { \
85: if (st->c_cc[__CONCAT3(SVR4_,a,b)] == SVR4_POSIX_VDISABLE) \
86: bt->c_cc[__CONCAT(a,b)] = _POSIX_VDISABLE; \
87: else \
88: bt->c_cc[__CONCAT(a,b)] = \
89: st->c_cc[__CONCAT3(SVR4_,a,b)]; \
90: }
91:
92: #define svr4_to_bsd_flag1(f,a,b) \
93: if (new || __CONCAT3(SVR4_,a,b) < 0200000) { \
94: if (st->f & __CONCAT3(SVR4_,a,b)) \
95: bt->f |= __CONCAT(a,b); \
96: else \
97: bt->f &= ~__CONCAT(a,b); \
98: }
99:
100: #define svr4_to_bsd_flag2(f,a,b,c1,t1,c2,t2) \
101: if (new || __CONCAT3(SVR4_,a,b) < 0200000) { \
102: bt->f &= ~__CONCAT(a,b); \
103: switch (st->f & __CONCAT3(SVR4_,a,b)) { \
104: case __CONCAT3(SVR4_,c1,t1): bt->f |= __CONCAT(c1,t1); break; \
105: case __CONCAT3(SVR4_,c2,t2): bt->f |= __CONCAT(c2,t2); break; \
106: } \
107: }
108:
109: #define svr4_to_bsd_flag4(f,a,b,c1,t1,c2,t2,c3,t3,c4,t4) \
110: if (new || __CONCAT3(SVR4_,a,b) < 0200000) { \
111: bt->f &= ~__CONCAT(a,b); \
112: switch (st->f & __CONCAT3(SVR4_,a,b)) { \
113: case __CONCAT3(SVR4_,c1,t1): bt->f |= __CONCAT(c1,t1); break; \
114: case __CONCAT3(SVR4_,c2,t2): bt->f |= __CONCAT(c2,t2); break; \
115: case __CONCAT3(SVR4_,c3,t3): bt->f |= __CONCAT(c3,t3); break; \
116: case __CONCAT3(SVR4_,c4,t4): bt->f |= __CONCAT(c4,t4); break; \
117: } \
118: }
119:
120:
121: #define bsd_to_svr4_char(a,b) \
122: if (bt->c_cc[__CONCAT(a,b)] == _POSIX_VDISABLE) \
123: st->c_cc[__CONCAT3(SVR4_,a,b)] = SVR4_POSIX_VDISABLE; \
124: else \
125: st->c_cc[__CONCAT3(SVR4_,a,b)] = bt->c_cc[__CONCAT(a,b)]
126:
127: #define bsd_to_svr4_flag1(f,a,b) \
128: if (bt->f & __CONCAT(a,b)) \
129: st->f |= __CONCAT3(SVR4_,a,b); \
130: else \
131: st->f &= ~__CONCAT3(SVR4_,a,b)
132:
133: #define bsd_to_svr4_flag2(f,a,b,c1,t1,c2,t2) \
134: st->f &= ~__CONCAT3(SVR4_,a,b); \
135: switch (bt->f & __CONCAT(a,b)) { \
136: case __CONCAT(c1,t1): st->f |= __CONCAT3(SVR4_,c1,t1); break; \
137: case __CONCAT(c2,t2): st->f |= __CONCAT3(SVR4_,c2,t2); break; \
138: }
139:
140: #define bsd_to_svr4_flag4(f,a,b,c1,t1,c2,t2,c3,t3,c4,t4) \
141: st->f &= ~__CONCAT3(SVR4_,a,b); \
142: switch (bt->f & __CONCAT(a,b)) { \
143: case __CONCAT(c1,t1): st->f |= __CONCAT3(SVR4_,c1,t1); break; \
144: case __CONCAT(c2,t2): st->f |= __CONCAT3(SVR4_,c2,t2); break; \
145: case __CONCAT(c3,t3): st->f |= __CONCAT3(SVR4_,c3,t3); break; \
146: case __CONCAT(c4,t4): st->f |= __CONCAT3(SVR4_,c4,t4); break; \
147: }
148:
149: #ifdef DEBUG_SVR4
150: void
151: print_svr4_termios(st)
152: const struct svr4_termios *st;
153: {
154: int i;
155: uprintf("SVR4\niflag=%lo oflag=%lo cflag=%lo lflag=%lo\n",
156: st->c_iflag, st->c_oflag, st->c_cflag, st->c_lflag);
157: uprintf("cc: ");
158: for (i = 0; i < SVR4_NCCS; i++)
159: uprintf("%o ", st->c_cc[i]);
160: uprintf("\n");
161: }
162:
163: void
164: print_bsd_termios(bt)
165: const struct termios *bt;
166: {
167: int i;
168: uprintf(
169: "BSD\niflag=%x oflag=%x cflag=%x lflag=%x ispeed=%d osped=%d\n",
170: bt->c_iflag, bt->c_oflag, bt->c_cflag, bt->c_lflag, bt->c_ispeed,
171: bt->c_ospeed);
172: uprintf("cc: ");
173: for (i = 0; i < NCCS; i++)
174: uprintf("%o ", bt->c_cc[i]);
175: uprintf("\n");
176: }
177: #endif /* DEBUG_SVR4 */
178:
179: u_long
180: bsd_to_svr4_speed(sp, mask)
181: u_long sp;
182: u_long mask;
183: {
184: switch (sp) {
185: #undef getval
186: #define getval(a,b) case __CONCAT(a,b): sp = __CONCAT3(SVR4_,a,b); break
187: getval(B,0);
188: getval(B,50);
189: getval(B,75);
190: getval(B,110);
191: getval(B,134);
192: getval(B,150);
193: getval(B,200);
194: getval(B,300);
195: getval(B,600);
196: getval(B,1200);
197: getval(B,1800);
198: getval(B,2400);
199: getval(B,4800);
200: getval(B,9600);
201: getval(B,19200);
202: getval(B,38400);
203: #if 0
204: /* XXX These don't fit in CBAUD */
205: getval(B,57600);
206: getval(B,115200);
207: #endif
208: default: sp = SVR4_B9600; /* XXX */
209: }
210:
211: while ((mask & 1) == 0) {
212: mask >>= 1;
213: sp <<= 1;
214: }
215:
216: return (sp);
217: }
218:
219: u_long
220: svr4_to_bsd_speed(sp, mask)
221: u_long sp;
222: u_long mask;
223: {
224: while ((mask & 1) == 0) {
225: mask >>= 1;
226: sp >>= 1;
227: }
228:
229: switch (sp & mask) {
230: #undef getval
231: #define getval(a,b) case __CONCAT3(SVR4_,a,b): return (__CONCAT(a,b))
232: getval(B,0);
233: getval(B,50);
234: getval(B,75);
235: getval(B,110);
236: getval(B,134);
237: getval(B,150);
238: getval(B,200);
239: getval(B,300);
240: getval(B,600);
241: getval(B,1200);
242: getval(B,1800);
243: getval(B,2400);
244: getval(B,4800);
245: getval(B,9600);
246: getval(B,19200);
247: getval(B,38400);
248: #if 0
249: /* XXX These don't fit in CBAUD */
250: getval(B,57600);
251: getval(B,115200);
252: #endif
253: default: return (B9600); /* XXX */
254: }
255: }
256:
257: void
258: svr4_to_bsd_termios(st, bt, new)
259: const struct svr4_termios *st;
260: struct termios *bt;
261: int new;
262: {
263: /* control characters */
264: svr4_to_bsd_char(V,INTR);
265: svr4_to_bsd_char(V,QUIT);
266: svr4_to_bsd_char(V,ERASE);
267: svr4_to_bsd_char(V,KILL);
268: if (st->c_lflag & ICANON) {
269: svr4_to_bsd_char(V,EOF);
270: svr4_to_bsd_char(V,EOL);
271: } else {
272: /*
273: * These are not chars so _POSIX_DISABLE values should not be
274: * special cased.
275: */
276: bt->c_cc[VMIN] = st->c_cc[SVR4_VMIN];
277: bt->c_cc[VTIME] = st->c_cc[SVR4_VTIME];
278: }
279: svr4_to_bsd_char(V,EOF);
280: svr4_to_bsd_char(V,EOL);
281: svr4_to_bsd_char(V,EOL2);
282: undefined_char(V,SWTCH);
283: svr4_to_bsd_char(V,START);
284: svr4_to_bsd_char(V,STOP);
285: svr4_to_bsd_char(V,SUSP);
286: svr4_to_bsd_char(V,DSUSP);
287: svr4_to_bsd_char(V,REPRINT);
288: svr4_to_bsd_char(V,DISCARD);
289: svr4_to_bsd_char(V,WERASE);
290: svr4_to_bsd_char(V,LNEXT);
291:
292: /* Input modes */
293: svr4_to_bsd_flag1(c_iflag,I,GNBRK);
294: svr4_to_bsd_flag1(c_iflag,B,RKINT);
295: svr4_to_bsd_flag1(c_iflag,I,GNPAR);
296: svr4_to_bsd_flag1(c_iflag,P,ARMRK);
297: svr4_to_bsd_flag1(c_iflag,I,NPCK);
298: svr4_to_bsd_flag1(c_iflag,I,STRIP);
299: svr4_to_bsd_flag1(c_iflag,I,NLCR);
300: svr4_to_bsd_flag1(c_iflag,I,GNCR);
301: svr4_to_bsd_flag1(c_iflag,I,CRNL);
302: undefined_flag1(c_iflag,I,UCLC);
303: svr4_to_bsd_flag1(c_iflag,I,XON);
304: svr4_to_bsd_flag1(c_iflag,I,XANY);
305: svr4_to_bsd_flag1(c_iflag,I,XOFF);
306: svr4_to_bsd_flag1(c_iflag,I,MAXBEL);
307: undefined_flag1(c_iflag,D,OSMODE);
308:
309: /* Output modes */
310: svr4_to_bsd_flag1(c_oflag,O,POST);
311: undefined_flag1(c_oflag,O,LCUC);
312: svr4_to_bsd_flag1(c_oflag,O,NLCR);
313: undefined_flag1(c_oflag,O,CRNL);
314: undefined_flag1(c_oflag,O,NOCR);
315: undefined_flag1(c_oflag,O,NLRET);
316: undefined_flag1(c_oflag,O,FILL);
317: undefined_flag1(c_oflag,O,FDEL);
318: undefined_flag2(c_oflag,N,LDLY,N,L0,N,L1);
319: undefined_flag4(c_oflag,C,RDLY,C,R0,C,R1,C,R2,C,R3);
320: undefined_flag4(c_oflag,T,ABDLY,T,AB0,T,AB1,T,AB2,T,AB3);
321: /*
322: * XXX Note, we cannot use svr4_to_bsd_flag1 here because the SVR4
323: * field is a two bit value where identity is important, i.e. any bit
324: * set in that field is *not* enough. Someday we might to wish to
325: * support the other values of this bitfield, but not now...
326: */
327: if ((st->c_oflag & SVR4_XTABS) == SVR4_XTABS)
328: bt->c_oflag |= OXTABS;
329: else
330: bt->c_oflag &= ~OXTABS;
331: undefined_flag2(c_oflag,B,SDLY,B,S0,B,S1);
332: undefined_flag2(c_oflag,V,TDLY,V,T0,V,T1);
333: undefined_flag2(c_oflag,F,FDLY,F,F0,F,F1);
334: undefined_flag1(c_oflag,P,AGEOUT);
335: undefined_flag1(c_oflag,W,RAP);
336:
337: /* Control modes */
338: bt->c_ospeed = svr4_to_bsd_speed(st->c_cflag, SVR4_CBAUD);
339: svr4_to_bsd_flag4(c_cflag,C,SIZE,C,S5,C,S6,C,S7,C,S8)
340: svr4_to_bsd_flag1(c_cflag,C,STOPB);
341: svr4_to_bsd_flag1(c_cflag,C,READ);
342: svr4_to_bsd_flag1(c_cflag,P,ARENB);
343: svr4_to_bsd_flag1(c_cflag,P,ARODD);
344: svr4_to_bsd_flag1(c_cflag,H,UPCL);
345: svr4_to_bsd_flag1(c_cflag,C,LOCAL);
346: undefined_flag1(c_cflag,R,CV1EN);
347: undefined_flag1(c_cflag,X,MT1EN);
348: undefined_flag1(c_cflag,L,OBLK);
349: undefined_flag1(c_cflag,X,CLUDE);
350: bt->c_ispeed = svr4_to_bsd_speed(st->c_cflag, SVR4_CIBAUD);
351: undefined_flag1(c_cflag,P,AREXT);
352:
353: /* line discipline modes */
354: svr4_to_bsd_flag1(c_lflag,I,SIG);
355: svr4_to_bsd_flag1(c_lflag,I,CANON);
356: undefined_flag1(c_lflag,X,CASE);
357: svr4_to_bsd_flag1(c_lflag,E,CHO);
358: svr4_to_bsd_flag1(c_lflag,E,CHOE);
359: svr4_to_bsd_flag1(c_lflag,E,CHOK);
360: svr4_to_bsd_flag1(c_lflag,E,CHONL);
361: svr4_to_bsd_flag1(c_lflag,N,OFLSH);
362: svr4_to_bsd_flag1(c_lflag,T,OSTOP);
363: svr4_to_bsd_flag1(c_lflag,E,CHOCTL);
364: svr4_to_bsd_flag1(c_lflag,E,CHOPRT);
365: svr4_to_bsd_flag1(c_lflag,E,CHOKE);
366: undefined_flag1(c_lflag,D,EFECHO);
367: svr4_to_bsd_flag1(c_lflag,F,LUSHO);
368: svr4_to_bsd_flag1(c_lflag,P,ENDIN);
369: svr4_to_bsd_flag1(c_lflag,I,EXTEN);
370: }
371:
372: void
373: bsd_to_svr4_termios(bt, st)
374: const struct termios *bt;
375: struct svr4_termios *st;
376: {
377: /* control characters */
378: bsd_to_svr4_char(V,INTR);
379: bsd_to_svr4_char(V,QUIT);
380: bsd_to_svr4_char(V,ERASE);
381: bsd_to_svr4_char(V,KILL);
382: if (bt->c_lflag & ICANON) {
383: bsd_to_svr4_char(V,EOF);
384: bsd_to_svr4_char(V,EOL);
385: } else {
386: /*
387: * These are not chars so _POSIX_DISABLE values should not be
388: * special cased.
389: */
390: st->c_cc[SVR4_VMIN] = bt->c_cc[VMIN];
391: st->c_cc[SVR4_VTIME] = bt->c_cc[VTIME];
392: }
393: bsd_to_svr4_char(V,EOL2);
394: undefined_char(V,SWTCH);
395: bsd_to_svr4_char(V,START);
396: bsd_to_svr4_char(V,STOP);
397: bsd_to_svr4_char(V,SUSP);
398: bsd_to_svr4_char(V,DSUSP);
399: bsd_to_svr4_char(V,REPRINT);
400: bsd_to_svr4_char(V,DISCARD);
401: bsd_to_svr4_char(V,WERASE);
402: bsd_to_svr4_char(V,LNEXT);
403:
404: /* Input modes */
405: bsd_to_svr4_flag1(c_iflag,I,GNBRK);
406: bsd_to_svr4_flag1(c_iflag,B,RKINT);
407: bsd_to_svr4_flag1(c_iflag,I,GNPAR);
408: bsd_to_svr4_flag1(c_iflag,P,ARMRK);
409: bsd_to_svr4_flag1(c_iflag,I,NPCK);
410: bsd_to_svr4_flag1(c_iflag,I,STRIP);
411: bsd_to_svr4_flag1(c_iflag,I,NLCR);
412: bsd_to_svr4_flag1(c_iflag,I,GNCR);
413: bsd_to_svr4_flag1(c_iflag,I,CRNL);
414: undefined_flag1(c_iflag,I,UCLC);
415: bsd_to_svr4_flag1(c_iflag,I,XON);
416: bsd_to_svr4_flag1(c_iflag,I,XANY);
417: bsd_to_svr4_flag1(c_iflag,I,XOFF);
418: bsd_to_svr4_flag1(c_iflag,I,MAXBEL);
419: undefined_flag1(c_iflag,D,OSMODE);
420:
421: /* Output modes */
422: bsd_to_svr4_flag1(c_oflag,O,POST);
423: undefined_flag1(c_oflag,O,LCUC);
424: bsd_to_svr4_flag1(c_oflag,O,NLCR);
425: undefined_flag1(c_oflag,O,CRNL);
426: undefined_flag1(c_oflag,O,NOCR);
427: undefined_flag1(c_oflag,O,NLRET);
428: undefined_flag1(c_oflag,O,FILL);
429: undefined_flag1(c_oflag,O,FDEL);
430: undefined_flag2(c_oflag,N,LDLY,N,L0,N,L1);
431: undefined_flag4(c_oflag,C,RDLY,C,R0,C,R1,C,R2,C,R3);
432: undefined_flag4(c_oflag,T,ABDLY,T,AB0,T,AB1,T,AB2,T,AB3);
433: /*
434: * XXX This isn't what it seem to be, a one bit flag... It's actually
435: * a two bit value in SVR4 with composite semantics, where we only
436: * support one of them. Be careful if you change this...
437: */
438: bsd_to_svr4_flag1(c_oflag,OX,TABS);
439: undefined_flag2(c_oflag,B,SDLY,B,S0,B,S1);
440: undefined_flag2(c_oflag,V,TDLY,V,T0,V,T1);
441: undefined_flag2(c_oflag,F,FDLY,F,F0,F,F1);
442: undefined_flag1(c_oflag,P,AGEOUT);
443: undefined_flag1(c_oflag,W,RAP);
444:
445: /* Control modes */
446: st->c_cflag &= ~SVR4_CBAUD;
447: st->c_cflag |= bsd_to_svr4_speed(bt->c_ospeed, SVR4_CBAUD);
448: bsd_to_svr4_flag4(c_cflag,C,SIZE,C,S5,C,S6,C,S7,C,S8)
449: bsd_to_svr4_flag1(c_cflag,C,STOPB);
450: bsd_to_svr4_flag1(c_cflag,C,READ);
451: bsd_to_svr4_flag1(c_cflag,P,ARENB);
452: bsd_to_svr4_flag1(c_cflag,P,ARODD);
453: bsd_to_svr4_flag1(c_cflag,H,UPCL);
454: bsd_to_svr4_flag1(c_cflag,C,LOCAL);
455: undefined_flag1(c_cflag,R,CV1EN);
456: undefined_flag1(c_cflag,X,MT1EN);
457: undefined_flag1(c_cflag,L,OBLK);
458: undefined_flag1(c_cflag,X,CLUDE);
459: st->c_cflag &= ~SVR4_CIBAUD;
460: st->c_cflag |= bsd_to_svr4_speed(bt->c_ispeed, SVR4_CIBAUD);
461:
462: undefined_flag1(c_oflag,P,AREXT);
463:
464: /* line discipline modes */
465: bsd_to_svr4_flag1(c_lflag,I,SIG);
466: bsd_to_svr4_flag1(c_lflag,I,CANON);
467: undefined_flag1(c_lflag,X,CASE);
468: bsd_to_svr4_flag1(c_lflag,E,CHO);
469: bsd_to_svr4_flag1(c_lflag,E,CHOE);
470: bsd_to_svr4_flag1(c_lflag,E,CHOK);
471: bsd_to_svr4_flag1(c_lflag,E,CHONL);
472: bsd_to_svr4_flag1(c_lflag,N,OFLSH);
473: bsd_to_svr4_flag1(c_lflag,T,OSTOP);
474: bsd_to_svr4_flag1(c_lflag,E,CHOCTL);
475: bsd_to_svr4_flag1(c_lflag,E,CHOPRT);
476: bsd_to_svr4_flag1(c_lflag,E,CHOKE);
477: undefined_flag1(c_lflag,D,EFECHO);
478: bsd_to_svr4_flag1(c_lflag,F,LUSHO);
479: bsd_to_svr4_flag1(c_lflag,P,ENDIN);
480: bsd_to_svr4_flag1(c_lflag,I,EXTEN);
481: }
482:
483: void
484: svr4_termio_to_termios(t, ts)
485: const struct svr4_termio *t;
486: struct svr4_termios *ts;
487: {
488: int i;
489:
490: ts->c_iflag = (svr4_tcflag_t)t->c_iflag;
491: ts->c_oflag = (svr4_tcflag_t)t->c_oflag;
492: ts->c_cflag = (svr4_tcflag_t)t->c_cflag & ~SVR4_CIBAUD;
493: /* XXX because SVR4_CIBAUD == SVR4_CBAUD << 16 we can do: */
494: ts->c_cflag |= (ts->c_cflag & SVR4_CBAUD) << 16;
495: ts->c_lflag = (svr4_tcflag_t)t->c_lflag;
496:
497: for (i = 0; i < SVR4_NCC; i++)
498: ts->c_cc[i] = (svr4_cc_t)t->c_cc[i];
499: }
500:
501: void
502: svr4_termios_to_termio(ts, t)
503: const struct svr4_termios *ts;
504: struct svr4_termio *t;
505: {
506: int i;
507:
508: t->c_iflag = (u_short)ts->c_iflag;
509: t->c_oflag = (u_short)ts->c_oflag;
510: t->c_cflag = (u_short)ts->c_cflag;
511: t->c_lflag = (u_short)ts->c_lflag;
512: t->c_line = 0; /* XXX */
513:
514: for (i = 0; i < SVR4_NCC; i++)
515: t->c_cc[i] = (u_char)ts->c_cc[i];
516: }
517:
518: int
519: svr4_term_ioctl(fp, p, retval, fd, cmd, data)
520: struct file *fp;
521: struct proc *p;
522: register_t *retval;
523: int fd;
524: u_long cmd;
525: caddr_t data;
526: {
527: struct termios bt;
528: struct svr4_termios st;
529: struct svr4_termio t;
530: int error, new;
531: int (*ctl)(struct file *, u_long, caddr_t, struct proc *) =
532: fp->f_ops->fo_ioctl;
533:
534: *retval = 0;
535:
536: switch (cmd) {
537: case SVR4_TCGETA:
538: case SVR4_TCGETS:
539: if ((error = (*ctl)(fp, TIOCGETA, (caddr_t)&bt, p)) != 0)
540: return (error);
541:
542: bzero(&st,sizeof(st));
543: bsd_to_svr4_termios(&bt, &st);
544:
545: DPRINTF(("ioctl(TCGET%c);\n", cmd == SVR4_TCGETA ? 'A' : 'S'));
546: #ifdef DEBUG_SVR4
547: print_bsd_termios(&bt);
548: print_svr4_termios(&st);
549: #endif /* DEBUG_SVR4 */
550:
551: if (cmd == SVR4_TCGETA) {
552: svr4_termios_to_termio(&st, &t);
553: return (copyout(&t, data, sizeof(t)));
554: }
555: else {
556: return (copyout(&st, data, sizeof(st)));
557: }
558:
559: case SVR4_TCSETA:
560: case SVR4_TCSETS:
561: case SVR4_TCSETAW:
562: case SVR4_TCSETSW:
563: case SVR4_TCSETAF:
564: case SVR4_TCSETSF:
565: /* get full BSD termios so we don't lose information */
566: if ((error = (*ctl)(fp, TIOCGETA, (caddr_t) &bt, p)) != 0)
567: return (error);
568:
569: switch (cmd) {
570: case SVR4_TCSETS:
571: case SVR4_TCSETSW:
572: case SVR4_TCSETSF:
573: if ((error = copyin(data, &st, sizeof(st))) != 0)
574: return (error);
575: new = 1;
576: break;
577:
578: case SVR4_TCSETA:
579: case SVR4_TCSETAW:
580: case SVR4_TCSETAF:
581: if ((error = copyin(data, &t, sizeof(t))) != 0)
582: return (error);
583:
584: bsd_to_svr4_termios(&bt, &st);
585: svr4_termio_to_termios(&t, &st);
586: new = 0;
587: break;
588:
589: default:
590: return (EINVAL);
591: }
592:
593: svr4_to_bsd_termios(&st, &bt, new);
594:
595: switch (cmd) {
596: case SVR4_TCSETA:
597: case SVR4_TCSETS:
598: DPRINTF(("ioctl(TCSET[A|S]);\n"));
599: cmd = TIOCSETA;
600: break;
601: case SVR4_TCSETAW:
602: case SVR4_TCSETSW:
603: DPRINTF(("ioctl(TCSET[A|S]W);\n"));
604: cmd = TIOCSETAW;
605: break;
606: case SVR4_TCSETAF:
607: case SVR4_TCSETSF:
608: DPRINTF(("ioctl(TCSET[A|S]F);\n"));
609: cmd = TIOCSETAF;
610: break;
611: }
612:
613: #ifdef DEBUG_SVR4
614: print_bsd_termios(&bt);
615: print_svr4_termios(&st);
616: #endif /* DEBUG_SVR4 */
617:
618: return ((*ctl)(fp, cmd, (caddr_t) &bt, p));
619:
620: case SVR4_TIOCGWINSZ:
621: {
622: struct svr4_winsize ws;
623:
624: error = (*ctl)(fp, TIOCGWINSZ, (caddr_t)&ws, p);
625: if (error)
626: return (error);
627: return (copyout(&ws, data, sizeof(ws)));
628: }
629:
630: case SVR4_TIOCSWINSZ:
631: {
632: struct svr4_winsize ws;
633:
634: if ((error = copyin(data, &ws, sizeof(ws))) != 0)
635: return (error);
636: return ((*ctl)(fp, TIOCSWINSZ, (caddr_t) &ws, p));
637: }
638:
639: default:
640: return (svr4_stream_ti_ioctl(fp, p, retval, fd, cmd, data));
641: }
642: }
CVSweb