Home | History | Annotate | Line # | Download | only in sunos32
sunos32_ioctl.c revision 1.10
      1  1.10   thorpej /*	$NetBSD: sunos32_ioctl.c,v 1.10 2003/01/18 08:38:15 thorpej Exp $	*/
      2   1.2       mrg /* from: NetBSD: sunos_ioctl.c,v 1.35 2001/02/03 22:20:02 mrg Exp 	*/
      3   1.1       mrg 
      4   1.1       mrg /*
      5   1.1       mrg  * Copyright (c) 2001 Matthew R. Green
      6   1.1       mrg  * All rights reserved.
      7   1.1       mrg  *
      8   1.1       mrg  * Redistribution and use in source and binary forms, with or without
      9   1.1       mrg  * modification, are permitted provided that the following conditions
     10   1.1       mrg  * are met:
     11   1.1       mrg  * 1. Redistributions of source code must retain the above copyright
     12   1.1       mrg  *    notice, this list of conditions and the following disclaimer.
     13   1.1       mrg  * 2. Redistributions in binary form must reproduce the above copyright
     14   1.1       mrg  *    notice, this list of conditions and the following disclaimer in the
     15   1.1       mrg  *    documentation and/or other materials provided with the distribution.
     16   1.1       mrg  * 3. The name of the author may not be used to endorse or promote products
     17   1.1       mrg  *    derived from this software without specific prior written permission.
     18   1.1       mrg  *
     19   1.1       mrg  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     20   1.1       mrg  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     21   1.1       mrg  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     22   1.1       mrg  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     23   1.1       mrg  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     24   1.1       mrg  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     25   1.1       mrg  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     26   1.1       mrg  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     27   1.1       mrg  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     28   1.1       mrg  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     29   1.1       mrg  * SUCH DAMAGE.
     30   1.1       mrg  */
     31   1.1       mrg 
     32   1.2       mrg /*
     33   1.2       mrg  * Copyright (c) 1993 Markus Wild.
     34   1.2       mrg  * All rights reserved.
     35   1.2       mrg  *
     36   1.2       mrg  * Redistribution and use in source and binary forms, with or without
     37   1.2       mrg  * modification, are permitted provided that the following conditions
     38   1.2       mrg  * are met:
     39   1.2       mrg  * 1. Redistributions of source code must retain the above copyright
     40   1.2       mrg  *    notice, this list of conditions and the following disclaimer.
     41   1.2       mrg  * 2. The name of the author may not be used to endorse or promote products
     42   1.2       mrg  *    derived from this software without specific prior written permission
     43   1.2       mrg  *
     44   1.2       mrg  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     45   1.2       mrg  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     46   1.2       mrg  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     47   1.2       mrg  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     48   1.2       mrg  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     49   1.2       mrg  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     50   1.2       mrg  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     51   1.2       mrg  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     52   1.2       mrg  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     53   1.2       mrg  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     54   1.2       mrg  *
     55   1.2       mrg  * loosely from: Header: sunos_ioctl.c,v 1.7 93/05/28 04:40:43 torek Exp
     56   1.2       mrg  */
     57   1.7     lukem 
     58   1.7     lukem #include <sys/cdefs.h>
     59  1.10   thorpej __KERNEL_RCSID(0, "$NetBSD: sunos32_ioctl.c,v 1.10 2003/01/18 08:38:15 thorpej Exp $");
     60   1.2       mrg 
     61   1.4       mrg #if defined(_KERNEL_OPT)
     62   1.2       mrg #include "opt_compat_netbsd32.h"
     63   1.2       mrg #include "opt_execfmt.h"
     64   1.2       mrg #endif
     65   1.2       mrg 
     66   1.2       mrg #include <sys/param.h>
     67   1.2       mrg #include <sys/proc.h>
     68   1.2       mrg #include <sys/systm.h>
     69   1.2       mrg #include <sys/file.h>
     70   1.2       mrg #include <sys/filedesc.h>
     71   1.2       mrg #include <sys/ioctl.h>
     72   1.2       mrg #include <sys/termios.h>
     73   1.2       mrg #include <sys/tty.h>
     74   1.2       mrg #include <sys/socket.h>
     75   1.2       mrg #include <sys/audioio.h>
     76   1.2       mrg #include <sys/vnode.h>
     77   1.2       mrg #include <sys/mount.h>
     78   1.2       mrg #include <sys/disklabel.h>
     79  1.10   thorpej #include <sys/sa.h>
     80   1.2       mrg #include <sys/syscallargs.h>
     81   1.2       mrg 
     82   1.2       mrg #include <miscfs/specfs/specdev.h>
     83   1.2       mrg 
     84   1.2       mrg #include <net/if.h>
     85   1.2       mrg 
     86   1.2       mrg #include <dev/sun/disklabel.h>
     87   1.2       mrg 
     88   1.2       mrg #include <compat/sunos/sunos.h>
     89   1.2       mrg #include <compat/sunos/sunos_syscallargs.h>
     90   1.2       mrg #include <compat/netbsd32/netbsd32.h>
     91   1.2       mrg #include <compat/netbsd32/netbsd32_syscallargs.h>
     92   1.2       mrg #include <compat/sunos32/sunos32.h>
     93   1.2       mrg #include <compat/sunos32/sunos32_syscallargs.h>
     94   1.2       mrg #include <compat/common/compat_util.h>
     95   1.2       mrg 
     96   1.2       mrg /*
     97   1.2       mrg  * SunOS ioctl calls.
     98   1.2       mrg  * This file is something of a hodge-podge.
     99   1.2       mrg  * Support gets added as things turn up....
    100   1.2       mrg  */
    101   1.2       mrg 
    102   1.2       mrg static struct speedtab sptab[] = {
    103   1.2       mrg 	{ 0, 0 },
    104   1.2       mrg 	{ 50, 1 },
    105   1.2       mrg 	{ 75, 2 },
    106   1.2       mrg 	{ 110, 3 },
    107   1.2       mrg 	{ 134, 4 },
    108   1.2       mrg 	{ 135, 4 },
    109   1.2       mrg 	{ 150, 5 },
    110   1.2       mrg 	{ 200, 6 },
    111   1.2       mrg 	{ 300, 7 },
    112   1.2       mrg 	{ 600, 8 },
    113   1.2       mrg 	{ 1200, 9 },
    114   1.2       mrg 	{ 1800, 10 },
    115   1.2       mrg 	{ 2400, 11 },
    116   1.2       mrg 	{ 4800, 12 },
    117   1.2       mrg 	{ 9600, 13 },
    118   1.2       mrg 	{ 19200, 14 },
    119   1.2       mrg 	{ 38400, 15 },
    120   1.2       mrg 	{ -1, -1 }
    121   1.2       mrg };
    122   1.2       mrg 
    123   1.3       mrg static netbsd32_u_long s2btab[] = {
    124   1.2       mrg 	0,
    125   1.2       mrg 	50,
    126   1.2       mrg 	75,
    127   1.2       mrg 	110,
    128   1.2       mrg 	134,
    129   1.2       mrg 	150,
    130   1.2       mrg 	200,
    131   1.2       mrg 	300,
    132   1.2       mrg 	600,
    133   1.2       mrg 	1200,
    134   1.2       mrg 	1800,
    135   1.2       mrg 	2400,
    136   1.2       mrg 	4800,
    137   1.2       mrg 	9600,
    138   1.2       mrg 	19200,
    139   1.2       mrg 	38400,
    140   1.2       mrg };
    141   1.2       mrg 
    142   1.2       mrg static void stios2btios __P((struct sunos_termios *, struct termios *));
    143   1.2       mrg static void btios2stios __P((struct termios *, struct sunos_termios *));
    144   1.2       mrg static void stios2stio __P((struct sunos_termios *, struct sunos_termio *));
    145   1.2       mrg static void stio2stios __P((struct sunos_termio *, struct sunos_termios *));
    146   1.2       mrg 
    147   1.2       mrg /*
    148   1.2       mrg  * These two conversion functions have mostly been done
    149   1.2       mrg  * with some perl cut&paste, then hand-edited to comment
    150   1.2       mrg  * out what doesn't exist under NetBSD.
    151   1.2       mrg  * A note from Markus's code:
    152   1.2       mrg  *	(l & BITMASK1) / BITMASK1 * BITMASK2  is translated
    153   1.2       mrg  *	optimally by gcc m68k, much better than any ?: stuff.
    154   1.2       mrg  *	Code may vary with different architectures of course.
    155   1.2       mrg  *
    156   1.2       mrg  * I don't know what optimizer you used, but seeing divu's and
    157   1.2       mrg  * bfextu's in the m68k assembly output did not encourage me...
    158   1.2       mrg  * as well, gcc on the sparc definitely generates much better
    159   1.2       mrg  * code with `?:'.
    160   1.2       mrg  */
    161   1.2       mrg 
    162   1.2       mrg static void
    163   1.2       mrg stios2btios(st, bt)
    164   1.2       mrg 	struct sunos_termios *st;
    165   1.2       mrg 	struct termios *bt;
    166   1.2       mrg {
    167   1.3       mrg 	netbsd32_u_long l, r;
    168   1.2       mrg 
    169   1.2       mrg 	l = st->c_iflag;
    170   1.2       mrg 	r = 	((l & 0x00000001) ? IGNBRK	: 0);
    171   1.2       mrg 	r |=	((l & 0x00000002) ? BRKINT	: 0);
    172   1.2       mrg 	r |=	((l & 0x00000004) ? IGNPAR	: 0);
    173   1.2       mrg 	r |=	((l & 0x00000008) ? PARMRK	: 0);
    174   1.2       mrg 	r |=	((l & 0x00000010) ? INPCK	: 0);
    175   1.2       mrg 	r |=	((l & 0x00000020) ? ISTRIP	: 0);
    176   1.2       mrg 	r |= 	((l & 0x00000040) ? INLCR	: 0);
    177   1.2       mrg 	r |=	((l & 0x00000080) ? IGNCR	: 0);
    178   1.2       mrg 	r |=	((l & 0x00000100) ? ICRNL	: 0);
    179   1.2       mrg 	/*	((l & 0x00000200) ? IUCLC	: 0) */
    180   1.2       mrg 	r |=	((l & 0x00000400) ? IXON	: 0);
    181   1.2       mrg 	r |=	((l & 0x00000800) ? IXANY	: 0);
    182   1.2       mrg 	r |=	((l & 0x00001000) ? IXOFF	: 0);
    183   1.2       mrg 	r |=	((l & 0x00002000) ? IMAXBEL	: 0);
    184   1.2       mrg 	bt->c_iflag = r;
    185   1.2       mrg 
    186   1.2       mrg 	l = st->c_oflag;
    187   1.2       mrg 	r = 	((l & 0x00000001) ? OPOST	: 0);
    188   1.2       mrg 	/*	((l & 0x00000002) ? OLCUC	: 0) */
    189   1.2       mrg 	r |=	((l & 0x00000004) ? ONLCR	: 0);
    190   1.2       mrg 	/*	((l & 0x00000008) ? OCRNL	: 0) */
    191   1.2       mrg 	/*	((l & 0x00000010) ? ONOCR	: 0) */
    192   1.2       mrg 	/*	((l & 0x00000020) ? ONLRET	: 0) */
    193   1.2       mrg 	/*	((l & 0x00000040) ? OFILL	: 0) */
    194   1.2       mrg 	/*	((l & 0x00000080) ? OFDEL	: 0) */
    195   1.2       mrg 	/*	((l & 0x00000100) ? NLDLY	: 0) */
    196   1.2       mrg 	/*	((l & 0x00000100) ? NL1		: 0) */
    197   1.2       mrg 	/*	((l & 0x00000600) ? CRDLY	: 0) */
    198   1.2       mrg 	/*	((l & 0x00000200) ? CR1		: 0) */
    199   1.2       mrg 	/*	((l & 0x00000400) ? CR2		: 0) */
    200   1.2       mrg 	/*	((l & 0x00000600) ? CR3		: 0) */
    201   1.2       mrg 	/*	((l & 0x00001800) ? TABDLY	: 0) */
    202   1.2       mrg 	/*	((l & 0x00000800) ? TAB1	: 0) */
    203   1.2       mrg 	/*	((l & 0x00001000) ? TAB2	: 0) */
    204   1.2       mrg 	r |=	((l & 0x00001800) ? OXTABS	: 0);
    205   1.2       mrg 	/*	((l & 0x00002000) ? BSDLY	: 0) */
    206   1.2       mrg 	/*	((l & 0x00002000) ? BS1		: 0) */
    207   1.2       mrg 	/*	((l & 0x00004000) ? VTDLY	: 0) */
    208   1.2       mrg 	/*	((l & 0x00004000) ? VT1		: 0) */
    209   1.2       mrg 	/*	((l & 0x00008000) ? FFDLY	: 0) */
    210   1.2       mrg 	/*	((l & 0x00008000) ? FF1		: 0) */
    211   1.2       mrg 	/*	((l & 0x00010000) ? PAGEOUT	: 0) */
    212   1.2       mrg 	/*	((l & 0x00020000) ? WRAP	: 0) */
    213   1.2       mrg 	bt->c_oflag = r;
    214   1.2       mrg 
    215   1.2       mrg 	l = st->c_cflag;
    216   1.2       mrg 	switch (l & 0x00000030) {
    217   1.2       mrg 	case 0:
    218   1.2       mrg 		r = CS5;
    219   1.2       mrg 		break;
    220   1.2       mrg 	case 0x00000010:
    221   1.2       mrg 		r = CS6;
    222   1.2       mrg 		break;
    223   1.2       mrg 	case 0x00000020:
    224   1.2       mrg 		r = CS7;
    225   1.2       mrg 		break;
    226   1.2       mrg 	case 0x00000030:
    227   1.2       mrg 		r = CS8;
    228   1.2       mrg 		break;
    229   1.2       mrg 	}
    230   1.2       mrg 	r |=	((l & 0x00000040) ? CSTOPB	: 0);
    231   1.2       mrg 	r |=	((l & 0x00000080) ? CREAD	: 0);
    232   1.2       mrg 	r |= 	((l & 0x00000100) ? PARENB	: 0);
    233   1.2       mrg 	r |=	((l & 0x00000200) ? PARODD	: 0);
    234   1.2       mrg 	r |=	((l & 0x00000400) ? HUPCL	: 0);
    235   1.2       mrg 	r |=	((l & 0x00000800) ? CLOCAL	: 0);
    236   1.2       mrg 	/*	((l & 0x00001000) ? LOBLK	: 0) */
    237   1.2       mrg 	r |=	((l & 0x80000000) ? (CRTS_IFLOW|CCTS_OFLOW) : 0);
    238   1.2       mrg 	bt->c_cflag = r;
    239   1.2       mrg 
    240   1.2       mrg 	bt->c_ispeed = bt->c_ospeed = s2btab[l & 0x0000000f];
    241   1.2       mrg 
    242   1.2       mrg 	l = st->c_lflag;
    243   1.2       mrg 	r = 	((l & 0x00000001) ? ISIG	: 0);
    244   1.2       mrg 	r |=	((l & 0x00000002) ? ICANON	: 0);
    245   1.2       mrg 	/*	((l & 0x00000004) ? XCASE	: 0) */
    246   1.2       mrg 	r |=	((l & 0x00000008) ? ECHO	: 0);
    247   1.2       mrg 	r |=	((l & 0x00000010) ? ECHOE	: 0);
    248   1.2       mrg 	r |=	((l & 0x00000020) ? ECHOK	: 0);
    249   1.2       mrg 	r |=	((l & 0x00000040) ? ECHONL	: 0);
    250   1.2       mrg 	r |= 	((l & 0x00000080) ? NOFLSH	: 0);
    251   1.2       mrg 	r |=	((l & 0x00000100) ? TOSTOP	: 0);
    252   1.2       mrg 	r |=	((l & 0x00000200) ? ECHOCTL	: 0);
    253   1.2       mrg 	r |=	((l & 0x00000400) ? ECHOPRT	: 0);
    254   1.2       mrg 	r |=	((l & 0x00000800) ? ECHOKE	: 0);
    255   1.2       mrg 	/*	((l & 0x00001000) ? DEFECHO	: 0) */
    256   1.2       mrg 	r |=	((l & 0x00002000) ? FLUSHO	: 0);
    257   1.2       mrg 	r |=	((l & 0x00004000) ? PENDIN	: 0);
    258   1.2       mrg 	bt->c_lflag = r;
    259   1.2       mrg 
    260   1.2       mrg 	bt->c_cc[VINTR]    = st->c_cc[0]  ? st->c_cc[0]  : _POSIX_VDISABLE;
    261   1.2       mrg 	bt->c_cc[VQUIT]    = st->c_cc[1]  ? st->c_cc[1]  : _POSIX_VDISABLE;
    262   1.2       mrg 	bt->c_cc[VERASE]   = st->c_cc[2]  ? st->c_cc[2]  : _POSIX_VDISABLE;
    263   1.2       mrg 	bt->c_cc[VKILL]    = st->c_cc[3]  ? st->c_cc[3]  : _POSIX_VDISABLE;
    264   1.2       mrg 	bt->c_cc[VEOF]     = st->c_cc[4]  ? st->c_cc[4]  : _POSIX_VDISABLE;
    265   1.2       mrg 	bt->c_cc[VEOL]     = st->c_cc[5]  ? st->c_cc[5]  : _POSIX_VDISABLE;
    266   1.2       mrg 	bt->c_cc[VEOL2]    = st->c_cc[6]  ? st->c_cc[6]  : _POSIX_VDISABLE;
    267   1.2       mrg     /*	bt->c_cc[VSWTCH]   = st->c_cc[7]  ? st->c_cc[7]  : _POSIX_VDISABLE; */
    268   1.2       mrg 	bt->c_cc[VSTART]   = st->c_cc[8]  ? st->c_cc[8]  : _POSIX_VDISABLE;
    269   1.2       mrg 	bt->c_cc[VSTOP]    = st->c_cc[9]  ? st->c_cc[9]  : _POSIX_VDISABLE;
    270   1.2       mrg 	bt->c_cc[VSUSP]    = st->c_cc[10] ? st->c_cc[10] : _POSIX_VDISABLE;
    271   1.2       mrg 	bt->c_cc[VDSUSP]   = st->c_cc[11] ? st->c_cc[11] : _POSIX_VDISABLE;
    272   1.2       mrg 	bt->c_cc[VREPRINT] = st->c_cc[12] ? st->c_cc[12] : _POSIX_VDISABLE;
    273   1.2       mrg 	bt->c_cc[VDISCARD] = st->c_cc[13] ? st->c_cc[13] : _POSIX_VDISABLE;
    274   1.2       mrg 	bt->c_cc[VWERASE]  = st->c_cc[14] ? st->c_cc[14] : _POSIX_VDISABLE;
    275   1.2       mrg 	bt->c_cc[VLNEXT]   = st->c_cc[15] ? st->c_cc[15] : _POSIX_VDISABLE;
    276   1.2       mrg 	bt->c_cc[VSTATUS]  = st->c_cc[16] ? st->c_cc[16] : _POSIX_VDISABLE;
    277   1.2       mrg 
    278   1.2       mrg 	/* if `raw mode', create native VMIN/VTIME from SunOS VEOF/VEOL */
    279   1.2       mrg 	bt->c_cc[VMIN]	   = (bt->c_lflag & ICANON) ? 1 : bt->c_cc[VEOF];
    280   1.2       mrg 	bt->c_cc[VTIME]	   = (bt->c_lflag & ICANON) ? 1 : bt->c_cc[VEOL];
    281   1.2       mrg }
    282   1.2       mrg 
    283   1.2       mrg 
    284   1.2       mrg static void
    285   1.2       mrg btios2stios(bt, st)
    286   1.2       mrg 	struct termios *bt;
    287   1.2       mrg 	struct sunos_termios *st;
    288   1.2       mrg {
    289   1.3       mrg 	netbsd32_u_long l, r;
    290   1.2       mrg 	int s;
    291   1.2       mrg 
    292   1.2       mrg 	l = bt->c_iflag;
    293   1.2       mrg 	r = 	((l &  IGNBRK) ? 0x00000001	: 0);
    294   1.2       mrg 	r |=	((l &  BRKINT) ? 0x00000002	: 0);
    295   1.2       mrg 	r |=	((l &  IGNPAR) ? 0x00000004	: 0);
    296   1.2       mrg 	r |=	((l &  PARMRK) ? 0x00000008	: 0);
    297   1.2       mrg 	r |=	((l &   INPCK) ? 0x00000010	: 0);
    298   1.2       mrg 	r |=	((l &  ISTRIP) ? 0x00000020	: 0);
    299   1.2       mrg 	r |=	((l &   INLCR) ? 0x00000040	: 0);
    300   1.2       mrg 	r |=	((l &   IGNCR) ? 0x00000080	: 0);
    301   1.2       mrg 	r |=	((l &   ICRNL) ? 0x00000100	: 0);
    302   1.2       mrg 	/*	((l &   IUCLC) ? 0x00000200	: 0) */
    303   1.2       mrg 	r |=	((l &    IXON) ? 0x00000400	: 0);
    304   1.2       mrg 	r |=	((l &   IXANY) ? 0x00000800	: 0);
    305   1.2       mrg 	r |=	((l &   IXOFF) ? 0x00001000	: 0);
    306   1.2       mrg 	r |=	((l & IMAXBEL) ? 0x00002000	: 0);
    307   1.2       mrg 	st->c_iflag = r;
    308   1.2       mrg 
    309   1.2       mrg 	l = bt->c_oflag;
    310   1.2       mrg 	r =	((l &   OPOST) ? 0x00000001	: 0);
    311   1.2       mrg 	/*	((l &   OLCUC) ? 0x00000002	: 0) */
    312   1.2       mrg 	r |=	((l &   ONLCR) ? 0x00000004	: 0);
    313   1.2       mrg 	/*	((l &   OCRNL) ? 0x00000008	: 0) */
    314   1.2       mrg 	/*	((l &   ONOCR) ? 0x00000010	: 0) */
    315   1.2       mrg 	/*	((l &  ONLRET) ? 0x00000020	: 0) */
    316   1.2       mrg 	/*	((l &   OFILL) ? 0x00000040	: 0) */
    317   1.2       mrg 	/*	((l &   OFDEL) ? 0x00000080	: 0) */
    318   1.2       mrg 	/*	((l &   NLDLY) ? 0x00000100	: 0) */
    319   1.2       mrg 	/*	((l &     NL1) ? 0x00000100	: 0) */
    320   1.2       mrg 	/*	((l &   CRDLY) ? 0x00000600	: 0) */
    321   1.2       mrg 	/*	((l &     CR1) ? 0x00000200	: 0) */
    322   1.2       mrg 	/*	((l &     CR2) ? 0x00000400	: 0) */
    323   1.2       mrg 	/*	((l &     CR3) ? 0x00000600	: 0) */
    324   1.2       mrg 	/*	((l &  TABDLY) ? 0x00001800	: 0) */
    325   1.2       mrg 	/*	((l &    TAB1) ? 0x00000800	: 0) */
    326   1.2       mrg 	/*	((l &    TAB2) ? 0x00001000	: 0) */
    327   1.2       mrg 	r |=	((l &  OXTABS) ? 0x00001800	: 0);
    328   1.2       mrg 	/*	((l &   BSDLY) ? 0x00002000	: 0) */
    329   1.2       mrg 	/*	((l &     BS1) ? 0x00002000	: 0) */
    330   1.2       mrg 	/*	((l &   VTDLY) ? 0x00004000	: 0) */
    331   1.2       mrg 	/*	((l &     VT1) ? 0x00004000	: 0) */
    332   1.2       mrg 	/*	((l &   FFDLY) ? 0x00008000	: 0) */
    333   1.2       mrg 	/*	((l &     FF1) ? 0x00008000	: 0) */
    334   1.2       mrg 	/*	((l & PAGEOUT) ? 0x00010000	: 0) */
    335   1.2       mrg 	/*	((l &    WRAP) ? 0x00020000	: 0) */
    336   1.2       mrg 	st->c_oflag = r;
    337   1.2       mrg 
    338   1.2       mrg 	l = bt->c_cflag;
    339   1.2       mrg 	switch (l & CSIZE) {
    340   1.2       mrg 	case CS5:
    341   1.2       mrg 		r = 0;
    342   1.2       mrg 		break;
    343   1.2       mrg 	case CS6:
    344   1.2       mrg 		r = 0x00000010;
    345   1.2       mrg 		break;
    346   1.2       mrg 	case CS7:
    347   1.2       mrg 		r = 0x00000020;
    348   1.2       mrg 		break;
    349   1.2       mrg 	case CS8:
    350   1.2       mrg 		r = 0x00000030;
    351   1.2       mrg 		break;
    352   1.2       mrg 	}
    353   1.2       mrg 	r |=	((l &  CSTOPB) ? 0x00000040	: 0);
    354   1.2       mrg 	r |=	((l &   CREAD) ? 0x00000080	: 0);
    355   1.2       mrg 	r |=	((l &  PARENB) ? 0x00000100	: 0);
    356   1.2       mrg 	r |=	((l &  PARODD) ? 0x00000200	: 0);
    357   1.2       mrg 	r |=	((l &   HUPCL) ? 0x00000400	: 0);
    358   1.2       mrg 	r |=	((l &  CLOCAL) ? 0x00000800	: 0);
    359   1.2       mrg 	/*	((l &   LOBLK) ? 0x00001000	: 0) */
    360   1.2       mrg 	r |=	((l & (CRTS_IFLOW|CCTS_OFLOW)) ? 0x80000000 : 0);
    361   1.2       mrg 	st->c_cflag = r;
    362   1.2       mrg 
    363   1.2       mrg 	l = bt->c_lflag;
    364   1.2       mrg 	r =	((l &    ISIG) ? 0x00000001	: 0);
    365   1.2       mrg 	r |=	((l &  ICANON) ? 0x00000002	: 0);
    366   1.2       mrg 	/*	((l &   XCASE) ? 0x00000004	: 0) */
    367   1.2       mrg 	r |=	((l &    ECHO) ? 0x00000008	: 0);
    368   1.2       mrg 	r |=	((l &   ECHOE) ? 0x00000010	: 0);
    369   1.2       mrg 	r |=	((l &   ECHOK) ? 0x00000020	: 0);
    370   1.2       mrg 	r |=	((l &  ECHONL) ? 0x00000040	: 0);
    371   1.2       mrg 	r |=	((l &  NOFLSH) ? 0x00000080	: 0);
    372   1.2       mrg 	r |=	((l &  TOSTOP) ? 0x00000100	: 0);
    373   1.2       mrg 	r |=	((l & ECHOCTL) ? 0x00000200	: 0);
    374   1.2       mrg 	r |=	((l & ECHOPRT) ? 0x00000400	: 0);
    375   1.2       mrg 	r |=	((l &  ECHOKE) ? 0x00000800	: 0);
    376   1.2       mrg 	/*	((l & DEFECHO) ? 0x00001000	: 0) */
    377   1.2       mrg 	r |=	((l &  FLUSHO) ? 0x00002000	: 0);
    378   1.2       mrg 	r |=	((l &  PENDIN) ? 0x00004000	: 0);
    379   1.2       mrg 	st->c_lflag = r;
    380   1.2       mrg 
    381   1.2       mrg 	s = ttspeedtab(bt->c_ospeed, sptab);
    382   1.2       mrg 	if (s >= 0)
    383   1.2       mrg 		st->c_cflag |= s;
    384   1.2       mrg 
    385   1.2       mrg 	st->c_cc[0] = bt->c_cc[VINTR]   != _POSIX_VDISABLE? bt->c_cc[VINTR]:0;
    386   1.2       mrg 	st->c_cc[1] = bt->c_cc[VQUIT]   != _POSIX_VDISABLE? bt->c_cc[VQUIT]:0;
    387   1.2       mrg 	st->c_cc[2] = bt->c_cc[VERASE]  != _POSIX_VDISABLE? bt->c_cc[VERASE]:0;
    388   1.2       mrg 	st->c_cc[3] = bt->c_cc[VKILL]   != _POSIX_VDISABLE? bt->c_cc[VKILL]:0;
    389   1.2       mrg 	st->c_cc[4] = bt->c_cc[VEOF]    != _POSIX_VDISABLE? bt->c_cc[VEOF]:0;
    390   1.2       mrg 	st->c_cc[5] = bt->c_cc[VEOL]    != _POSIX_VDISABLE? bt->c_cc[VEOL]:0;
    391   1.2       mrg 	st->c_cc[6] = bt->c_cc[VEOL2]   != _POSIX_VDISABLE? bt->c_cc[VEOL2]:0;
    392   1.2       mrg 	st->c_cc[7] = 0;
    393   1.2       mrg 		/*    bt->c_cc[VSWTCH]  != _POSIX_VDISABLE? bt->c_cc[VSWTCH]: */
    394   1.2       mrg 	st->c_cc[8] = bt->c_cc[VSTART]  != _POSIX_VDISABLE? bt->c_cc[VSTART]:0;
    395   1.2       mrg 	st->c_cc[9] = bt->c_cc[VSTOP]   != _POSIX_VDISABLE? bt->c_cc[VSTOP]:0;
    396   1.2       mrg 	st->c_cc[10]= bt->c_cc[VSUSP]   != _POSIX_VDISABLE? bt->c_cc[VSUSP]:0;
    397   1.2       mrg 	st->c_cc[11]= bt->c_cc[VDSUSP]  != _POSIX_VDISABLE? bt->c_cc[VDSUSP]:0;
    398   1.2       mrg 	st->c_cc[12]= bt->c_cc[VREPRINT]!= _POSIX_VDISABLE? bt->c_cc[VREPRINT]:0;
    399   1.2       mrg 	st->c_cc[13]= bt->c_cc[VDISCARD]!= _POSIX_VDISABLE? bt->c_cc[VDISCARD]:0;
    400   1.2       mrg 	st->c_cc[14]= bt->c_cc[VWERASE] != _POSIX_VDISABLE? bt->c_cc[VWERASE]:0;
    401   1.2       mrg 	st->c_cc[15]= bt->c_cc[VLNEXT]  != _POSIX_VDISABLE? bt->c_cc[VLNEXT]:0;
    402   1.2       mrg 	st->c_cc[16]= bt->c_cc[VSTATUS] != _POSIX_VDISABLE? bt->c_cc[VSTATUS]:0;
    403   1.2       mrg 
    404   1.2       mrg 	if (!(bt->c_lflag & ICANON)) {
    405   1.2       mrg 		/* SunOS stores VMIN/VTIME in VEOF/VEOL (if ICANON is off) */
    406   1.2       mrg 		st->c_cc[4] = bt->c_cc[VMIN];
    407   1.2       mrg 		st->c_cc[5] = bt->c_cc[VTIME];
    408   1.2       mrg 	}
    409   1.2       mrg 
    410   1.2       mrg 	st->c_line = 0;
    411   1.2       mrg }
    412   1.2       mrg 
    413   1.2       mrg static void
    414   1.2       mrg stios2stio(ts, t)
    415   1.2       mrg 	struct sunos_termios *ts;
    416   1.2       mrg 	struct sunos_termio *t;
    417   1.2       mrg {
    418   1.2       mrg 	t->c_iflag = ts->c_iflag;
    419   1.2       mrg 	t->c_oflag = ts->c_oflag;
    420   1.2       mrg 	t->c_cflag = ts->c_cflag;
    421   1.2       mrg 	t->c_lflag = ts->c_lflag;
    422   1.2       mrg 	t->c_line  = ts->c_line;
    423   1.2       mrg 	memcpy(t->c_cc, ts->c_cc, 8);
    424   1.2       mrg }
    425   1.2       mrg 
    426   1.2       mrg static void
    427   1.2       mrg stio2stios(t, ts)
    428   1.2       mrg 	struct sunos_termio *t;
    429   1.2       mrg 	struct sunos_termios *ts;
    430   1.2       mrg {
    431   1.2       mrg 	ts->c_iflag = t->c_iflag;
    432   1.2       mrg 	ts->c_oflag = t->c_oflag;
    433   1.2       mrg 	ts->c_cflag = t->c_cflag;
    434   1.2       mrg 	ts->c_lflag = t->c_lflag;
    435   1.2       mrg 	ts->c_line  = t->c_line;
    436   1.2       mrg 	memcpy(ts->c_cc, t->c_cc, 8); /* don't touch the upper fields! */
    437   1.2       mrg }
    438   1.2       mrg 
    439   1.2       mrg int
    440  1.10   thorpej sunos32_sys_ioctl(l, v, retval)
    441  1.10   thorpej 	struct lwp *l;
    442   1.2       mrg 	void *v;
    443   1.2       mrg 	register_t *retval;
    444   1.2       mrg {
    445   1.2       mrg 	struct sunos32_sys_ioctl_args /* {
    446   1.2       mrg 		int	fd;
    447   1.2       mrg 		netbsd32_u_long	com;
    448   1.2       mrg 		netbsd32_caddr_t	data;
    449   1.2       mrg 	} */ *uap = v;
    450  1.10   thorpej 	struct proc *p = l->l_proc;
    451   1.2       mrg 	struct filedesc *fdp = p->p_fd;
    452   1.2       mrg 	struct file *fp;
    453   1.2       mrg 	int (*ctl) __P((struct file *, u_long, caddr_t, struct proc *));
    454   1.2       mrg 	int error;
    455   1.2       mrg 
    456   1.6   thorpej 	if ((fp = fd_getfile(fdp, SCARG(uap, fd))) == NULL)
    457   1.2       mrg 		return EBADF;
    458   1.2       mrg 
    459   1.2       mrg 	if ((fp->f_flag & (FREAD|FWRITE)) == 0)
    460   1.2       mrg 		return EBADF;
    461   1.2       mrg 
    462   1.2       mrg 	ctl = fp->f_ops->fo_ioctl;
    463   1.2       mrg 
    464   1.2       mrg 	switch (SCARG(uap, com)) {
    465   1.2       mrg 	case _IOR('t', 0, int):
    466   1.2       mrg 		SCARG(uap, com) = TIOCGETD;
    467   1.2       mrg 		break;
    468   1.2       mrg 	case _IOW('t', 1, int):
    469   1.2       mrg 	    {
    470   1.2       mrg 		int disc;
    471   1.2       mrg 
    472   1.2       mrg 		if ((error = copyin((caddr_t)(u_long)SCARG(uap, data), (caddr_t)&disc,
    473   1.2       mrg 		    sizeof disc)) != 0)
    474   1.2       mrg 			return error;
    475   1.2       mrg 
    476   1.2       mrg 		/* map SunOS NTTYDISC into our termios discipline */
    477   1.2       mrg 		if (disc == 2)
    478   1.2       mrg 			disc = 0;
    479   1.2       mrg 		/* all other disciplines are not supported by NetBSD */
    480   1.2       mrg 		if (disc)
    481   1.2       mrg 			return ENXIO;
    482   1.2       mrg 
    483   1.2       mrg 		return (*ctl)(fp, TIOCSETD, (caddr_t)&disc, p);
    484   1.2       mrg 	    }
    485   1.2       mrg 	case _IOW('t', 101, int):	/* sun SUNOS_TIOCSSOFTCAR */
    486   1.2       mrg 	    {
    487   1.2       mrg 		int x;	/* unused */
    488   1.2       mrg 
    489   1.2       mrg 		return copyin((caddr_t)&x, (caddr_t)(u_long)SCARG(uap, data), sizeof x);
    490   1.2       mrg 	    }
    491   1.2       mrg 	case _IOR('t', 100, int):	/* sun SUNOS_TIOCSSOFTCAR */
    492   1.2       mrg 	    {
    493   1.2       mrg 		int x = 0;
    494   1.2       mrg 
    495   1.2       mrg 		return copyout((caddr_t)&x, (caddr_t)(u_long)SCARG(uap, data), sizeof x);
    496   1.2       mrg 	    }
    497   1.2       mrg 	case _IO('t', 36): 		/* sun TIOCCONS, no parameters */
    498   1.2       mrg 	    {
    499   1.2       mrg 		int on = 1;
    500   1.2       mrg 		return (*ctl)(fp, TIOCCONS, (caddr_t)&on, p);
    501   1.2       mrg 	    }
    502   1.2       mrg 	case _IOW('t', 37, struct sunos_ttysize):
    503   1.2       mrg 	    {
    504   1.2       mrg 		struct winsize ws;
    505   1.2       mrg 		struct sunos_ttysize ss;
    506   1.2       mrg 
    507   1.2       mrg 		if ((error = (*ctl)(fp, TIOCGWINSZ, (caddr_t)&ws, p)) != 0)
    508   1.2       mrg 			return (error);
    509   1.2       mrg 
    510   1.2       mrg 		if ((error = copyin ((caddr_t)(u_long)SCARG(uap, data), &ss, sizeof (ss))) != 0)
    511   1.2       mrg 			return error;
    512   1.2       mrg 
    513   1.2       mrg 		ws.ws_row = ss.ts_row;
    514   1.2       mrg 		ws.ws_col = ss.ts_col;
    515   1.2       mrg 
    516   1.2       mrg 		return ((*ctl)(fp, TIOCSWINSZ, (caddr_t)&ws, p));
    517   1.2       mrg 	    }
    518   1.2       mrg 	case _IOW('t', 38, struct sunos_ttysize):
    519   1.2       mrg 	    {
    520   1.2       mrg 		struct winsize ws;
    521   1.2       mrg 		struct sunos_ttysize ss;
    522   1.2       mrg 
    523   1.2       mrg 		if ((error = (*ctl)(fp, TIOCGWINSZ, (caddr_t)&ws, p)) != 0)
    524   1.2       mrg 			return (error);
    525   1.2       mrg 
    526   1.2       mrg 		ss.ts_row = ws.ws_row;
    527   1.2       mrg 		ss.ts_col = ws.ws_col;
    528   1.2       mrg 
    529   1.2       mrg 		return copyout ((caddr_t)&ss, (caddr_t)(u_long)SCARG(uap, data), sizeof (ss));
    530   1.2       mrg 	    }
    531   1.2       mrg 	case _IOW('t', 130, int):	/* TIOCSETPGRP: posix variant */
    532   1.2       mrg 		SCARG(uap, com) = TIOCSPGRP;
    533   1.2       mrg 		break;
    534   1.2       mrg 	case _IOR('t', 131, int):	/* TIOCGETPGRP: posix variant */
    535   1.2       mrg 	    {
    536   1.2       mrg 		/*
    537   1.2       mrg 		 * sigh, must do error translation on pty devices
    538   1.2       mrg 		 * (see also kern/tty_pty.c)
    539   1.2       mrg 		 */
    540   1.2       mrg 		int pgrp;
    541   1.2       mrg 		struct vnode *vp;
    542   1.2       mrg 		error = (*ctl)(fp, TIOCGPGRP, (caddr_t)&pgrp, p);
    543   1.2       mrg 		if (error) {
    544   1.2       mrg 			vp = (struct vnode *)fp->f_data;
    545   1.2       mrg 			if (error == EIO && vp != NULL &&
    546   1.2       mrg 			    vp->v_type == VCHR && major(vp->v_rdev) == 21)
    547   1.2       mrg 				error = ENOTTY;
    548   1.2       mrg 			return (error);
    549   1.2       mrg 		}
    550   1.2       mrg 		return copyout((caddr_t)&pgrp, (caddr_t)(u_long)SCARG(uap, data), sizeof(pgrp));
    551   1.2       mrg 	    }
    552   1.2       mrg 	case _IO('t', 132):
    553   1.2       mrg 		SCARG(uap, com) = TIOCSCTTY;
    554   1.2       mrg 		break;
    555   1.2       mrg 	case SUNOS_TCGETA:
    556   1.2       mrg 	case SUNOS_TCGETS:
    557   1.2       mrg 	    {
    558   1.2       mrg 		struct termios bts;
    559   1.2       mrg 		struct sunos_termios sts;
    560   1.2       mrg 		struct sunos_termio st;
    561   1.2       mrg 
    562   1.2       mrg 		if ((error = (*ctl)(fp, TIOCGETA, (caddr_t)&bts, p)) != 0)
    563   1.2       mrg 			return error;
    564   1.2       mrg 
    565   1.2       mrg 		btios2stios (&bts, &sts);
    566   1.2       mrg 		if (SCARG(uap, com) == SUNOS_TCGETA) {
    567   1.2       mrg 			stios2stio (&sts, &st);
    568   1.2       mrg 			return copyout((caddr_t)&st, (caddr_t)(u_long)SCARG(uap, data),
    569   1.2       mrg 			    sizeof (st));
    570   1.2       mrg 		} else
    571   1.2       mrg 			return copyout((caddr_t)&sts, (caddr_t)(u_long)SCARG(uap, data),
    572   1.2       mrg 			    sizeof (sts));
    573   1.2       mrg 		/*NOTREACHED*/
    574   1.2       mrg 	    }
    575   1.2       mrg 	case SUNOS_TCSETA:
    576   1.2       mrg 	case SUNOS_TCSETAW:
    577   1.2       mrg 	case SUNOS_TCSETAF:
    578   1.2       mrg 	    {
    579   1.2       mrg 		struct termios bts;
    580   1.2       mrg 		struct sunos_termios sts;
    581   1.2       mrg 		struct sunos_termio st;
    582   1.2       mrg 
    583   1.2       mrg 		if ((error = copyin((caddr_t)(u_long)SCARG(uap, data), (caddr_t)&st,
    584   1.2       mrg 		    sizeof (st))) != 0)
    585   1.2       mrg 			return error;
    586   1.2       mrg 
    587   1.2       mrg 		/* get full BSD termios so we don't lose information */
    588   1.2       mrg 		if ((error = (*ctl)(fp, TIOCGETA, (caddr_t)&bts, p)) != 0)
    589   1.2       mrg 			return error;
    590   1.2       mrg 
    591   1.2       mrg 		/*
    592   1.2       mrg 		 * convert to sun termios, copy in information from
    593   1.2       mrg 		 * termio, and convert back, then set new values.
    594   1.2       mrg 		 */
    595   1.2       mrg 		btios2stios(&bts, &sts);
    596   1.2       mrg 		stio2stios(&st, &sts);
    597   1.2       mrg 		stios2btios(&sts, &bts);
    598   1.2       mrg 
    599   1.2       mrg 		return (*ctl)(fp, SCARG(uap, com) - SUNOS_TCSETA + TIOCSETA,
    600   1.2       mrg 		    (caddr_t)&bts, p);
    601   1.2       mrg 	    }
    602   1.2       mrg 	case SUNOS_TCSETS:
    603   1.2       mrg 	case SUNOS_TCSETSW:
    604   1.2       mrg 	case SUNOS_TCSETSF:
    605   1.2       mrg 	    {
    606   1.2       mrg 		struct termios bts;
    607   1.2       mrg 		struct sunos_termios sts;
    608   1.2       mrg 
    609   1.2       mrg 		if ((error = copyin ((caddr_t)(u_long)SCARG(uap, data), (caddr_t)&sts,
    610   1.2       mrg 		    sizeof (sts))) != 0)
    611   1.2       mrg 			return error;
    612   1.2       mrg 		stios2btios (&sts, &bts);
    613   1.2       mrg 		return (*ctl)(fp, SCARG(uap, com) - SUNOS_TCSETS + TIOCSETA,
    614   1.2       mrg 		    (caddr_t)&bts, p);
    615   1.2       mrg 	    }
    616   1.2       mrg /*
    617   1.2       mrg  * Pseudo-tty ioctl translations.
    618   1.2       mrg  */
    619   1.2       mrg 	case _IOW('t', 32, int): {	/* TIOCTCNTL */
    620   1.2       mrg 		int error, on;
    621   1.2       mrg 
    622   1.2       mrg 		error = copyin ((caddr_t)(u_long)SCARG(uap, data), (caddr_t)&on, sizeof (on));
    623   1.2       mrg 		if (error)
    624   1.2       mrg 			return error;
    625   1.2       mrg 		return (*ctl)(fp, TIOCUCNTL, (caddr_t)&on, p);
    626   1.2       mrg 	}
    627   1.2       mrg 	case _IOW('t', 33, int): {	/* TIOCSIGNAL */
    628   1.2       mrg 		int error, sig;
    629   1.2       mrg 
    630   1.2       mrg 		error = copyin ((caddr_t)(u_long)SCARG(uap, data), (caddr_t)&sig, sizeof (sig));
    631   1.2       mrg 		if (error)
    632   1.2       mrg 			return error;
    633   1.2       mrg 		return (*ctl)(fp, TIOCSIG, (caddr_t)&sig, p);
    634   1.2       mrg 	}
    635   1.2       mrg 
    636   1.2       mrg /*
    637   1.2       mrg  * Socket ioctl translations.
    638   1.2       mrg  */
    639   1.2       mrg #define IFREQ_IN(a) { \
    640   1.2       mrg 	struct ifreq ifreq; \
    641   1.2       mrg 	error = copyin ((caddr_t)(u_long)SCARG(uap, data), (caddr_t)&ifreq, sizeof (ifreq)); \
    642   1.2       mrg 	if (error) \
    643   1.2       mrg 		return error; \
    644   1.2       mrg 	return (*ctl)(fp, a, (caddr_t)&ifreq, p); \
    645   1.2       mrg }
    646   1.2       mrg #define IFREQ_INOUT(a) { \
    647   1.2       mrg 	struct ifreq ifreq; \
    648   1.2       mrg 	error = copyin ((caddr_t)(u_long)SCARG(uap, data), (caddr_t)&ifreq, sizeof (ifreq)); \
    649   1.2       mrg 	if (error) \
    650   1.2       mrg 		return error; \
    651   1.2       mrg 	if ((error = (*ctl)(fp, a, (caddr_t)&ifreq, p)) != 0) \
    652   1.2       mrg 		return error; \
    653   1.2       mrg 	return copyout ((caddr_t)&ifreq, (caddr_t)(u_long)SCARG(uap, data), sizeof (ifreq)); \
    654   1.2       mrg }
    655   1.2       mrg 
    656   1.2       mrg 	case _IOW('i', 12, struct ifreq):
    657   1.2       mrg 		/* SIOCSIFADDR */
    658   1.2       mrg 		break;
    659   1.2       mrg 
    660   1.2       mrg 	case _IOWR('i', 13, struct ifreq):
    661   1.2       mrg 		IFREQ_INOUT(OSIOCGIFADDR);
    662   1.2       mrg 
    663   1.2       mrg 	case _IOW('i', 14, struct ifreq):
    664   1.2       mrg 		/* SIOCSIFDSTADDR */
    665   1.2       mrg 		break;
    666   1.2       mrg 
    667   1.2       mrg 	case _IOWR('i', 15, struct ifreq):
    668   1.2       mrg 		IFREQ_INOUT(OSIOCGIFDSTADDR);
    669   1.2       mrg 
    670   1.2       mrg 	case _IOW('i', 16, struct ifreq):
    671   1.2       mrg 		/* SIOCSIFFLAGS */
    672   1.2       mrg 		break;
    673   1.2       mrg 
    674   1.2       mrg 	case _IOWR('i', 17, struct ifreq):
    675   1.2       mrg 		/* SIOCGIFFLAGS */
    676   1.2       mrg 		break;
    677   1.2       mrg 
    678   1.2       mrg 	case _IOW('i', 21, struct ifreq):
    679   1.2       mrg 		IFREQ_IN(SIOCSIFMTU);
    680   1.2       mrg 
    681   1.2       mrg 	case _IOWR('i', 22, struct ifreq):
    682   1.2       mrg 		IFREQ_INOUT(SIOCGIFMTU);
    683   1.2       mrg 
    684   1.2       mrg 	case _IOWR('i', 23, struct ifreq):
    685   1.2       mrg 		IFREQ_INOUT(SIOCGIFBRDADDR);
    686   1.2       mrg 
    687   1.2       mrg 	case _IOW('i', 24, struct ifreq):
    688   1.2       mrg 		IFREQ_IN(SIOCSIFBRDADDR);
    689   1.2       mrg 
    690   1.2       mrg 	case _IOWR('i', 25, struct ifreq):
    691   1.2       mrg 		IFREQ_INOUT(OSIOCGIFNETMASK);
    692   1.2       mrg 
    693   1.2       mrg 	case _IOW('i', 26, struct ifreq):
    694   1.2       mrg 		IFREQ_IN(SIOCSIFNETMASK);
    695   1.2       mrg 
    696   1.2       mrg 	case _IOWR('i', 27, struct ifreq):
    697   1.2       mrg 		IFREQ_INOUT(SIOCGIFMETRIC);
    698   1.2       mrg 
    699   1.2       mrg 	case _IOWR('i', 28, struct ifreq):
    700   1.2       mrg 		IFREQ_IN(SIOCSIFMETRIC);
    701   1.2       mrg 
    702   1.2       mrg 	case _IOW('i', 30, struct arpreq):
    703   1.2       mrg 		/* SIOCSARP */
    704   1.2       mrg 		break;
    705   1.2       mrg 
    706   1.2       mrg 	case _IOWR('i', 31, struct arpreq):
    707   1.2       mrg 		/* SIOCGARP */
    708   1.2       mrg 		break;
    709   1.2       mrg 
    710   1.2       mrg 	case _IOW('i', 32, struct arpreq):
    711   1.2       mrg 		/* SIOCDARP */
    712   1.2       mrg 		break;
    713   1.2       mrg 
    714   1.2       mrg 	case _IOW('i', 18, struct ifreq):	/* SIOCSIFMEM */
    715   1.2       mrg 	case _IOWR('i', 19, struct ifreq):	/* SIOCGIFMEM */
    716   1.2       mrg 	case _IOW('i', 40, struct ifreq):	/* SIOCUPPER */
    717   1.2       mrg 	case _IOW('i', 41, struct ifreq):	/* SIOCLOWER */
    718   1.2       mrg 	case _IOW('i', 44, struct ifreq):	/* SIOCSETSYNC */
    719   1.2       mrg 	case _IOWR('i', 45, struct ifreq):	/* SIOCGETSYNC */
    720   1.2       mrg 	case _IOWR('i', 46, struct ifreq):	/* SIOCSDSTATS */
    721   1.2       mrg 	case _IOWR('i', 47, struct ifreq):	/* SIOCSESTATS */
    722   1.2       mrg 	case _IOW('i', 48, int):		/* SIOCSPROMISC */
    723   1.2       mrg 	case _IOW('i', 49, struct ifreq):	/* SIOCADDMULTI */
    724   1.2       mrg 	case _IOW('i', 50, struct ifreq):	/* SIOCDELMULTI */
    725   1.2       mrg 		return EOPNOTSUPP;
    726   1.2       mrg 
    727   1.2       mrg 	case _IOWR('i', 20, struct ifconf):	/* SIOCGIFCONF */
    728   1.2       mrg 	    {
    729   1.2       mrg 		struct ifconf ifconf;
    730   1.2       mrg 
    731   1.2       mrg 		/*
    732   1.2       mrg 		 * XXX: two more problems
    733   1.2       mrg 		 * 1. our sockaddr's are variable length, not always sizeof(sockaddr)
    734   1.2       mrg 		 * 2. this returns a name per protocol, ie. it returns two "lo0"'s
    735   1.2       mrg 		 */
    736   1.2       mrg 		error = copyin ((caddr_t)(u_long)SCARG(uap, data), (caddr_t)&ifconf,
    737   1.2       mrg 		    sizeof (ifconf));
    738   1.2       mrg 		if (error)
    739   1.2       mrg 			return error;
    740   1.2       mrg 		error = (*ctl)(fp, OSIOCGIFCONF, (caddr_t)&ifconf, p);
    741   1.2       mrg 		if (error)
    742   1.2       mrg 			return error;
    743   1.2       mrg 		return copyout ((caddr_t)&ifconf, (caddr_t)(u_long)SCARG(uap, data),
    744   1.2       mrg 		    sizeof (ifconf));
    745   1.2       mrg 	    }
    746   1.2       mrg 
    747   1.2       mrg /*
    748   1.2       mrg  * Audio ioctl translations.
    749   1.2       mrg  */
    750   1.2       mrg 	case _IOR('A', 1, struct sunos_audio_info):	/* AUDIO_GETINFO */
    751   1.2       mrg 	sunos_au_getinfo:
    752   1.2       mrg 	    {
    753   1.2       mrg 		struct audio_info aui;
    754   1.2       mrg 		struct sunos_audio_info sunos_aui;
    755   1.2       mrg 
    756   1.2       mrg 		error = (*ctl)(fp, AUDIO_GETINFO, (caddr_t)&aui, p);
    757   1.2       mrg 		if (error)
    758   1.2       mrg 			return error;
    759   1.2       mrg 
    760   1.2       mrg 		sunos_aui.play = *(struct sunos_audio_prinfo *)&aui.play;
    761   1.2       mrg 		sunos_aui.record = *(struct sunos_audio_prinfo *)&aui.record;
    762   1.2       mrg 
    763   1.2       mrg 		/* `avail_ports' is `seek' in BSD */
    764   1.2       mrg 		sunos_aui.play.avail_ports = AUDIO_SPEAKER | AUDIO_HEADPHONE;
    765   1.2       mrg 		sunos_aui.record.avail_ports = AUDIO_SPEAKER | AUDIO_HEADPHONE;
    766   1.2       mrg 
    767   1.2       mrg 		sunos_aui.play.waiting = 0;
    768   1.2       mrg 		sunos_aui.record.waiting = 0;
    769   1.2       mrg 		sunos_aui.play.eof = 0;
    770   1.2       mrg 		sunos_aui.record.eof = 0;
    771   1.2       mrg 		sunos_aui.monitor_gain = 0; /* aui.__spare; XXX */
    772   1.2       mrg 		/*XXXsunos_aui.output_muted = 0;*/
    773   1.2       mrg 		/*XXX*/sunos_aui.reserved[0] = 0;
    774   1.2       mrg 		/*XXX*/sunos_aui.reserved[1] = 0;
    775   1.2       mrg 		/*XXX*/sunos_aui.reserved[2] = 0;
    776   1.2       mrg 		/*XXX*/sunos_aui.reserved[3] = 0;
    777   1.2       mrg 
    778   1.2       mrg 		return copyout ((caddr_t)&sunos_aui, (caddr_t)(u_long)SCARG(uap, data),
    779   1.2       mrg 				sizeof (sunos_aui));
    780   1.2       mrg 	    }
    781   1.2       mrg 
    782   1.2       mrg 	case _IOWR('A', 2, struct sunos_audio_info):	/* AUDIO_SETINFO */
    783   1.2       mrg 	    {
    784   1.2       mrg 		struct audio_info aui;
    785   1.2       mrg 		struct sunos_audio_info sunos_aui;
    786   1.2       mrg 
    787   1.2       mrg 		error = copyin ((caddr_t)(u_long)SCARG(uap, data), (caddr_t)&sunos_aui,
    788   1.2       mrg 		    sizeof (sunos_aui));
    789   1.2       mrg 		if (error)
    790   1.2       mrg 			return error;
    791   1.2       mrg 
    792   1.2       mrg 		aui.play = *(struct audio_prinfo *)&sunos_aui.play;
    793   1.2       mrg 		aui.record = *(struct audio_prinfo *)&sunos_aui.record;
    794   1.2       mrg 		/* aui.__spare = sunos_aui.monitor_gain; */
    795   1.2       mrg 		aui.blocksize = ~0;
    796   1.2       mrg 		aui.hiwat = ~0;
    797   1.2       mrg 		aui.lowat = ~0;
    798   1.2       mrg 		/* XXX somebody check this please. - is: aui.backlog = ~0; */
    799   1.2       mrg 		aui.mode = ~0;
    800   1.2       mrg 		/*
    801   1.2       mrg 		 * The bsd driver does not distinguish between paused and
    802   1.2       mrg 		 * active. (In the sun driver, not active means samples are
    803   1.9       wiz 		 * not output at all, but paused means the last streams buffer
    804   1.2       mrg 		 * is drained and then output stops.)  If either are 0, then
    805   1.2       mrg 		 * when stop output. Otherwise, if either are non-zero,
    806   1.2       mrg 		 * we resume.
    807   1.2       mrg 		 */
    808   1.2       mrg 		if (sunos_aui.play.pause == 0 || sunos_aui.play.active == 0)
    809   1.2       mrg 			aui.play.pause = 0;
    810   1.2       mrg 		else if (sunos_aui.play.pause != (u_char)~0 ||
    811   1.2       mrg 			 sunos_aui.play.active != (u_char)~0)
    812   1.2       mrg 			aui.play.pause = 1;
    813   1.2       mrg 		if (sunos_aui.record.pause == 0 || sunos_aui.record.active == 0)
    814   1.2       mrg 			aui.record.pause = 0;
    815   1.2       mrg 		else if (sunos_aui.record.pause != (u_char)~0 ||
    816   1.2       mrg 			 sunos_aui.record.active != (u_char)~0)
    817   1.2       mrg 			aui.record.pause = 1;
    818   1.2       mrg 
    819   1.2       mrg 		error = (*ctl)(fp, AUDIO_SETINFO, (caddr_t)&aui, p);
    820   1.2       mrg 		if (error)
    821   1.2       mrg 			return error;
    822   1.2       mrg 		/* Return new state */
    823   1.2       mrg 		goto sunos_au_getinfo;
    824   1.2       mrg 	    }
    825   1.2       mrg 	case _IO('A', 3):	/* AUDIO_DRAIN */
    826   1.2       mrg 		return (*ctl)(fp, AUDIO_DRAIN, (void *)0, p);
    827   1.2       mrg 	case _IOR('A', 4, int):	/* AUDIO_GETDEV */
    828   1.2       mrg 	    {
    829   1.2       mrg 		int devtype = SUNOS_AUDIO_DEV_AMD;
    830   1.2       mrg 		return copyout ((caddr_t)&devtype, (caddr_t)(u_long)SCARG(uap, data),
    831   1.2       mrg 				sizeof (devtype));
    832   1.2       mrg 	    }
    833   1.2       mrg 
    834   1.2       mrg /*
    835   1.2       mrg  * Selected streams ioctls.
    836   1.2       mrg  */
    837   1.2       mrg #define SUNOS_S_FLUSHR		1
    838   1.2       mrg #define SUNOS_S_FLUSHW		2
    839   1.2       mrg #define SUNOS_S_FLUSHRW		3
    840   1.2       mrg 
    841   1.2       mrg #define SUNOS_S_INPUT		1
    842   1.2       mrg #define SUNOS_S_HIPRI		2
    843   1.2       mrg #define SUNOS_S_OUTPUT		4
    844   1.2       mrg #define SUNOS_S_MSG		8
    845   1.2       mrg 
    846   1.2       mrg 	case _IO('S', 5):	/* I_FLUSH */
    847   1.2       mrg 	    {
    848   1.2       mrg 		int tmp = 0;
    849   1.2       mrg 		switch ((int)(u_long)SCARG(uap, data)) {
    850   1.2       mrg 		case SUNOS_S_FLUSHR:	tmp = FREAD;
    851   1.2       mrg 		case SUNOS_S_FLUSHW:	tmp = FWRITE;
    852   1.2       mrg 		case SUNOS_S_FLUSHRW:	tmp = FREAD|FWRITE;
    853   1.2       mrg 		}
    854   1.2       mrg                 return (*ctl)(fp, TIOCFLUSH, (caddr_t)&tmp, p);
    855   1.2       mrg 	    }
    856   1.2       mrg 	case _IO('S', 9):	/* I_SETSIG */
    857   1.2       mrg 	    {
    858   1.2       mrg 		int on = 1;
    859   1.2       mrg 		if (((int)(u_long)SCARG(uap, data) &
    860   1.2       mrg 			(SUNOS_S_HIPRI|SUNOS_S_INPUT)) ==
    861   1.2       mrg 		    SUNOS_S_HIPRI)
    862   1.2       mrg 			return EOPNOTSUPP;
    863   1.2       mrg                 return (*ctl)(fp, FIOASYNC, (caddr_t)&on, p);
    864   1.2       mrg 	    }
    865   1.2       mrg 	/*
    866   1.2       mrg 	 * SunOS disk ioctls, taken from arch/sparc/sparc/disksubr.c
    867   1.2       mrg 	 * (which was from the old sparc/scsi/sun_disklabel.c), and
    868   1.2       mrg 	 * modified to suite.
    869   1.2       mrg 	 */
    870   1.2       mrg 	case DKIOCGGEOM:
    871   1.2       mrg             {
    872   1.2       mrg 		struct disklabel dl;
    873   1.2       mrg 
    874   1.2       mrg 		error = (*ctl)(fp, DIOCGDINFO, (caddr_t)&dl, p);
    875   1.2       mrg 		if (error)
    876   1.2       mrg 			return (error);
    877   1.2       mrg 
    878   1.2       mrg #define datageom	((struct sun_dkgeom *)(u_long)SCARG(uap, data))
    879   1.2       mrg 		memset((caddr_t)(u_long)SCARG(uap, data), 0, sizeof(*datageom));
    880   1.2       mrg 
    881   1.2       mrg 		datageom->sdkc_ncylinders = dl.d_ncylinders;
    882   1.2       mrg 		datageom->sdkc_acylinders = dl.d_acylinders;
    883   1.2       mrg 		datageom->sdkc_ntracks = dl.d_ntracks;
    884   1.2       mrg 		datageom->sdkc_nsectors = dl.d_nsectors;
    885   1.2       mrg 		datageom->sdkc_interleave = dl.d_interleave;
    886   1.2       mrg 		datageom->sdkc_sparespercyl = dl.d_sparespercyl;
    887   1.2       mrg 		datageom->sdkc_rpm = dl.d_rpm;
    888   1.2       mrg 		datageom->sdkc_pcylinders = dl.d_ncylinders + dl.d_acylinders;
    889   1.2       mrg #undef datageom
    890   1.2       mrg 		break;
    891   1.2       mrg 	    }
    892   1.2       mrg 
    893   1.2       mrg 	case DKIOCINFO:
    894   1.2       mrg 		/* Homey don't do DKIOCINFO */
    895   1.2       mrg 		memset((caddr_t)(u_long)SCARG(uap, data), 0, sizeof(struct sun_dkctlr));
    896   1.2       mrg 		break;
    897   1.2       mrg 
    898   1.2       mrg 	case DKIOCGPART:
    899   1.2       mrg             {
    900   1.2       mrg 		struct partinfo pi;
    901   1.2       mrg 
    902   1.2       mrg 		error = (*ctl)(fp, DIOCGPART, (caddr_t)&pi, p);
    903   1.2       mrg 		if (error)
    904   1.2       mrg 			return (error);
    905   1.2       mrg 
    906   1.2       mrg 		if (pi.disklab->d_secpercyl == 0)
    907   1.2       mrg 			return (ERANGE);	/* XXX */
    908   1.2       mrg 		if (pi.part->p_offset % pi.disklab->d_secpercyl != 0)
    909   1.2       mrg 			return (ERANGE);	/* XXX */
    910   1.2       mrg #define datapart	((struct sun_dkpart *)(u_long)SCARG(uap, data))
    911   1.2       mrg 		datapart->sdkp_cyloffset = pi.part->p_offset / pi.disklab->d_secpercyl;
    912   1.2       mrg 		datapart->sdkp_nsectors = pi.part->p_size;
    913   1.2       mrg #undef datapart
    914   1.2       mrg 	    }
    915   1.2       mrg 
    916   1.2       mrg 	}
    917  1.10   thorpej 	return (netbsd32_ioctl(l, uap, retval));
    918   1.2       mrg }
    919   1.2       mrg 
    920   1.2       mrg /* SunOS fcntl(2) cmds not implemented */
    921   1.2       mrg #define SUN_F_RGETLK	10
    922   1.2       mrg #define SUN_F_RSETLK	11
    923   1.2       mrg #define SUN_F_CNVT	12
    924   1.2       mrg #define SUN_F_RSETLKW	13
    925   1.2       mrg 
    926   1.2       mrg /* SunOS flock translation */
    927   1.2       mrg struct sunos_flock {
    928   1.2       mrg 	short	l_type;
    929   1.2       mrg 	short	l_whence;
    930   1.3       mrg 	netbsd32_long	l_start;
    931   1.3       mrg 	netbsd32_long	l_len;
    932   1.2       mrg 	short	l_pid;
    933   1.2       mrg 	short	l_xxx;
    934   1.2       mrg };
    935   1.2       mrg 
    936   1.2       mrg static void bsd_to_sunos_flock __P((struct flock *, struct sunos_flock *));
    937   1.2       mrg static void sunos_to_bsd_flock __P((struct sunos_flock *, struct flock *));
    938   1.2       mrg 
    939   1.2       mrg #define SUNOS_F_RDLCK	1
    940   1.2       mrg #define	SUNOS_F_WRLCK	2
    941   1.2       mrg #define SUNOS_F_UNLCK	3
    942   1.2       mrg 
    943   1.2       mrg static void
    944   1.2       mrg bsd_to_sunos_flock(iflp, oflp)
    945   1.2       mrg 	struct flock		*iflp;
    946   1.2       mrg 	struct sunos_flock	*oflp;
    947   1.2       mrg {
    948   1.2       mrg 	switch (iflp->l_type) {
    949   1.2       mrg 	case F_RDLCK:
    950   1.2       mrg 		oflp->l_type = SUNOS_F_RDLCK;
    951   1.2       mrg 		break;
    952   1.2       mrg 	case F_WRLCK:
    953   1.2       mrg 		oflp->l_type = SUNOS_F_WRLCK;
    954   1.2       mrg 		break;
    955   1.2       mrg 	case F_UNLCK:
    956   1.2       mrg 		oflp->l_type = SUNOS_F_UNLCK;
    957   1.2       mrg 		break;
    958   1.2       mrg 	default:
    959   1.2       mrg 		oflp->l_type = -1;
    960   1.2       mrg 		break;
    961   1.2       mrg 	}
    962   1.2       mrg 
    963   1.2       mrg 	oflp->l_whence = (short) iflp->l_whence;
    964   1.3       mrg 	oflp->l_start = (netbsd32_long) iflp->l_start;
    965   1.3       mrg 	oflp->l_len = (netbsd32_long) iflp->l_len;
    966   1.2       mrg 	oflp->l_pid = (short) iflp->l_pid;
    967   1.2       mrg 	oflp->l_xxx = 0;
    968   1.2       mrg }
    969   1.2       mrg 
    970   1.2       mrg 
    971   1.2       mrg static void
    972   1.2       mrg sunos_to_bsd_flock(iflp, oflp)
    973   1.2       mrg 	struct sunos_flock	*iflp;
    974   1.2       mrg 	struct flock		*oflp;
    975   1.2       mrg {
    976   1.2       mrg 	switch (iflp->l_type) {
    977   1.2       mrg 	case SUNOS_F_RDLCK:
    978   1.2       mrg 		oflp->l_type = F_RDLCK;
    979   1.2       mrg 		break;
    980   1.2       mrg 	case SUNOS_F_WRLCK:
    981   1.2       mrg 		oflp->l_type = F_WRLCK;
    982   1.2       mrg 		break;
    983   1.2       mrg 	case SUNOS_F_UNLCK:
    984   1.2       mrg 		oflp->l_type = F_UNLCK;
    985   1.2       mrg 		break;
    986   1.2       mrg 	default:
    987   1.2       mrg 		oflp->l_type = -1;
    988   1.2       mrg 		break;
    989   1.2       mrg 	}
    990   1.2       mrg 
    991   1.2       mrg 	oflp->l_whence = iflp->l_whence;
    992   1.2       mrg 	oflp->l_start = (off_t) iflp->l_start;
    993   1.2       mrg 	oflp->l_len = (off_t) iflp->l_len;
    994   1.2       mrg 	oflp->l_pid = (pid_t) iflp->l_pid;
    995   1.2       mrg 
    996   1.2       mrg }
    997   1.2       mrg static struct {
    998   1.3       mrg 	netbsd32_long	sun_flg;
    999   1.3       mrg 	netbsd32_long	bsd_flg;
   1000   1.2       mrg } sunfcntl_flgtab[] = {
   1001   1.2       mrg 	/* F_[GS]ETFLags that differ: */
   1002   1.2       mrg #define SUN_FSETBLK	0x0010
   1003   1.2       mrg #define SUN_SHLOCK	0x0080
   1004   1.2       mrg #define SUN_EXLOCK	0x0100
   1005   1.2       mrg #define SUN_FNBIO	0x1000
   1006   1.2       mrg #define SUN_FSYNC	0x2000
   1007   1.2       mrg #define SUN_NONBLOCK	0x4000
   1008   1.2       mrg #define SUN_FNOCTTY	0x8000
   1009   1.2       mrg 	{ SUN_NONBLOCK, O_NONBLOCK },
   1010   1.2       mrg 	{ SUN_FNBIO, O_NONBLOCK },
   1011   1.2       mrg 	{ SUN_SHLOCK, O_SHLOCK },
   1012   1.2       mrg 	{ SUN_EXLOCK, O_EXLOCK },
   1013   1.2       mrg 	{ SUN_FSYNC, O_FSYNC },
   1014   1.2       mrg 	{ SUN_FSETBLK, 0 },
   1015   1.2       mrg 	{ SUN_FNOCTTY, 0 }
   1016   1.2       mrg };
   1017   1.2       mrg 
   1018   1.2       mrg int
   1019  1.10   thorpej sunos32_sys_fcntl(l, v, retval)
   1020  1.10   thorpej 	struct lwp *l;
   1021   1.2       mrg 	void *v;
   1022   1.2       mrg 	register_t *retval;
   1023   1.2       mrg {
   1024   1.3       mrg 	struct sunos32_sys_fcntl_args /* {
   1025   1.3       mrg 		syscallarg(int) fd;
   1026   1.3       mrg 		syscallarg(int) cmd;
   1027   1.3       mrg 		syscallarg(netbsd32_voidp) arg;
   1028   1.3       mrg 	} */ *uap = v;
   1029  1.10   thorpej 	struct proc *p = l->l_proc;
   1030   1.3       mrg 	netbsd32_long flg;
   1031   1.2       mrg 	int n, ret;
   1032   1.2       mrg 
   1033   1.2       mrg 	switch (SCARG(uap, cmd)) {
   1034   1.2       mrg 	case F_SETFL:
   1035   1.3       mrg 		flg = (netbsd32_long)SCARG(uap, arg);
   1036   1.2       mrg 		n = sizeof(sunfcntl_flgtab) / sizeof(sunfcntl_flgtab[0]);
   1037   1.2       mrg 		while (--n >= 0) {
   1038   1.2       mrg 			if (flg & sunfcntl_flgtab[n].sun_flg) {
   1039   1.2       mrg 				flg &= ~sunfcntl_flgtab[n].sun_flg;
   1040   1.2       mrg 				flg |= sunfcntl_flgtab[n].bsd_flg;
   1041   1.2       mrg 			}
   1042   1.2       mrg 		}
   1043   1.3       mrg 		SCARG(uap, arg) = (netbsd32_voidp)flg;
   1044   1.2       mrg 		break;
   1045   1.2       mrg 
   1046   1.2       mrg 	case F_GETLK:
   1047   1.2       mrg 	case F_SETLK:
   1048   1.2       mrg 	case F_SETLKW:
   1049   1.2       mrg 		{
   1050   1.2       mrg 			int error;
   1051   1.2       mrg 			struct sunos_flock	 ifl;
   1052   1.2       mrg 			struct flock		*flp, fl;
   1053   1.8  christos 			caddr_t sg = stackgap_init(p, 0);
   1054   1.2       mrg 			struct sys_fcntl_args		fa;
   1055   1.2       mrg 
   1056   1.2       mrg 			SCARG(&fa, fd) = SCARG(uap, fd);
   1057   1.2       mrg 			SCARG(&fa, cmd) = SCARG(uap, cmd);
   1058   1.2       mrg 
   1059   1.8  christos 			flp = stackgap_alloc(p, &sg, sizeof(struct flock));
   1060   1.2       mrg 			SCARG(&fa, arg) = (void *) flp;
   1061   1.2       mrg 
   1062   1.2       mrg 			error = copyin((caddr_t)(u_long)SCARG(uap, arg), &ifl, sizeof ifl);
   1063   1.2       mrg 			if (error)
   1064   1.2       mrg 				return error;
   1065   1.2       mrg 
   1066   1.2       mrg 			sunos_to_bsd_flock(&ifl, &fl);
   1067   1.2       mrg 
   1068   1.2       mrg 			error = copyout(&fl, flp, sizeof fl);
   1069   1.2       mrg 			if (error)
   1070   1.2       mrg 				return error;
   1071   1.2       mrg 
   1072  1.10   thorpej 			error = sys_fcntl(l, &fa, retval);
   1073   1.2       mrg 			if (error || SCARG(&fa, cmd) != F_GETLK)
   1074   1.2       mrg 				return error;
   1075   1.2       mrg 
   1076   1.2       mrg 			error = copyin(flp, &fl, sizeof fl);
   1077   1.2       mrg 			if (error)
   1078   1.2       mrg 				return error;
   1079   1.2       mrg 
   1080   1.2       mrg 			bsd_to_sunos_flock(&fl, &ifl);
   1081   1.2       mrg 
   1082   1.2       mrg 			return copyout(&ifl, (caddr_t)(u_long)SCARG(uap, arg), sizeof ifl);
   1083   1.2       mrg 		}
   1084   1.2       mrg 		break;
   1085   1.2       mrg 	case SUN_F_RGETLK:
   1086   1.2       mrg 	case SUN_F_RSETLK:
   1087   1.2       mrg 	case SUN_F_CNVT:
   1088   1.2       mrg 	case SUN_F_RSETLKW:
   1089   1.2       mrg 		return (EOPNOTSUPP);
   1090   1.2       mrg 	}
   1091   1.2       mrg 
   1092  1.10   thorpej 	ret = netbsd32_fcntl(l, uap, retval);
   1093   1.2       mrg 
   1094   1.2       mrg 	switch (SCARG(uap, cmd)) {
   1095   1.2       mrg 	case F_GETFL:
   1096   1.2       mrg 		n = sizeof(sunfcntl_flgtab) / sizeof(sunfcntl_flgtab[0]);
   1097   1.2       mrg 		while (--n >= 0) {
   1098   1.2       mrg 			if (ret & sunfcntl_flgtab[n].bsd_flg) {
   1099   1.2       mrg 				ret &= ~sunfcntl_flgtab[n].bsd_flg;
   1100   1.2       mrg 				ret |= sunfcntl_flgtab[n].sun_flg;
   1101   1.2       mrg 			}
   1102   1.2       mrg 		}
   1103   1.2       mrg 		break;
   1104   1.2       mrg 	}
   1105   1.1       mrg 
   1106   1.2       mrg 	return (ret);
   1107   1.2       mrg }
   1108