Annotation of sys/compat/svr4/svr4_termios.c, Revision 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