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