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