Home | History | Annotate | Line # | Download | only in sunos
sunos_ioctl.c revision 1.15
      1  1.15  deraadt /*	$NetBSD: sunos_ioctl.c,v 1.15 1994/11/20 21:29:33 deraadt Exp $	*/
      2  1.11      cgd 
      3   1.1  deraadt /*
      4   1.2  deraadt  * Copyright (c) 1993 Markus Wild.
      5   1.2  deraadt  * All rights reserved.
      6   1.1  deraadt  *
      7   1.1  deraadt  * Redistribution and use in source and binary forms, with or without
      8   1.1  deraadt  * modification, are permitted provided that the following conditions
      9   1.1  deraadt  * are met:
     10   1.1  deraadt  * 1. Redistributions of source code must retain the above copyright
     11   1.1  deraadt  *    notice, this list of conditions and the following disclaimer.
     12   1.2  deraadt  * 2. The name of the author may not be used to endorse or promote products
     13   1.8      jtc  *    derived from this software without specific prior written permission
     14   1.1  deraadt  *
     15   1.2  deraadt  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     16   1.2  deraadt  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     17   1.2  deraadt  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     18   1.2  deraadt  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     19   1.2  deraadt  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     20   1.2  deraadt  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     21   1.2  deraadt  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     22   1.2  deraadt  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23   1.2  deraadt  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     24   1.2  deraadt  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25   1.1  deraadt  *
     26  1.13  deraadt  * loosely from: Header: sunos_ioctl.c,v 1.7 93/05/28 04:40:43 torek Exp
     27   1.1  deraadt  */
     28   1.1  deraadt 
     29   1.1  deraadt #include <sys/param.h>
     30   1.1  deraadt #include <sys/proc.h>
     31  1.13  deraadt #include <sys/systm.h>
     32   1.1  deraadt #include <sys/file.h>
     33   1.1  deraadt #include <sys/filedesc.h>
     34   1.1  deraadt #include <sys/ioctl.h>
     35   1.1  deraadt #include <sys/termios.h>
     36   1.1  deraadt #include <sys/tty.h>
     37   1.6  deraadt #include <sys/socket.h>
     38   1.6  deraadt #include <sys/ioctl.h>
     39   1.6  deraadt #include <net/if.h>
     40   1.1  deraadt 
     41  1.13  deraadt #include <sys/mount.h>
     42  1.13  deraadt 
     43  1.13  deraadt #include <sys/syscallargs.h>
     44  1.13  deraadt #include <compat/sunos/sunos.h>
     45  1.13  deraadt #include <compat/sunos/sunos_syscallargs.h>
     46  1.13  deraadt 
     47   1.1  deraadt /*
     48   1.1  deraadt  * SunOS ioctl calls.
     49   1.1  deraadt  * This file is something of a hodge-podge.
     50   1.1  deraadt  * Support gets added as things turn up....
     51   1.1  deraadt  */
     52   1.1  deraadt 
     53   1.2  deraadt static struct speedtab sptab[] = {
     54   1.2  deraadt 	{ 0, 0 },
     55   1.2  deraadt 	{ 50, 1 },
     56   1.2  deraadt 	{ 75, 2 },
     57   1.2  deraadt 	{ 110, 3 },
     58   1.2  deraadt 	{ 134, 4 },
     59   1.2  deraadt 	{ 135, 4 },
     60   1.2  deraadt 	{ 150, 5 },
     61   1.2  deraadt 	{ 200, 6 },
     62   1.2  deraadt 	{ 300, 7 },
     63   1.2  deraadt 	{ 600, 8 },
     64   1.2  deraadt 	{ 1200, 9 },
     65   1.2  deraadt 	{ 1800, 10 },
     66   1.2  deraadt 	{ 2400, 11 },
     67   1.2  deraadt 	{ 4800, 12 },
     68   1.2  deraadt 	{ 9600, 13 },
     69   1.2  deraadt 	{ 19200, 14 },
     70   1.2  deraadt 	{ 38400, 15 },
     71   1.2  deraadt 	{ -1, -1 }
     72   1.2  deraadt };
     73   1.2  deraadt 
     74   1.2  deraadt static u_long s2btab[] = {
     75   1.2  deraadt 	0,
     76   1.2  deraadt 	50,
     77   1.2  deraadt 	75,
     78   1.2  deraadt 	110,
     79   1.2  deraadt 	134,
     80   1.2  deraadt 	150,
     81   1.2  deraadt 	200,
     82   1.2  deraadt 	300,
     83   1.2  deraadt 	600,
     84   1.2  deraadt 	1200,
     85   1.2  deraadt 	1800,
     86   1.2  deraadt 	2400,
     87   1.2  deraadt 	4800,
     88   1.2  deraadt 	9600,
     89   1.2  deraadt 	19200,
     90   1.2  deraadt 	38400,
     91   1.2  deraadt };
     92   1.2  deraadt 
     93   1.2  deraadt /*
     94   1.2  deraadt  * these two conversion functions have mostly been done
     95   1.2  deraadt  * with some perl cut&paste, then handedited to comment
     96   1.2  deraadt  * out what doesn't exist under NetBSD.
     97   1.2  deraadt  * A note from Markus's code:
     98   1.2  deraadt  *	(l & BITMASK1) / BITMASK1 * BITMASK2  is translated
     99   1.2  deraadt  *	optimally by gcc m68k, much better than any ?: stuff.
    100   1.2  deraadt  *	Code may vary with different architectures of course.
    101   1.2  deraadt  *
    102   1.2  deraadt  * I don't know what optimizer you used, but seeing divu's and
    103   1.2  deraadt  * bfextu's in the m68k assembly output did not encourage me...
    104   1.2  deraadt  * as well, gcc on the sparc definately generates much better
    105   1.2  deraadt  * code with ?:.
    106   1.2  deraadt  */
    107   1.2  deraadt 
    108   1.2  deraadt static void
    109   1.2  deraadt stios2btios(st, bt)
    110  1.13  deraadt 	struct sunos_termios *st;
    111   1.2  deraadt 	struct termios *bt;
    112   1.2  deraadt {
    113   1.2  deraadt 	register u_long l, r;
    114   1.2  deraadt 
    115   1.2  deraadt 	l = st->c_iflag;
    116   1.3  deraadt 	r = 	((l & 0x00000001) ? IGNBRK	: 0);
    117   1.3  deraadt 	r |=	((l & 0x00000002) ? BRKINT	: 0);
    118   1.3  deraadt 	r |=	((l & 0x00000004) ? IGNPAR	: 0);
    119   1.3  deraadt 	r |=	((l & 0x00000008) ? PARMRK	: 0);
    120   1.3  deraadt 	r |=	((l & 0x00000010) ? INPCK	: 0);
    121   1.3  deraadt 	r |=	((l & 0x00000020) ? ISTRIP	: 0);
    122   1.3  deraadt 	r |= 	((l & 0x00000040) ? INLCR	: 0);
    123   1.3  deraadt 	r |=	((l & 0x00000080) ? IGNCR	: 0);
    124   1.3  deraadt 	r |=	((l & 0x00000100) ? ICRNL	: 0);
    125   1.3  deraadt 	/*	((l & 0x00000200) ? IUCLC	: 0) */
    126   1.3  deraadt 	r |=	((l & 0x00000400) ? IXON	: 0);
    127   1.3  deraadt 	r |=	((l & 0x00000800) ? IXANY	: 0);
    128   1.3  deraadt 	r |=	((l & 0x00001000) ? IXOFF	: 0);
    129   1.3  deraadt 	r |=	((l & 0x00002000) ? IMAXBEL	: 0);
    130   1.2  deraadt 	bt->c_iflag = r;
    131   1.2  deraadt 
    132   1.2  deraadt 	l = st->c_oflag;
    133   1.3  deraadt 	r = 	((l & 0x00000001) ? OPOST	: 0);
    134   1.3  deraadt 	/*	((l & 0x00000002) ? OLCUC	: 0) */
    135   1.3  deraadt 	r |=	((l & 0x00000004) ? ONLCR	: 0);
    136   1.3  deraadt 	/*	((l & 0x00000008) ? OCRNL	: 0) */
    137   1.3  deraadt 	/*	((l & 0x00000010) ? ONOCR	: 0) */
    138   1.3  deraadt 	/*	((l & 0x00000020) ? ONLRET	: 0) */
    139   1.3  deraadt 	/*	((l & 0x00000040) ? OFILL	: 0) */
    140   1.3  deraadt 	/*	((l & 0x00000080) ? OFDEL	: 0) */
    141   1.3  deraadt 	/*	((l & 0x00000100) ? NLDLY	: 0) */
    142   1.3  deraadt 	/*	((l & 0x00000100) ? NL1		: 0) */
    143   1.3  deraadt 	/*	((l & 0x00000600) ? CRDLY	: 0) */
    144   1.3  deraadt 	/*	((l & 0x00000200) ? CR1		: 0) */
    145   1.3  deraadt 	/*	((l & 0x00000400) ? CR2		: 0) */
    146   1.3  deraadt 	/*	((l & 0x00000600) ? CR3		: 0) */
    147   1.3  deraadt 	/*	((l & 0x00001800) ? TABDLY	: 0) */
    148   1.3  deraadt 	/*	((l & 0x00000800) ? TAB1	: 0) */
    149   1.3  deraadt 	/*	((l & 0x00001000) ? TAB2	: 0) */
    150   1.3  deraadt 	r |=	((l & 0x00001800) ? OXTABS	: 0);
    151   1.3  deraadt 	/*	((l & 0x00002000) ? BSDLY	: 0) */
    152   1.3  deraadt 	/*	((l & 0x00002000) ? BS1		: 0) */
    153   1.3  deraadt 	/*	((l & 0x00004000) ? VTDLY	: 0) */
    154   1.3  deraadt 	/*	((l & 0x00004000) ? VT1		: 0) */
    155   1.3  deraadt 	/*	((l & 0x00008000) ? FFDLY	: 0) */
    156   1.3  deraadt 	/*	((l & 0x00008000) ? FF1		: 0) */
    157   1.3  deraadt 	/*	((l & 0x00010000) ? PAGEOUT	: 0) */
    158   1.3  deraadt 	/*	((l & 0x00020000) ? WRAP	: 0) */
    159   1.2  deraadt 	bt->c_oflag = r;
    160   1.2  deraadt 
    161   1.2  deraadt 	l = st->c_cflag;
    162  1.14  deraadt 	switch (l & 0x00000030) {
    163  1.14  deraadt 	case 0:
    164  1.14  deraadt 		r = CS5;
    165  1.14  deraadt 		break;
    166  1.14  deraadt 	case 0x00000010:
    167  1.14  deraadt 		r = CS6;
    168  1.14  deraadt 		break;
    169  1.14  deraadt 	case 0x00000020:
    170  1.14  deraadt 		r = CS7;
    171  1.14  deraadt 		break;
    172  1.14  deraadt 	case 0x00000030:
    173  1.14  deraadt 		r = CS8;
    174  1.14  deraadt 		break;
    175  1.14  deraadt 	}
    176   1.3  deraadt 	r |=	((l & 0x00000040) ? CSTOPB	: 0);
    177   1.3  deraadt 	r |=	((l & 0x00000080) ? CREAD	: 0);
    178   1.3  deraadt 	r |= 	((l & 0x00000100) ? PARENB	: 0);
    179   1.3  deraadt 	r |=	((l & 0x00000200) ? PARODD	: 0);
    180   1.3  deraadt 	r |=	((l & 0x00000400) ? HUPCL	: 0);
    181   1.3  deraadt 	r |=	((l & 0x00000800) ? CLOCAL	: 0);
    182   1.3  deraadt 	/*	((l & 0x00001000) ? LOBLK	: 0) */
    183   1.3  deraadt 	r |=	((l & 0x80000000) ? (CRTS_IFLOW|CCTS_OFLOW) : 0);
    184   1.2  deraadt 	bt->c_cflag = r;
    185   1.2  deraadt 
    186   1.2  deraadt 	bt->c_ispeed = bt->c_ospeed = s2btab[l & 0x0000000f];
    187   1.2  deraadt 
    188   1.2  deraadt 	l = st->c_lflag;
    189   1.3  deraadt 	r = 	((l & 0x00000001) ? ISIG	: 0);
    190   1.3  deraadt 	r |=	((l & 0x00000002) ? ICANON	: 0);
    191   1.3  deraadt 	/*	((l & 0x00000004) ? XCASE	: 0) */
    192   1.3  deraadt 	r |=	((l & 0x00000008) ? ECHO	: 0);
    193   1.3  deraadt 	r |=	((l & 0x00000010) ? ECHOE	: 0);
    194   1.3  deraadt 	r |=	((l & 0x00000020) ? ECHOK	: 0);
    195   1.3  deraadt 	r |=	((l & 0x00000040) ? ECHONL	: 0);
    196   1.3  deraadt 	r |= 	((l & 0x00000080) ? NOFLSH	: 0);
    197   1.3  deraadt 	r |=	((l & 0x00000100) ? TOSTOP	: 0);
    198   1.3  deraadt 	r |=	((l & 0x00000200) ? ECHOCTL	: 0);
    199   1.3  deraadt 	r |=	((l & 0x00000400) ? ECHOPRT	: 0);
    200   1.3  deraadt 	r |=	((l & 0x00000800) ? ECHOKE	: 0);
    201   1.3  deraadt 	/*	((l & 0x00001000) ? DEFECHO	: 0) */
    202   1.3  deraadt 	r |=	((l & 0x00002000) ? FLUSHO	: 0);
    203   1.3  deraadt 	r |=	((l & 0x00004000) ? PENDIN	: 0);
    204   1.2  deraadt 	bt->c_lflag = r;
    205   1.2  deraadt 
    206   1.2  deraadt 	bt->c_cc[VINTR]    = st->c_cc[0]  ? st->c_cc[0]  : _POSIX_VDISABLE;
    207   1.2  deraadt 	bt->c_cc[VQUIT]    = st->c_cc[1]  ? st->c_cc[1]  : _POSIX_VDISABLE;
    208   1.2  deraadt 	bt->c_cc[VERASE]   = st->c_cc[2]  ? st->c_cc[2]  : _POSIX_VDISABLE;
    209   1.2  deraadt 	bt->c_cc[VKILL]    = st->c_cc[3]  ? st->c_cc[3]  : _POSIX_VDISABLE;
    210   1.2  deraadt 	bt->c_cc[VEOF]     = st->c_cc[4]  ? st->c_cc[4]  : _POSIX_VDISABLE;
    211   1.2  deraadt 	bt->c_cc[VEOL]     = st->c_cc[5]  ? st->c_cc[5]  : _POSIX_VDISABLE;
    212   1.2  deraadt 	bt->c_cc[VEOL2]    = st->c_cc[6]  ? st->c_cc[6]  : _POSIX_VDISABLE;
    213   1.2  deraadt     /*	bt->c_cc[VSWTCH]   = st->c_cc[7]  ? st->c_cc[7]  : _POSIX_VDISABLE; */
    214   1.2  deraadt 	bt->c_cc[VSTART]   = st->c_cc[8]  ? st->c_cc[8]  : _POSIX_VDISABLE;
    215   1.2  deraadt 	bt->c_cc[VSTOP]    = st->c_cc[9]  ? st->c_cc[9]  : _POSIX_VDISABLE;
    216   1.2  deraadt 	bt->c_cc[VSUSP]    = st->c_cc[10] ? st->c_cc[10] : _POSIX_VDISABLE;
    217   1.2  deraadt 	bt->c_cc[VDSUSP]   = st->c_cc[11] ? st->c_cc[11] : _POSIX_VDISABLE;
    218   1.2  deraadt 	bt->c_cc[VREPRINT] = st->c_cc[12] ? st->c_cc[12] : _POSIX_VDISABLE;
    219   1.2  deraadt 	bt->c_cc[VDISCARD] = st->c_cc[13] ? st->c_cc[13] : _POSIX_VDISABLE;
    220   1.2  deraadt 	bt->c_cc[VWERASE]  = st->c_cc[14] ? st->c_cc[14] : _POSIX_VDISABLE;
    221   1.2  deraadt 	bt->c_cc[VLNEXT]   = st->c_cc[15] ? st->c_cc[15] : _POSIX_VDISABLE;
    222   1.2  deraadt 	bt->c_cc[VSTATUS]  = st->c_cc[16] ? st->c_cc[16] : _POSIX_VDISABLE;
    223  1.15  deraadt 
    224  1.15  deraadt 	/* if `raw mode', create native VMIN/VTIME from SunOS VEOF/VEOL */
    225  1.15  deraadt 	bt->c_cc[VMIN]	   = (bt->c_lflag & ICANON) ? 1 : bt->c_cc[VEOF];
    226  1.15  deraadt 	bt->c_cc[VTIME]	   = (bt->c_lflag & ICANON) ? 1 : bt->c_cc[VEOL];
    227   1.2  deraadt }
    228   1.2  deraadt 
    229   1.2  deraadt 
    230   1.2  deraadt static void
    231   1.2  deraadt btios2stios(bt, st)
    232   1.2  deraadt 	struct termios *bt;
    233  1.13  deraadt 	struct sunos_termios *st;
    234   1.2  deraadt {
    235   1.2  deraadt 	register u_long l, r;
    236   1.2  deraadt 
    237   1.2  deraadt 	l = bt->c_iflag;
    238   1.3  deraadt 	r = 	((l &  IGNBRK) ? 0x00000001	: 0);
    239   1.3  deraadt 	r |=	((l &  BRKINT) ? 0x00000002	: 0);
    240   1.3  deraadt 	r |=	((l &  IGNPAR) ? 0x00000004	: 0);
    241   1.3  deraadt 	r |=	((l &  PARMRK) ? 0x00000008	: 0);
    242   1.3  deraadt 	r |=	((l &   INPCK) ? 0x00000010	: 0);
    243   1.3  deraadt 	r |=	((l &  ISTRIP) ? 0x00000020	: 0);
    244   1.3  deraadt 	r |=	((l &   INLCR) ? 0x00000040	: 0);
    245   1.3  deraadt 	r |=	((l &   IGNCR) ? 0x00000080	: 0);
    246   1.3  deraadt 	r |=	((l &   ICRNL) ? 0x00000100	: 0);
    247   1.3  deraadt 	/*	((l &   IUCLC) ? 0x00000200	: 0) */
    248   1.3  deraadt 	r |=	((l &    IXON) ? 0x00000400	: 0);
    249   1.3  deraadt 	r |=	((l &   IXANY) ? 0x00000800	: 0);
    250   1.3  deraadt 	r |=	((l &   IXOFF) ? 0x00001000	: 0);
    251   1.3  deraadt 	r |=	((l & IMAXBEL) ? 0x00002000	: 0);
    252   1.2  deraadt 	st->c_iflag = r;
    253   1.2  deraadt 
    254   1.2  deraadt 	l = bt->c_oflag;
    255   1.3  deraadt 	r =	((l &   OPOST) ? 0x00000001	: 0);
    256   1.3  deraadt 	/*	((l &   OLCUC) ? 0x00000002	: 0) */
    257   1.3  deraadt 	r |=	((l &   ONLCR) ? 0x00000004	: 0);
    258   1.3  deraadt 	/*	((l &   OCRNL) ? 0x00000008	: 0) */
    259   1.3  deraadt 	/*	((l &   ONOCR) ? 0x00000010	: 0) */
    260   1.3  deraadt 	/*	((l &  ONLRET) ? 0x00000020	: 0) */
    261   1.3  deraadt 	/*	((l &   OFILL) ? 0x00000040	: 0) */
    262   1.3  deraadt 	/*	((l &   OFDEL) ? 0x00000080	: 0) */
    263   1.3  deraadt 	/*	((l &   NLDLY) ? 0x00000100	: 0) */
    264   1.3  deraadt 	/*	((l &     NL1) ? 0x00000100	: 0) */
    265   1.3  deraadt 	/*	((l &   CRDLY) ? 0x00000600	: 0) */
    266   1.3  deraadt 	/*	((l &     CR1) ? 0x00000200	: 0) */
    267   1.3  deraadt 	/*	((l &     CR2) ? 0x00000400	: 0) */
    268   1.3  deraadt 	/*	((l &     CR3) ? 0x00000600	: 0) */
    269   1.3  deraadt 	/*	((l &  TABDLY) ? 0x00001800	: 0) */
    270   1.3  deraadt 	/*	((l &    TAB1) ? 0x00000800	: 0) */
    271   1.3  deraadt 	/*	((l &    TAB2) ? 0x00001000	: 0) */
    272   1.3  deraadt 	r |=	((l &  OXTABS) ? 0x00001800	: 0);
    273   1.3  deraadt 	/*	((l &   BSDLY) ? 0x00002000	: 0) */
    274   1.3  deraadt 	/*	((l &     BS1) ? 0x00002000	: 0) */
    275   1.3  deraadt 	/*	((l &   VTDLY) ? 0x00004000	: 0) */
    276   1.3  deraadt 	/*	((l &     VT1) ? 0x00004000	: 0) */
    277   1.3  deraadt 	/*	((l &   FFDLY) ? 0x00008000	: 0) */
    278   1.3  deraadt 	/*	((l &     FF1) ? 0x00008000	: 0) */
    279   1.3  deraadt 	/*	((l & PAGEOUT) ? 0x00010000	: 0) */
    280   1.3  deraadt 	/*	((l &    WRAP) ? 0x00020000	: 0) */
    281   1.2  deraadt 	st->c_oflag = r;
    282   1.2  deraadt 
    283   1.2  deraadt 	l = bt->c_cflag;
    284  1.14  deraadt 	switch (l & CSIZE) {
    285  1.14  deraadt 	case CS5:
    286  1.14  deraadt 		r = 0;
    287  1.14  deraadt 		break;
    288  1.14  deraadt 	case CS6:
    289  1.14  deraadt 		r = 0x00000010;
    290  1.14  deraadt 		break;
    291  1.14  deraadt 	case CS7:
    292  1.14  deraadt 		r = 0x00000020;
    293  1.14  deraadt 		break;
    294  1.14  deraadt 	case CS8:
    295  1.14  deraadt 		r = 0x00000030;
    296  1.14  deraadt 		break;
    297  1.14  deraadt 	}
    298   1.3  deraadt 	r |=	((l &  CSTOPB) ? 0x00000040	: 0);
    299   1.3  deraadt 	r |=	((l &   CREAD) ? 0x00000080	: 0);
    300   1.3  deraadt 	r |=	((l &  PARENB) ? 0x00000100	: 0);
    301   1.3  deraadt 	r |=	((l &  PARODD) ? 0x00000200	: 0);
    302   1.3  deraadt 	r |=	((l &   HUPCL) ? 0x00000400	: 0);
    303   1.3  deraadt 	r |=	((l &  CLOCAL) ? 0x00000800	: 0);
    304   1.3  deraadt 	/*	((l &   LOBLK) ? 0x00001000	: 0) */
    305   1.3  deraadt 	r |=	((l & (CRTS_IFLOW|CCTS_OFLOW)) ? 0x80000000 : 0);
    306   1.2  deraadt 	st->c_cflag = r;
    307   1.2  deraadt 
    308   1.2  deraadt 	l = bt->c_lflag;
    309   1.3  deraadt 	r =	((l &    ISIG) ? 0x00000001	: 0);
    310   1.3  deraadt 	r |=	((l &  ICANON) ? 0x00000002	: 0);
    311   1.3  deraadt 	/*	((l &   XCASE) ? 0x00000004	: 0) */
    312   1.3  deraadt 	r |=	((l &    ECHO) ? 0x00000008	: 0);
    313   1.3  deraadt 	r |=	((l &   ECHOE) ? 0x00000010	: 0);
    314   1.3  deraadt 	r |=	((l &   ECHOK) ? 0x00000020	: 0);
    315   1.3  deraadt 	r |=	((l &  ECHONL) ? 0x00000040	: 0);
    316   1.3  deraadt 	r |=	((l &  NOFLSH) ? 0x00000080	: 0);
    317   1.3  deraadt 	r |=	((l &  TOSTOP) ? 0x00000100	: 0);
    318   1.3  deraadt 	r |=	((l & ECHOCTL) ? 0x00000200	: 0);
    319   1.3  deraadt 	r |=	((l & ECHOPRT) ? 0x00000400	: 0);
    320   1.3  deraadt 	r |=	((l &  ECHOKE) ? 0x00000800	: 0);
    321   1.3  deraadt 	/*	((l & DEFECHO) ? 0x00001000	: 0) */
    322   1.3  deraadt 	r |=	((l &  FLUSHO) ? 0x00002000	: 0);
    323   1.3  deraadt 	r |=	((l &  PENDIN) ? 0x00004000	: 0);
    324   1.2  deraadt 	st->c_lflag = r;
    325   1.2  deraadt 
    326   1.2  deraadt 	l = ttspeedtab(bt->c_ospeed, sptab);
    327   1.2  deraadt 	if (l >= 0)
    328   1.2  deraadt 		st->c_cflag |= l;
    329   1.2  deraadt 
    330   1.2  deraadt 	st->c_cc[0] = bt->c_cc[VINTR]   != _POSIX_VDISABLE? bt->c_cc[VINTR]:0;
    331   1.2  deraadt 	st->c_cc[1] = bt->c_cc[VQUIT]   != _POSIX_VDISABLE? bt->c_cc[VQUIT]:0;
    332   1.2  deraadt 	st->c_cc[2] = bt->c_cc[VERASE]  != _POSIX_VDISABLE? bt->c_cc[VERASE]:0;
    333   1.2  deraadt 	st->c_cc[3] = bt->c_cc[VKILL]   != _POSIX_VDISABLE? bt->c_cc[VKILL]:0;
    334   1.2  deraadt 	st->c_cc[4] = bt->c_cc[VEOF]    != _POSIX_VDISABLE? bt->c_cc[VEOF]:0;
    335   1.2  deraadt 	st->c_cc[5] = bt->c_cc[VEOL]    != _POSIX_VDISABLE? bt->c_cc[VEOL]:0;
    336   1.2  deraadt 	st->c_cc[6] = bt->c_cc[VEOL2]   != _POSIX_VDISABLE? bt->c_cc[VEOL2]:0;
    337   1.2  deraadt 	st->c_cc[7] = 0;
    338   1.2  deraadt 		/*    bt->c_cc[VSWTCH]  != _POSIX_VDISABLE? bt->c_cc[VSWTCH]: */
    339   1.2  deraadt 	st->c_cc[8] = bt->c_cc[VSTART]  != _POSIX_VDISABLE? bt->c_cc[VSTART]:0;
    340   1.2  deraadt 	st->c_cc[9] = bt->c_cc[VSTOP]   != _POSIX_VDISABLE? bt->c_cc[VSTOP]:0;
    341   1.2  deraadt 	st->c_cc[10]= bt->c_cc[VSUSP]   != _POSIX_VDISABLE? bt->c_cc[VSUSP]:0;
    342   1.2  deraadt 	st->c_cc[11]= bt->c_cc[VDSUSP]  != _POSIX_VDISABLE? bt->c_cc[VDSUSP]:0;
    343   1.2  deraadt 	st->c_cc[12]= bt->c_cc[VREPRINT]!= _POSIX_VDISABLE? bt->c_cc[VREPRINT]:0;
    344   1.2  deraadt 	st->c_cc[13]= bt->c_cc[VDISCARD]!= _POSIX_VDISABLE? bt->c_cc[VDISCARD]:0;
    345   1.2  deraadt 	st->c_cc[14]= bt->c_cc[VWERASE] != _POSIX_VDISABLE? bt->c_cc[VWERASE]:0;
    346   1.2  deraadt 	st->c_cc[15]= bt->c_cc[VLNEXT]  != _POSIX_VDISABLE? bt->c_cc[VLNEXT]:0;
    347   1.2  deraadt 	st->c_cc[16]= bt->c_cc[VSTATUS] != _POSIX_VDISABLE? bt->c_cc[VSTATUS]:0;
    348   1.2  deraadt 
    349   1.2  deraadt 	st->c_line = 0;
    350   1.2  deraadt }
    351   1.2  deraadt 
    352   1.2  deraadt static void
    353   1.2  deraadt stios2stio(ts, t)
    354  1.13  deraadt 	struct sunos_termios *ts;
    355  1.13  deraadt 	struct sunos_termio *t;
    356   1.2  deraadt {
    357   1.2  deraadt 	t->c_iflag = ts->c_iflag;
    358   1.2  deraadt 	t->c_oflag = ts->c_oflag;
    359   1.2  deraadt 	t->c_cflag = ts->c_cflag;
    360   1.2  deraadt 	t->c_lflag = ts->c_lflag;
    361   1.2  deraadt 	t->c_line  = ts->c_line;
    362   1.2  deraadt 	bcopy(ts->c_cc, t->c_cc, 8);
    363   1.2  deraadt }
    364   1.2  deraadt 
    365   1.2  deraadt static void
    366   1.2  deraadt stio2stios(t, ts)
    367  1.13  deraadt 	struct sunos_termio *t;
    368  1.13  deraadt 	struct sunos_termios *ts;
    369   1.2  deraadt {
    370   1.2  deraadt 	ts->c_iflag = t->c_iflag;
    371   1.2  deraadt 	ts->c_oflag = t->c_oflag;
    372   1.2  deraadt 	ts->c_cflag = t->c_cflag;
    373   1.2  deraadt 	ts->c_lflag = t->c_lflag;
    374   1.2  deraadt 	ts->c_line  = t->c_line;
    375   1.2  deraadt 	bcopy(t->c_cc, ts->c_cc, 8); /* don't touch the upper fields! */
    376   1.2  deraadt }
    377   1.1  deraadt 
    378   1.2  deraadt int
    379  1.13  deraadt sunos_ioctl(p, uap, retval)
    380   1.1  deraadt 	register struct proc *p;
    381  1.13  deraadt 	struct sunos_ioctl_args *uap;
    382  1.12      cgd 	register_t *retval;
    383   1.1  deraadt {
    384   1.1  deraadt 	register struct filedesc *fdp = p->p_fd;
    385   1.1  deraadt 	register struct file *fp;
    386   1.1  deraadt 	register int (*ctl)();
    387   1.1  deraadt 	int error;
    388   1.1  deraadt 
    389  1.13  deraadt 	if ( (unsigned)SCARG(uap, fd) >= fdp->fd_nfiles ||
    390  1.13  deraadt 	    (fp = fdp->fd_ofiles[SCARG(uap, fd)]) == NULL)
    391   1.2  deraadt 		return EBADF;
    392   1.2  deraadt 
    393   1.1  deraadt 	if ((fp->f_flag & (FREAD|FWRITE)) == 0)
    394   1.2  deraadt 		return EBADF;
    395   1.2  deraadt 
    396   1.1  deraadt 	ctl = fp->f_ops->fo_ioctl;
    397   1.1  deraadt 
    398  1.13  deraadt 	switch (SCARG(uap, com)) {
    399   1.1  deraadt 	case _IOR('t', 0, int):
    400  1.13  deraadt 		SCARG(uap, com) = TIOCGETD;
    401   1.1  deraadt 		break;
    402   1.2  deraadt 	case _IOW('t', 1, int):
    403   1.2  deraadt 	    {
    404   1.2  deraadt 		int disc;
    405   1.1  deraadt 
    406  1.13  deraadt 		if ((error = copyin(SCARG(uap, data), (caddr_t)&disc,
    407   1.2  deraadt 		    sizeof disc)) != 0)
    408   1.2  deraadt 			return error;
    409   1.2  deraadt 
    410   1.2  deraadt 		/* map SunOS NTTYDISC into our termios discipline */
    411   1.2  deraadt 		if (disc == 2)
    412   1.2  deraadt 			disc = 0;
    413   1.2  deraadt 		/* all other disciplines are not supported by NetBSD */
    414   1.2  deraadt 		if (disc)
    415   1.2  deraadt 			return ENXIO;
    416   1.1  deraadt 
    417   1.2  deraadt 		return (*ctl)(fp, TIOCSETD, (caddr_t)&disc, p);
    418   1.4  deraadt 	    }
    419  1.13  deraadt 	case _IOW('t', 101, int):	/* sun SUNOS_TIOCSSOFTCAR */
    420   1.4  deraadt 	    {
    421   1.4  deraadt 		int x;	/* unused */
    422   1.4  deraadt 
    423  1.13  deraadt 		return copyin((caddr_t)&x, SCARG(uap, data), sizeof x);
    424   1.4  deraadt 	    }
    425  1.13  deraadt 	case _IOR('t', 100, int):	/* sun SUNOS_TIOCSSOFTCAR */
    426   1.4  deraadt 	    {
    427   1.4  deraadt 		int x = 0;
    428   1.4  deraadt 
    429  1.13  deraadt 		return copyout((caddr_t)&x, SCARG(uap, data), sizeof x);
    430   1.2  deraadt 	    }
    431   1.2  deraadt 	case _IO('t', 36): 		/* sun TIOCCONS, no parameters */
    432   1.2  deraadt 	    {
    433   1.1  deraadt 		int on = 1;
    434   1.2  deraadt 		return (*ctl)(fp, TIOCCONS, (caddr_t)&on, p);
    435   1.1  deraadt 	    }
    436  1.13  deraadt 	case _IOW('t', 37, struct sunos_ttysize):
    437   1.2  deraadt 	    {
    438   1.2  deraadt 		struct winsize ws;
    439  1.13  deraadt 		struct sunos_ttysize ss;
    440   1.1  deraadt 
    441   1.1  deraadt 		if ((error = (*ctl)(fp, TIOCGWINSZ, (caddr_t)&ws, p)) != 0)
    442   1.1  deraadt 			return (error);
    443   1.2  deraadt 
    444  1.13  deraadt 		if ((error = copyin (SCARG(uap, data), &ss, sizeof (ss))) != 0)
    445   1.2  deraadt 			return error;
    446   1.2  deraadt 
    447   1.2  deraadt 		ws.ws_row = ss.ts_row;
    448   1.2  deraadt 		ws.ws_col = ss.ts_col;
    449   1.2  deraadt 
    450   1.1  deraadt 		return ((*ctl)(fp, TIOCSWINSZ, (caddr_t)&ws, p));
    451   1.1  deraadt 	    }
    452  1.13  deraadt 	case _IOW('t', 38, struct sunos_ttysize):
    453   1.2  deraadt 	    {
    454   1.2  deraadt 		struct winsize ws;
    455  1.13  deraadt 		struct sunos_ttysize ss;
    456   1.1  deraadt 
    457   1.1  deraadt 		if ((error = (*ctl)(fp, TIOCGWINSZ, (caddr_t)&ws, p)) != 0)
    458   1.1  deraadt 			return (error);
    459   1.2  deraadt 
    460   1.2  deraadt 		ss.ts_row = ws.ws_row;
    461   1.2  deraadt 		ss.ts_col = ws.ws_col;
    462   1.2  deraadt 
    463  1.13  deraadt 		return copyout ((caddr_t)&ss, SCARG(uap, data), sizeof (ss));
    464   1.1  deraadt 	    }
    465   1.9       pk 	case _IOW('t', 130, int):
    466  1.13  deraadt 		SCARG(uap, com) = TIOCSPGRP;
    467   1.1  deraadt 		break;
    468   1.1  deraadt 	case _IOR('t', 131, int):
    469  1.13  deraadt 		SCARG(uap, com) = TIOCGPGRP;
    470   1.1  deraadt 		break;
    471   1.1  deraadt 	case _IO('t', 132):
    472  1.13  deraadt 		SCARG(uap, com) = TIOCSCTTY;
    473   1.1  deraadt 		break;
    474  1.13  deraadt 	case SUNOS_TCGETA:
    475  1.13  deraadt 	case SUNOS_TCGETS:
    476   1.2  deraadt 	    {
    477   1.2  deraadt 		struct termios bts;
    478  1.13  deraadt 		struct sunos_termios sts;
    479  1.13  deraadt 		struct sunos_termio st;
    480   1.2  deraadt 
    481   1.2  deraadt 		if ((error = (*ctl)(fp, TIOCGETA, (caddr_t)&bts, p)) != 0)
    482   1.2  deraadt 			return error;
    483   1.2  deraadt 
    484   1.2  deraadt 		btios2stios (&bts, &sts);
    485  1.13  deraadt 		if (SCARG(uap, com) == SUNOS_TCGETA) {
    486   1.2  deraadt 			stios2stio (&sts, &st);
    487  1.13  deraadt 			return copyout((caddr_t)&st, SCARG(uap, data),
    488  1.13  deraadt 			    sizeof (st));
    489   1.2  deraadt 		} else
    490  1.13  deraadt 			return copyout((caddr_t)&sts, SCARG(uap, data),
    491  1.13  deraadt 			    sizeof (sts));
    492   1.2  deraadt 		/*NOTREACHED*/
    493   1.2  deraadt 	    }
    494  1.13  deraadt 	case SUNOS_TCSETA:
    495  1.13  deraadt 	case SUNOS_TCSETAW:
    496  1.13  deraadt 	case SUNOS_TCSETAF:
    497   1.2  deraadt 	    {
    498   1.2  deraadt 		struct termios bts;
    499  1.13  deraadt 		struct sunos_termios sts;
    500  1.13  deraadt 		struct sunos_termio st;
    501   1.1  deraadt 
    502  1.13  deraadt 		if ((error = copyin(SCARG(uap, data), (caddr_t)&st,
    503   1.2  deraadt 		    sizeof (st))) != 0)
    504   1.2  deraadt 			return error;
    505   1.2  deraadt 
    506   1.2  deraadt 		/* get full BSD termios so we don't lose information */
    507   1.2  deraadt 		if ((error = (*ctl)(fp, TIOCGETA, (caddr_t)&bts, p)) != 0)
    508   1.2  deraadt 			return error;
    509   1.2  deraadt 
    510   1.2  deraadt 		/*
    511   1.2  deraadt 		 * convert to sun termios, copy in information from
    512   1.2  deraadt 		 * termio, and convert back, then set new values.
    513   1.2  deraadt 		 */
    514   1.2  deraadt 		btios2stios(&bts, &sts);
    515   1.2  deraadt 		stio2stios(&st, &sts);
    516   1.2  deraadt 		stios2btios(&sts, &bts);
    517   1.1  deraadt 
    518  1.13  deraadt 		return (*ctl)(fp, SCARG(uap, com) - SUNOS_TCSETA + TIOCSETA,
    519   1.2  deraadt 		    (caddr_t)&bts, p);
    520   1.2  deraadt 	    }
    521  1.13  deraadt 	case SUNOS_TCSETS:
    522  1.13  deraadt 	case SUNOS_TCSETSW:
    523  1.13  deraadt 	case SUNOS_TCSETSF:
    524   1.2  deraadt 	    {
    525   1.2  deraadt 		struct termios bts;
    526  1.13  deraadt 		struct sunos_termios sts;
    527   1.2  deraadt 
    528  1.13  deraadt 		if ((error = copyin (SCARG(uap, data), (caddr_t)&sts,
    529   1.2  deraadt 		    sizeof (sts))) != 0)
    530   1.2  deraadt 			return error;
    531   1.2  deraadt 		stios2btios (&sts, &bts);
    532  1.13  deraadt 		return (*ctl)(fp, SCARG(uap, com) - SUNOS_TCSETS + TIOCSETA,
    533   1.2  deraadt 		    (caddr_t)&bts, p);
    534   1.6  deraadt 	    }
    535   1.6  deraadt /*
    536   1.6  deraadt  * Pseudo-tty ioctl translations.
    537   1.6  deraadt  */
    538   1.9       pk 	case _IOW('t', 32, int): {	/* TIOCTCNTL */
    539   1.9       pk 		int error, on;
    540   1.9       pk 
    541  1.13  deraadt 		if (error = copyin (SCARG(uap, data), (caddr_t)&on, sizeof (on)))
    542   1.9       pk 			return error;
    543   1.9       pk 		return (*ctl)(fp, TIOCUCNTL, (caddr_t)&on, p);
    544   1.9       pk 	}
    545   1.6  deraadt 	case _IOW('t', 33, int): {	/* TIOCSIGNAL */
    546   1.6  deraadt 		int error, sig;
    547   1.6  deraadt 
    548  1.13  deraadt 		if (error = copyin (SCARG(uap, data), (caddr_t)&sig, sizeof (sig)))
    549   1.6  deraadt 			return error;
    550   1.7  deraadt 		return (*ctl)(fp, TIOCSIG, (caddr_t)&sig, p);
    551   1.6  deraadt 	}
    552   1.6  deraadt 
    553   1.6  deraadt /*
    554   1.6  deraadt  * Socket ioctl translations.
    555   1.6  deraadt  */
    556   1.6  deraadt #define IFREQ_IN(a) { \
    557   1.6  deraadt 	struct ifreq ifreq; \
    558  1.13  deraadt 	if (error = copyin (SCARG(uap, data), (caddr_t)&ifreq, sizeof (ifreq))) \
    559   1.6  deraadt 		return error; \
    560   1.6  deraadt 	return (*ctl)(fp, a, (caddr_t)&ifreq, p); \
    561   1.6  deraadt }
    562   1.6  deraadt #define IFREQ_INOUT(a) { \
    563   1.6  deraadt 	struct ifreq ifreq; \
    564  1.13  deraadt 	if (error = copyin (SCARG(uap, data), (caddr_t)&ifreq, sizeof (ifreq))) \
    565   1.6  deraadt 		return error; \
    566   1.6  deraadt 	if (error = (*ctl)(fp, a, (caddr_t)&ifreq, p)) \
    567   1.6  deraadt 		return error; \
    568  1.13  deraadt 	return copyout ((caddr_t)&ifreq, SCARG(uap, data), sizeof (ifreq)); \
    569   1.6  deraadt }
    570   1.6  deraadt 
    571   1.6  deraadt 	case _IOW('i', 12, struct ifreq):
    572   1.6  deraadt 		/* SIOCSIFADDR */
    573   1.6  deraadt 		break;
    574   1.6  deraadt 
    575   1.6  deraadt 	case _IOWR('i', 13, struct ifreq):
    576   1.6  deraadt 		IFREQ_INOUT(OSIOCGIFADDR);
    577   1.6  deraadt 
    578   1.6  deraadt 	case _IOW('i', 14, struct ifreq):
    579   1.6  deraadt 		/* SIOCSIFDSTADDR */
    580   1.6  deraadt 		break;
    581   1.6  deraadt 
    582   1.6  deraadt 	case _IOWR('i', 15, struct ifreq):
    583   1.6  deraadt 		IFREQ_INOUT(OSIOCGIFDSTADDR);
    584   1.6  deraadt 
    585   1.6  deraadt 	case _IOW('i', 16, struct ifreq):
    586   1.6  deraadt 		/* SIOCSIFFLAGS */
    587   1.6  deraadt 		break;
    588   1.6  deraadt 
    589   1.6  deraadt 	case _IOWR('i', 17, struct ifreq):
    590   1.6  deraadt 		/* SIOCGIFFLAGS */
    591   1.6  deraadt 		break;
    592   1.6  deraadt 
    593   1.6  deraadt 	case _IOW('i', 21, struct ifreq):
    594   1.6  deraadt 		IFREQ_IN(SIOCSIFMTU);
    595   1.6  deraadt 
    596   1.6  deraadt 	case _IOWR('i', 22, struct ifreq):
    597   1.6  deraadt 		IFREQ_INOUT(SIOCGIFMTU);
    598   1.6  deraadt 
    599   1.6  deraadt 	case _IOWR('i', 23, struct ifreq):
    600   1.6  deraadt 		IFREQ_INOUT(SIOCGIFBRDADDR);
    601   1.6  deraadt 
    602   1.6  deraadt 	case _IOW('i', 24, struct ifreq):
    603   1.6  deraadt 		IFREQ_IN(SIOCSIFBRDADDR);
    604   1.6  deraadt 
    605   1.6  deraadt 	case _IOWR('i', 25, struct ifreq):
    606   1.6  deraadt 		IFREQ_INOUT(OSIOCGIFNETMASK);
    607   1.6  deraadt 
    608   1.6  deraadt 	case _IOW('i', 26, struct ifreq):
    609   1.6  deraadt 		IFREQ_IN(SIOCSIFNETMASK);
    610   1.6  deraadt 
    611   1.6  deraadt 	case _IOWR('i', 27, struct ifreq):
    612   1.6  deraadt 		IFREQ_INOUT(SIOCGIFMETRIC);
    613   1.6  deraadt 
    614   1.6  deraadt 	case _IOWR('i', 28, struct ifreq):
    615   1.6  deraadt 		IFREQ_IN(SIOCSIFMETRIC);
    616   1.6  deraadt 
    617   1.6  deraadt 	case _IOW('i', 30, struct arpreq):
    618   1.6  deraadt 		/* SIOCSARP */
    619   1.6  deraadt 		break;
    620   1.6  deraadt 
    621   1.6  deraadt 	case _IOWR('i', 31, struct arpreq):
    622  1.10  deraadt 		/* SIOCGARP */
    623  1.10  deraadt 		break;
    624   1.6  deraadt 
    625   1.6  deraadt 	case _IOW('i', 32, struct arpreq):
    626   1.6  deraadt 		/* SIOCDARP */
    627   1.6  deraadt 		break;
    628   1.6  deraadt 
    629   1.6  deraadt 	case _IOW('i', 18, struct ifreq):	/* SIOCSIFMEM */
    630   1.6  deraadt 	case _IOWR('i', 19, struct ifreq):	/* SIOCGIFMEM */
    631   1.6  deraadt 	case _IOW('i', 40, struct ifreq):	/* SIOCUPPER */
    632   1.6  deraadt 	case _IOW('i', 41, struct ifreq):	/* SIOCLOWER */
    633   1.6  deraadt 	case _IOW('i', 44, struct ifreq):	/* SIOCSETSYNC */
    634   1.6  deraadt 	case _IOWR('i', 45, struct ifreq):	/* SIOCGETSYNC */
    635   1.6  deraadt 	case _IOWR('i', 46, struct ifreq):	/* SIOCSDSTATS */
    636   1.6  deraadt 	case _IOWR('i', 47, struct ifreq):	/* SIOCSESTATS */
    637   1.6  deraadt 	case _IOW('i', 48, int):		/* SIOCSPROMISC */
    638   1.6  deraadt 	case _IOW('i', 49, struct ifreq):	/* SIOCADDMULTI */
    639   1.6  deraadt 	case _IOW('i', 50, struct ifreq):	/* SIOCDELMULTI */
    640   1.6  deraadt 		return EOPNOTSUPP;
    641   1.6  deraadt 
    642   1.6  deraadt 	case _IOWR('i', 20, struct ifconf):	/* SIOCGIFCONF */
    643   1.6  deraadt 	    {
    644   1.6  deraadt 		struct ifconf ifconf;
    645   1.6  deraadt 
    646   1.6  deraadt 		/*
    647   1.6  deraadt 		 * XXX: two more problems
    648   1.6  deraadt 		 * 1. our sockaddr's are variable length, not always sizeof(sockaddr)
    649   1.6  deraadt 		 * 2. this returns a name per protocol, ie. it returns two "lo0"'s
    650   1.6  deraadt 		 */
    651  1.13  deraadt 		if (error = copyin (SCARG(uap, data), (caddr_t)&ifconf,
    652  1.13  deraadt 		    sizeof (ifconf)))
    653   1.6  deraadt 			return error;
    654   1.6  deraadt 		if (error = (*ctl)(fp, OSIOCGIFCONF, (caddr_t)&ifconf, p))
    655   1.6  deraadt 			return error;
    656  1.13  deraadt 		return copyout ((caddr_t)&ifconf, SCARG(uap, data),
    657  1.13  deraadt 		    sizeof (ifconf));
    658   1.1  deraadt 	    }
    659   1.1  deraadt 	}
    660   1.1  deraadt 	return (ioctl(p, uap, retval));
    661   1.1  deraadt }
    662