Home | History | Annotate | Download | only in strace
      1 /*
      2  * Copyright (c) 1991, 1992 Paul Kranenburg <pk (at) cs.few.eur.nl>
      3  * Copyright (c) 1993 Branko Lankester <branko (at) hacktic.nl>
      4  * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs (at) world.std.com>
      5  * Copyright (c) 1996-2000 Wichert Akkerman <wichert (at) cistron.nl>
      6  * All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  * 1. Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  * 2. Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in the
     15  *    documentation and/or other materials provided with the distribution.
     16  * 3. The name of the author may not be used to endorse or promote products
     17  *    derived from this software without specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     21  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     22  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     23  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     24  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     28  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  *
     30  *	$Id$
     31  */
     32 
     33 #include "defs.h"
     34 
     35 #include <sys/stat.h>
     36 #include <sys/socket.h>
     37 #include <sys/un.h>
     38 
     39 #if defined(HAVE_SIN6_SCOPE_ID_LINUX)
     40 #define in6_addr in6_addr_libc
     41 #define ipv6_mreq ipv6_mreq_libc
     42 #define sockaddr_in6 sockaddr_in6_libc
     43 #endif
     44 
     45 #include <netinet/in.h>
     46 #ifdef HAVE_NETINET_TCP_H
     47 #include <netinet/tcp.h>
     48 #endif
     49 #ifdef HAVE_NETINET_UDP_H
     50 #include <netinet/udp.h>
     51 #endif
     52 #ifdef HAVE_NETINET_SCTP_H
     53 #include <netinet/sctp.h>
     54 #endif
     55 #include <arpa/inet.h>
     56 #include <net/if.h>
     57 #if defined(LINUX)
     58 #include <asm/types.h>
     59 #if defined(__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC__ + __GLIBC_MINOR__ >= 3)
     60 #  include <netipx/ipx.h>
     61 #else
     62 #  include <linux/ipx.h>
     63 #endif
     64 #endif /* LINUX */
     65 
     66 #if defined (__GLIBC__) && (((__GLIBC__ < 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 1)) || defined(HAVE_SIN6_SCOPE_ID_LINUX))
     67 #if defined(HAVE_LINUX_IN6_H)
     68 #if defined(HAVE_SIN6_SCOPE_ID_LINUX)
     69 #undef in6_addr
     70 #undef ipv6_mreq
     71 #undef sockaddr_in6
     72 #define in6_addr in6_addr_kernel
     73 #define ipv6_mreq ipv6_mreq_kernel
     74 #define sockaddr_in6 sockaddr_in6_kernel
     75 #endif
     76 #include <linux/in6.h>
     77 #if defined(HAVE_SIN6_SCOPE_ID_LINUX)
     78 #undef in6_addr
     79 #undef ipv6_mreq
     80 #undef sockaddr_in6
     81 #define in6_addr in6_addr_libc
     82 #define ipv6_mreq ipv6_mreq_libc
     83 #define sockaddr_in6 sockaddr_in6_kernel
     84 #endif
     85 #endif
     86 #endif
     87 
     88 #if defined(HAVE_SYS_UIO_H)
     89 #include <sys/uio.h>
     90 #endif
     91 
     92 #if defined(HAVE_LINUX_NETLINK_H)
     93 #include <linux/netlink.h>
     94 #endif
     95 
     96 #if defined(HAVE_LINUX_IF_PACKET_H)
     97 #include <linux/if_packet.h>
     98 #endif
     99 
    100 #if defined(HAVE_LINUX_ICMP_H)
    101 #include <linux/icmp.h>
    102 #endif
    103 
    104 #ifndef PF_UNSPEC
    105 #define PF_UNSPEC AF_UNSPEC
    106 #endif
    107 
    108 #if UNIXWARE >= 7
    109 #define HAVE_SENDMSG		1		/* HACK - *FIXME* */
    110 #endif
    111 
    112 #ifdef LINUX
    113 /* Under Linux these are enums so we can't test for them with ifdef. */
    114 #define IPPROTO_EGP IPPROTO_EGP
    115 #define IPPROTO_PUP IPPROTO_PUP
    116 #define IPPROTO_IDP IPPROTO_IDP
    117 #define IPPROTO_IGMP IPPROTO_IGMP
    118 #define IPPROTO_RAW IPPROTO_RAW
    119 #define IPPROTO_MAX IPPROTO_MAX
    120 #endif
    121 
    122 static const struct xlat domains[] = {
    123 #ifdef PF_AAL5
    124 	{ PF_AAL5,	"PF_AAL5"	},
    125 #endif
    126 #ifdef PF_APPLETALK
    127 	{ PF_APPLETALK,	"PF_APPLETALK"	},
    128 #endif
    129 #ifdef PF_ASH
    130 	{ PF_ASH,	"PF_ASH"	},
    131 #endif
    132 #ifdef PF_ATMPVC
    133 	{ PF_ATMPVC,	"PF_ATMPVC"	},
    134 #endif
    135 #ifdef PF_ATMSVC
    136 	{ PF_ATMSVC,	"PF_ATMSVC"	},
    137 #endif
    138 #ifdef PF_AX25
    139 	{ PF_AX25,	"PF_AX25"	},
    140 #endif
    141 #ifdef PF_BLUETOOTH
    142 	{ PF_BLUETOOTH,	"PF_BLUETOOTH"	},
    143 #endif
    144 #ifdef PF_BRIDGE
    145 	{ PF_BRIDGE,	"PF_BRIDGE"	},
    146 #endif
    147 #ifdef PF_DECnet
    148 	{ PF_DECnet,	"PF_DECnet"	},
    149 #endif
    150 #ifdef PF_DECNET
    151 	{ PF_DECNET,	"PF_DECNET"	},
    152 #endif
    153 #ifdef PF_ECONET
    154 	{ PF_ECONET,	"PF_ECONET"	},
    155 #endif
    156 #ifdef PF_FILE
    157 	{ PF_FILE,	"PF_FILE"	},
    158 #endif
    159 #ifdef PF_IMPLINK
    160 	{ PF_IMPLINK,	"PF_IMPLINK"	},
    161 #endif
    162 #ifdef PF_INET
    163 	{ PF_INET,	"PF_INET"	},
    164 #endif
    165 #ifdef PF_INET6
    166 	{ PF_INET6,	"PF_INET6"	},
    167 #endif
    168 #ifdef PF_IPX
    169 	{ PF_IPX,	"PF_IPX"	},
    170 #endif
    171 #ifdef PF_IRDA
    172 	{ PF_IRDA,	"PF_IRDA"	},
    173 #endif
    174 #ifdef PF_ISO
    175 	{ PF_ISO,	"PF_ISO"	},
    176 #endif
    177 #ifdef PF_KEY
    178 	{ PF_KEY,	"PF_KEY"	},
    179 #endif
    180 #ifdef PF_UNIX
    181 	{ PF_UNIX,	"PF_UNIX"	},
    182 #endif
    183 #ifdef PF_LOCAL
    184 	{ PF_LOCAL,	"PF_LOCAL"	},
    185 #endif
    186 #ifdef PF_NETBEUI
    187 	{ PF_NETBEUI,	"PF_NETBEUI"	},
    188 #endif
    189 #ifdef PF_NETLINK
    190 	{ PF_NETLINK,	"PF_NETLINK"	},
    191 #endif
    192 #ifdef PF_NETROM
    193 	{ PF_NETROM,	"PF_NETROM"	},
    194 #endif
    195 #ifdef PF_PACKET
    196 	{ PF_PACKET,	"PF_PACKET"	},
    197 #endif
    198 #ifdef PF_PPPOX
    199 	{ PF_PPPOX,	"PF_PPPOX"	},
    200 #endif
    201 #ifdef PF_ROSE
    202 	{ PF_ROSE,	"PF_ROSE"	},
    203 #endif
    204 #ifdef PF_ROUTE
    205 	{ PF_ROUTE,	"PF_ROUTE"	},
    206 #endif
    207 #ifdef PF_SECURITY
    208 	{ PF_SECURITY,	"PF_SECURITY"	},
    209 #endif
    210 #ifdef PF_SNA
    211 	{ PF_SNA,	"PF_SNA"	},
    212 #endif
    213 #ifdef PF_UNSPEC
    214 	{ PF_UNSPEC,	"PF_UNSPEC"	},
    215 #endif
    216 #ifdef PF_WANPIPE
    217 	{ PF_WANPIPE,	"PF_WANPIPE"	},
    218 #endif
    219 #ifdef PF_X25
    220 	{ PF_X25,	"PF_X25"	},
    221 #endif
    222 	{ 0,		NULL		},
    223 };
    224 const struct xlat addrfams[] = {
    225 #ifdef AF_APPLETALK
    226 	{ AF_APPLETALK,	"AF_APPLETALK"	},
    227 #endif
    228 #ifdef AF_ASH
    229 	{ AF_ASH,	"AF_ASH"	},
    230 #endif
    231 #ifdef AF_ATMPVC
    232 	{ AF_ATMPVC,	"AF_ATMPVC"	},
    233 #endif
    234 #ifdef AF_ATMSVC
    235 	{ AF_ATMSVC,	"AF_ATMSVC"	},
    236 #endif
    237 #ifdef AF_AX25
    238 	{ AF_AX25,	"AF_AX25"	},
    239 #endif
    240 #ifdef AF_BLUETOOTH
    241 	{ AF_BLUETOOTH,	"AF_BLUETOOTH"	},
    242 #endif
    243 #ifdef AF_BRIDGE
    244 	{ AF_BRIDGE,	"AF_BRIDGE"	},
    245 #endif
    246 #ifdef AF_DECnet
    247 	{ AF_DECnet,	"AF_DECnet"	},
    248 #endif
    249 #ifdef AF_ECONET
    250 	{ AF_ECONET,	"AF_ECONET"	},
    251 #endif
    252 #ifdef AF_FILE
    253 	{ AF_FILE,	"AF_FILE"	},
    254 #endif
    255 #ifdef AF_IMPLINK
    256 	{ AF_IMPLINK,	"AF_IMPLINK"	},
    257 #endif
    258 #ifdef AF_INET
    259 	{ AF_INET,	"AF_INET"	},
    260 #endif
    261 #ifdef AF_INET6
    262 	{ AF_INET6,	"AF_INET6"	},
    263 #endif
    264 #ifdef AF_IPX
    265 	{ AF_IPX,	"AF_IPX"	},
    266 #endif
    267 #ifdef AF_IRDA
    268 	{ AF_IRDA,	"AF_IRDA"	},
    269 #endif
    270 #ifdef AF_ISO
    271 	{ AF_ISO,	"AF_ISO"	},
    272 #endif
    273 #ifdef AF_KEY
    274 	{ AF_KEY,	"AF_KEY"	},
    275 #endif
    276 #ifdef AF_UNIX
    277 	{ AF_UNIX,	"AF_UNIX"	},
    278 #endif
    279 #ifdef AF_LOCAL
    280 	{ AF_LOCAL,	"AF_LOCAL"	},
    281 #endif
    282 #ifdef AF_NETBEUI
    283 	{ AF_NETBEUI,	"AF_NETBEUI"	},
    284 #endif
    285 #ifdef AF_NETLINK
    286 	{ AF_NETLINK,	"AF_NETLINK"	},
    287 #endif
    288 #ifdef AF_NETROM
    289 	{ AF_NETROM,	"AF_NETROM"	},
    290 #endif
    291 #ifdef AF_PACKET
    292 	{ AF_PACKET,	"AF_PACKET"	},
    293 #endif
    294 #ifdef AF_PPPOX
    295 	{ AF_PPPOX,	"AF_PPPOX"	},
    296 #endif
    297 #ifdef AF_ROSE
    298 	{ AF_ROSE,	"AF_ROSE"	},
    299 #endif
    300 #ifdef AF_ROUTE
    301 	{ AF_ROUTE,	"AF_ROUTE"	},
    302 #endif
    303 #ifdef AF_SECURITY
    304 	{ AF_SECURITY,	"AF_SECURITY"	},
    305 #endif
    306 #ifdef AF_SNA
    307 	{ AF_SNA,	"AF_SNA"	},
    308 #endif
    309 #ifdef AF_UNSPEC
    310 	{ AF_UNSPEC,	"AF_UNSPEC"	},
    311 #endif
    312 #ifdef AF_WANPIPE
    313 	{ AF_WANPIPE,	"AF_WANPIPE"	},
    314 #endif
    315 #ifdef AF_X25
    316 	{ AF_X25,	"AF_X25"	},
    317 #endif
    318 	{ 0,		NULL		},
    319 };
    320 static const struct xlat socktypes[] = {
    321 	{ SOCK_STREAM,	"SOCK_STREAM"	},
    322 	{ SOCK_DGRAM,	"SOCK_DGRAM"	},
    323 #ifdef SOCK_RAW
    324 	{ SOCK_RAW,	"SOCK_RAW"	},
    325 #endif
    326 #ifdef SOCK_RDM
    327 	{ SOCK_RDM,	"SOCK_RDM"	},
    328 #endif
    329 #ifdef SOCK_SEQPACKET
    330 	{ SOCK_SEQPACKET,"SOCK_SEQPACKET"},
    331 #endif
    332 #ifdef SOCK_DCCP
    333 	{ SOCK_DCCP,	"SOCK_DCCP"	},
    334 #endif
    335 #ifdef SOCK_PACKET
    336 	{ SOCK_PACKET,	"SOCK_PACKET"	},
    337 #endif
    338 	{ 0,		NULL		},
    339 };
    340 static const struct xlat sock_type_flags[] = {
    341 #ifdef SOCK_CLOEXEC
    342 	{ SOCK_CLOEXEC,	"SOCK_CLOEXEC"	},
    343 #endif
    344 #ifdef SOCK_NONBLOCK
    345 	{ SOCK_NONBLOCK,"SOCK_NONBLOCK"	},
    346 #endif
    347 	{ 0,		NULL		},
    348 };
    349 #ifndef SOCK_TYPE_MASK
    350 # define SOCK_TYPE_MASK 0xf
    351 #endif
    352 static const struct xlat socketlayers[] = {
    353 #if defined(SOL_IP)
    354 	{ SOL_IP,	"SOL_IP"	},
    355 #endif
    356 #if defined(SOL_ICMP)
    357 	{ SOL_ICMP,	"SOL_ICMP"	},
    358 #endif
    359 #if defined(SOL_TCP)
    360 	{ SOL_TCP,	"SOL_TCP"	},
    361 #endif
    362 #if defined(SOL_UDP)
    363 	{ SOL_UDP,	"SOL_UDP"	},
    364 #endif
    365 #if defined(SOL_IPV6)
    366 	{ SOL_IPV6,	"SOL_IPV6"	},
    367 #endif
    368 #if defined(SOL_ICMPV6)
    369 	{ SOL_ICMPV6,	"SOL_ICMPV6"	},
    370 #endif
    371 #if defined(SOL_SCTP)
    372 	{ SOL_SCTP,	"SOL_SCTP"	},
    373 #endif
    374 #if defined(SOL_UDPLITE)
    375 	{ SOL_UDPLITE,	"SOL_UDPLITE"	},
    376 #endif
    377 #if defined(SOL_RAW)
    378 	{ SOL_RAW,	"SOL_RAW"	},
    379 #endif
    380 #if defined(SOL_IPX)
    381 	{ SOL_IPX,	"SOL_IPX"	},
    382 #endif
    383 #if defined(SOL_AX25)
    384 	{ SOL_AX25,	"SOL_AX25"	},
    385 #endif
    386 #if defined(SOL_ATALK)
    387 	{ SOL_ATALK,	"SOL_ATALK"	},
    388 #endif
    389 #if defined(SOL_NETROM)
    390 	{ SOL_NETROM,	"SOL_NETROM"	},
    391 #endif
    392 #if defined(SOL_ROSE)
    393 	{ SOL_ROSE,	"SOL_ROSE"	},
    394 #endif
    395 #if defined(SOL_DECNET)
    396 	{ SOL_DECNET,	"SOL_DECNET"	},
    397 #endif
    398 #if defined(SOL_X25)
    399 	{ SOL_X25,	"SOL_X25"	},
    400 #endif
    401 #if defined(SOL_PACKET)
    402 	{ SOL_PACKET,	"SOL_PACKET"	},
    403 #endif
    404 #if defined(SOL_ATM)
    405 	{ SOL_ATM,	"SOL_ATM"	},
    406 #endif
    407 #if defined(SOL_AAL)
    408 	{ SOL_AAL,	"SOL_AAL"	},
    409 #endif
    410 #if defined(SOL_IRDA)
    411 	{ SOL_IRDA,	"SOL_IRDA"	},
    412 #endif
    413 #if defined(SOL_NETBEUI)
    414 	{ SOL_NETBEUI,	"SOL_NETBEUI"	},
    415 #endif
    416 #if defined(SOL_LLC)
    417 	{ SOL_LLC,	"SOL_LLC"	},
    418 #endif
    419 #if defined(SOL_DCCP)
    420 	{ SOL_DCCP,	"SOL_DCCP"	},
    421 #endif
    422 #if defined(SOL_NETLINK)
    423 	{ SOL_NETLINK,	"SOL_NETLINK"	},
    424 #endif
    425 #if defined(SOL_TIPC)
    426 	{ SOL_TIPC,	"SOL_TIPC"	},
    427 #endif
    428 #if defined(SOL_RXRPC)
    429 	{ SOL_RXRPC,	"SOL_RXRPC"	},
    430 #endif
    431 #if defined(SOL_PPPOL2TP)
    432 	{ SOL_PPPOL2TP,	"SOL_PPPOL2TP"	},
    433 #endif
    434 #if defined(SOL_BLUETOOTH)
    435 	{ SOL_BLUETOOTH,"SOL_BLUETOOTH" },
    436 #endif
    437 #if defined(SOL_PNPIPE)
    438 	{ SOL_PNPIPE,	"SOL_PNPIPE"	},
    439 #endif
    440 #if defined(SOL_RDS)
    441 	{ SOL_RDS,	"SOL_RDS"	},
    442 #endif
    443 #if defined(SOL_IUVC)
    444 	{ SOL_IUCV,	"SOL_IUCV"	},
    445 #endif
    446 #if defined(SOL_CAIF)
    447 	{ SOL_CAIF,	"SOL_CAIF"	},
    448 #endif
    449 	{ SOL_SOCKET,	"SOL_SOCKET"	},	/* Never used! */
    450 	/* The SOL_* array should remain not NULL-terminated. */
    451 };
    452 /*** WARNING: DANGER WILL ROBINSON: NOTE "socketlayers" array above
    453      falls into "protocols" array below!!!!   This is intended!!! ***/
    454 static const struct xlat protocols[] = {
    455 	{ IPPROTO_IP,	"IPPROTO_IP"	},
    456 	{ IPPROTO_ICMP,	"IPPROTO_ICMP"	},
    457 	{ IPPROTO_TCP,	"IPPROTO_TCP"	},
    458 	{ IPPROTO_UDP,	"IPPROTO_UDP"	},
    459 #ifdef IPPROTO_IGMP
    460 	{ IPPROTO_IGMP,	"IPPROTO_IGMP"	},
    461 #endif
    462 #ifdef IPPROTO_GGP
    463 	{ IPPROTO_GGP,	"IPPROTO_GGP"	},
    464 #endif
    465 #ifdef IPPROTO_IPIP
    466 	{ IPPROTO_IPIP,	"IPPROTO_IPIP"	},
    467 #endif
    468 #ifdef IPPROTO_EGP
    469 	{ IPPROTO_EGP,	"IPPROTO_EGP"	},
    470 #endif
    471 #ifdef IPPROTO_PUP
    472 	{ IPPROTO_PUP,	"IPPROTO_PUP"	},
    473 #endif
    474 #ifdef IPPROTO_IDP
    475 	{ IPPROTO_IDP,	"IPPROTO_IDP"	},
    476 #endif
    477 #ifdef IPPROTO_TP
    478 	{ IPPROTO_TP,	"IPPROTO_TP"	},
    479 #endif
    480 #ifdef IPPROTO_DCCP
    481 	{ IPPROTO_DCCP,	"IPPROTO_DCCP"	},
    482 #endif
    483 #ifdef IPPROTO_IPV6
    484 	{ IPPROTO_IPV6,	"IPPROTO_IPV6"	},
    485 #endif
    486 #ifdef IPPROTO_ROUTING
    487 	{ IPPROTO_ROUTING, "IPPROTO_ROUTING" },
    488 #endif
    489 #ifdef IPPROTO_FRAGMENT
    490 	{ IPPROTO_FRAGMENT, "IPPROTO_FRAGMENT" },
    491 #endif
    492 #ifdef IPPROTO_RSVP
    493 	{ IPPROTO_RSVP,	"IPPROTO_RSVP"	},
    494 #endif
    495 #ifdef IPPROTO_GRE
    496 	{ IPPROTO_GRE,	"IPPROTO_GRE"	},
    497 #endif
    498 #ifdef IPPROTO_ESP
    499 	{ IPPROTO_ESP,	"IPPROTO_ESP"	},
    500 #endif
    501 #ifdef IPPROTO_AH
    502 	{ IPPROTO_AH,	"IPPROTO_AH"	},
    503 #endif
    504 #ifdef IPPROTO_ICMPV6
    505 	{ IPPROTO_ICMPV6, "IPPROTO_ICMPV6" },
    506 #endif
    507 #ifdef IPPROTO_NONE
    508 	{ IPPROTO_NONE,	"IPPROTO_NONE"	},
    509 #endif
    510 #ifdef IPPROTO_DSTOPTS
    511 	{ IPPROTO_DSTOPTS, "IPPROTO_DSTOPTS" },
    512 #endif
    513 #ifdef IPPROTO_HELLO
    514 	{ IPPROTO_HELLO, "IPPROTO_HELLO" },
    515 #endif
    516 #ifdef IPPROTO_ND
    517 	{ IPPROTO_ND,	"IPPROTO_ND"	},
    518 #endif
    519 #ifdef IPPROTO_MTP
    520 	{ IPPROTO_MTP,	"IPPROTO_MTP"	},
    521 #endif
    522 #ifdef IPPROTO_ENCAP
    523 	{ IPPROTO_ENCAP, "IPPROTO_ENCAP" },
    524 #endif
    525 #ifdef IPPROTO_PIM
    526 	{ IPPROTO_PIM,	"IPPROTO_PIM"	},
    527 #endif
    528 #ifdef IPPROTO_COMP
    529 	{ IPPROTO_COMP,	"IPPROTO_COMP"	},
    530 #endif
    531 #ifdef IPPROTO_SCTP
    532 	{ IPPROTO_SCTP,	"IPPROTO_SCTP"	},
    533 #endif
    534 #ifdef IPPROTO_UDPLITE
    535 	{ IPPROTO_UDPLITE, "IPPROTO_UDPLITE" },
    536 #endif
    537 #ifdef IPPROTO_RAW
    538 	{ IPPROTO_RAW,	"IPPROTO_RAW"	},
    539 #endif
    540 #ifdef IPPROTO_MAX
    541 	{ IPPROTO_MAX,	"IPPROTO_MAX"	},
    542 #endif
    543 	{ 0,		NULL		},
    544 };
    545 static const struct xlat msg_flags[] = {
    546 	{ MSG_OOB,		"MSG_OOB"		},
    547 #ifdef MSG_DONTROUTE
    548 	{ MSG_DONTROUTE,	"MSG_DONTROUTE"		},
    549 #endif
    550 #ifdef MSG_PEEK
    551 	{ MSG_PEEK,		"MSG_PEEK"		},
    552 #endif
    553 #ifdef MSG_CTRUNC
    554 	{ MSG_CTRUNC,		"MSG_CTRUNC"		},
    555 #endif
    556 #ifdef MSG_PROXY
    557 	{ MSG_PROXY,		"MSG_PROXY"		},
    558 #endif
    559 #ifdef MSG_EOR
    560 	{ MSG_EOR,		"MSG_EOR"		},
    561 #endif
    562 #ifdef MSG_WAITALL
    563 	{ MSG_WAITALL,		"MSG_WAITALL"		},
    564 #endif
    565 #ifdef MSG_TRUNC
    566 	{ MSG_TRUNC,		"MSG_TRUNC"		},
    567 #endif
    568 #ifdef MSG_CTRUNC
    569 	{ MSG_CTRUNC,		"MSG_CTRUNC"		},
    570 #endif
    571 #ifdef MSG_ERRQUEUE
    572 	{ MSG_ERRQUEUE,		"MSG_ERRQUEUE"		},
    573 #endif
    574 #ifdef MSG_DONTWAIT
    575 	{ MSG_DONTWAIT,		"MSG_DONTWAIT"		},
    576 #endif
    577 #ifdef MSG_CONFIRM
    578 	{ MSG_CONFIRM,		"MSG_CONFIRM"		},
    579 #endif
    580 #ifdef MSG_PROBE
    581 	{ MSG_PROBE,		"MSG_PROBE"		},
    582 #endif
    583 #ifdef MSG_FIN
    584 	{ MSG_FIN,		"MSG_FIN"		},
    585 #endif
    586 #ifdef MSG_SYN
    587 	{ MSG_SYN,		"MSG_SYN"		},
    588 #endif
    589 #ifdef MSG_RST
    590 	{ MSG_RST,		"MSG_RST"		},
    591 #endif
    592 #ifdef MSG_NOSIGNAL
    593 	{ MSG_NOSIGNAL,		"MSG_NOSIGNAL"		},
    594 #endif
    595 #ifdef MSG_MORE
    596 	{ MSG_MORE,		"MSG_MORE"		},
    597 #endif
    598 #ifdef MSG_CMSG_CLOEXEC
    599 	{ MSG_CMSG_CLOEXEC,	"MSG_CMSG_CLOEXEC"	},
    600 #endif
    601 	{ 0,			NULL			},
    602 };
    603 
    604 static const struct xlat sockoptions[] = {
    605 #ifdef SO_ACCEPTCONN
    606 	{ SO_ACCEPTCONN,	"SO_ACCEPTCONN"	},
    607 #endif
    608 #ifdef SO_ALLRAW
    609 	{ SO_ALLRAW,	"SO_ALLRAW"	},
    610 #endif
    611 #ifdef SO_ATTACH_FILTER
    612 	{ SO_ATTACH_FILTER,	"SO_ATTACH_FILTER"	},
    613 #endif
    614 #ifdef SO_BINDTODEVICE
    615 	{ SO_BINDTODEVICE,	"SO_BINDTODEVICE"	},
    616 #endif
    617 #ifdef SO_BROADCAST
    618 	{ SO_BROADCAST,	"SO_BROADCAST"	},
    619 #endif
    620 #ifdef SO_BSDCOMPAT
    621 	{ SO_BSDCOMPAT,	"SO_BSDCOMPAT"	},
    622 #endif
    623 #ifdef SO_DEBUG
    624 	{ SO_DEBUG,	"SO_DEBUG"	},
    625 #endif
    626 #ifdef SO_DETACH_FILTER
    627 	{ SO_DETACH_FILTER,	"SO_DETACH_FILTER"	},
    628 #endif
    629 #ifdef SO_DONTROUTE
    630 	{ SO_DONTROUTE,	"SO_DONTROUTE"	},
    631 #endif
    632 #ifdef SO_ERROR
    633 	{ SO_ERROR,	"SO_ERROR"	},
    634 #endif
    635 #ifdef SO_ICS
    636 	{ SO_ICS,	"SO_ICS"	},
    637 #endif
    638 #ifdef SO_IMASOCKET
    639 	{ SO_IMASOCKET,	"SO_IMASOCKET"	},
    640 #endif
    641 #ifdef SO_KEEPALIVE
    642 	{ SO_KEEPALIVE,	"SO_KEEPALIVE"	},
    643 #endif
    644 #ifdef SO_LINGER
    645 	{ SO_LINGER,	"SO_LINGER"	},
    646 #endif
    647 #ifdef SO_LISTENING
    648 	{ SO_LISTENING,	"SO_LISTENING"	},
    649 #endif
    650 #ifdef SO_MGMT
    651 	{ SO_MGMT,	"SO_MGMT"	},
    652 #endif
    653 #ifdef SO_NO_CHECK
    654 	{ SO_NO_CHECK,	"SO_NO_CHECK"	},
    655 #endif
    656 #ifdef SO_OOBINLINE
    657 	{ SO_OOBINLINE,	"SO_OOBINLINE"	},
    658 #endif
    659 #ifdef SO_ORDREL
    660 	{ SO_ORDREL,	"SO_ORDREL"	},
    661 #endif
    662 #ifdef SO_PARALLELSVR
    663 	{ SO_PARALLELSVR,	"SO_PARALLELSVR"	},
    664 #endif
    665 #ifdef SO_PASSCRED
    666 	{ SO_PASSCRED,	"SO_PASSCRED"	},
    667 #endif
    668 #ifdef SO_PEERCRED
    669 	{ SO_PEERCRED,	"SO_PEERCRED"	},
    670 #endif
    671 #ifdef SO_PEERNAME
    672 	{ SO_PEERNAME,	"SO_PEERNAME"	},
    673 #endif
    674 #ifdef SO_PEERSEC
    675 	{ SO_PEERSEC,	"SO_PEERSEC"	},
    676 #endif
    677 #ifdef SO_PRIORITY
    678 	{ SO_PRIORITY,	"SO_PRIORITY"	},
    679 #endif
    680 #ifdef SO_PROTOTYPE
    681 	{ SO_PROTOTYPE,	"SO_PROTOTYPE"	},
    682 #endif
    683 #ifdef SO_RCVBUF
    684 	{ SO_RCVBUF,	"SO_RCVBUF"	},
    685 #endif
    686 #ifdef SO_RCVLOWAT
    687 	{ SO_RCVLOWAT,	"SO_RCVLOWAT"	},
    688 #endif
    689 #ifdef SO_RCVTIMEO
    690 	{ SO_RCVTIMEO,	"SO_RCVTIMEO"	},
    691 #endif
    692 #ifdef SO_RDWR
    693 	{ SO_RDWR,	"SO_RDWR"	},
    694 #endif
    695 #ifdef SO_REUSEADDR
    696 	{ SO_REUSEADDR,	"SO_REUSEADDR"	},
    697 #endif
    698 #ifdef SO_REUSEPORT
    699 	{ SO_REUSEPORT,	"SO_REUSEPORT"	},
    700 #endif
    701 #ifdef SO_SECURITY_AUTHENTICATION
    702 	{ SO_SECURITY_AUTHENTICATION,"SO_SECURITY_AUTHENTICATION"},
    703 #endif
    704 #ifdef SO_SECURITY_ENCRYPTION_NETWORK
    705 	{ SO_SECURITY_ENCRYPTION_NETWORK,"SO_SECURITY_ENCRYPTION_NETWORK"},
    706 #endif
    707 #ifdef SO_SECURITY_ENCRYPTION_TRANSPORT
    708 	{ SO_SECURITY_ENCRYPTION_TRANSPORT,"SO_SECURITY_ENCRYPTION_TRANSPORT"},
    709 #endif
    710 #ifdef SO_SEMA
    711 	{ SO_SEMA,	"SO_SEMA"	},
    712 #endif
    713 #ifdef SO_SNDBUF
    714 	{ SO_SNDBUF,	"SO_SNDBUF"	},
    715 #endif
    716 #ifdef SO_SNDLOWAT
    717 	{ SO_SNDLOWAT,	"SO_SNDLOWAT"	},
    718 #endif
    719 #ifdef SO_SNDTIMEO
    720 	{ SO_SNDTIMEO,	"SO_SNDTIMEO"	},
    721 #endif
    722 #ifdef SO_TIMESTAMP
    723 	{ SO_TIMESTAMP,	"SO_TIMESTAMP"	},
    724 #endif
    725 #ifdef SO_TYPE
    726 	{ SO_TYPE,	"SO_TYPE"	},
    727 #endif
    728 #ifdef SO_USELOOPBACK
    729 	{ SO_USELOOPBACK,	"SO_USELOOPBACK"	},
    730 #endif
    731 	{ 0,		NULL		},
    732 };
    733 
    734 #if !defined (SOL_IP) && defined (IPPROTO_IP)
    735 #define SOL_IP IPPROTO_IP
    736 #endif
    737 
    738 #ifdef SOL_IP
    739 static const struct xlat sockipoptions[] = {
    740 #ifdef IP_TOS
    741 	{ IP_TOS,		"IP_TOS"		},
    742 #endif
    743 #ifdef IP_TTL
    744 	{ IP_TTL,		"IP_TTL"		},
    745 #endif
    746 #ifdef IP_HDRINCL
    747 	{ IP_HDRINCL,		"IP_HDRINCL"		},
    748 #endif
    749 #ifdef IP_OPTIONS
    750 	{ IP_OPTIONS,		"IP_OPTIONS"		},
    751 #endif
    752 #ifdef IP_ROUTER_ALERT
    753 	{ IP_ROUTER_ALERT,	"IP_ROUTER_ALERT"	},
    754 #endif
    755 #ifdef IP_RECVOPTIONS
    756 	{ IP_RECVOPTIONS,	"IP_RECVOPTIONS"	},
    757 #endif
    758 #ifdef IP_RECVOPTS
    759 	{ IP_RECVOPTS,		"IP_RECVOPTS"		},
    760 #endif
    761 #ifdef IP_RECVRETOPTS
    762 	{ IP_RECVRETOPTS,	"IP_RECVRETOPTS"	},
    763 #endif
    764 #ifdef IP_RECVDSTADDR
    765 	{ IP_RECVDSTADDR,	"IP_RECVDSTADDR"	},
    766 #endif
    767 #ifdef IP_RETOPTS
    768 	{ IP_RETOPTS,		"IP_RETOPTS"		},
    769 #endif
    770 #ifdef IP_PKTINFO
    771 	{ IP_PKTINFO,		"IP_PKTINFO"		},
    772 #endif
    773 #ifdef IP_PKTOPTIONS
    774 	{ IP_PKTOPTIONS,	"IP_PKTOPTIONS"		},
    775 #endif
    776 #ifdef IP_MTU_DISCOVER
    777 	{ IP_MTU_DISCOVER,	"IP_MTU_DISCOVER"	},
    778 #endif
    779 #ifdef IP_RECVERR
    780 	{ IP_RECVERR,		"IP_RECVERR"		},
    781 #endif
    782 #ifdef IP_RECVTTL
    783 	{ IP_RECVTTL,		"IP_RECVTTL"		},
    784 #endif
    785 #ifdef IP_RECVTOS
    786 	{ IP_RECVTOS,		"IP_RECVTOS"		},
    787 #endif
    788 #ifdef IP_MTU
    789 	{ IP_MTU,		"IP_MTU"		},
    790 #endif
    791 #ifdef IP_MULTICAST_IF
    792 	{ IP_MULTICAST_IF,	"IP_MULTICAST_IF"	},
    793 #endif
    794 #ifdef IP_MULTICAST_TTL
    795 	{ IP_MULTICAST_TTL,	"IP_MULTICAST_TTL"	},
    796 #endif
    797 #ifdef IP_MULTICAST_LOOP
    798 	{ IP_MULTICAST_LOOP,	"IP_MULTICAST_LOOP"	},
    799 #endif
    800 #ifdef IP_ADD_MEMBERSHIP
    801 	{ IP_ADD_MEMBERSHIP,	"IP_ADD_MEMBERSHIP"	},
    802 #endif
    803 #ifdef IP_DROP_MEMBERSHIP
    804 	{ IP_DROP_MEMBERSHIP,	"IP_DROP_MEMBERSHIP"	},
    805 #endif
    806 #ifdef IP_BROADCAST_IF
    807 	{ IP_BROADCAST_IF,	"IP_BROADCAST_IF"	},
    808 #endif
    809 #ifdef IP_RECVIFINDEX
    810 	{ IP_RECVIFINDEX,	"IP_RECVIFINDEX"	},
    811 #endif
    812 #ifdef IP_MSFILTER
    813 	{ IP_MSFILTER,		"IP_MSFILTER"		},
    814 #endif
    815 #ifdef MCAST_MSFILTER
    816 	{ MCAST_MSFILTER,	"MCAST_MSFILTER"	},
    817 #endif
    818 #ifdef IP_FREEBIND
    819 	{ IP_FREEBIND,		"IP_FREEBIND"		},
    820 #endif
    821 	{ 0,			NULL			},
    822 };
    823 #endif /* SOL_IP */
    824 
    825 #ifdef SOL_IPV6
    826 static const struct xlat sockipv6options[] = {
    827 #ifdef IPV6_ADDRFORM
    828 	{ IPV6_ADDRFORM,	"IPV6_ADDRFORM"		},
    829 #endif
    830 #ifdef MCAST_FILTER
    831 	{ MCAST_FILTER,		"MCAST_FILTER"		},
    832 #endif
    833 #ifdef IPV6_PKTOPTIONS
    834 	{ IPV6_PKTOPTIONS,	"IPV6_PKTOPTIONS"	},
    835 #endif
    836 #ifdef IPV6_MTU
    837 	{ IPV6_MTU,		"IPV6_MTU"		},
    838 #endif
    839 #ifdef IPV6_V6ONLY
    840 	{ IPV6_V6ONLY,		"IPV6_V6ONLY"		},
    841 #endif
    842 #ifdef IPV6_PKTINFO
    843 	{ IPV6_PKTINFO,		"IPV6_PKTINFO"		},
    844 #endif
    845 #ifdef IPV6_HOPLIMIT
    846 	{ IPV6_HOPLIMIT,	"IPV6_HOPLIMIT"		},
    847 #endif
    848 #ifdef IPV6_RTHDR
    849 	{ IPV6_RTHDR,		"IPV6_RTHDR"		},
    850 #endif
    851 #ifdef IPV6_HOPOPTS
    852 	{ IPV6_HOPOPTS,		"IPV6_HOPOPTS"		},
    853 #endif
    854 #ifdef IPV6_DSTOPTS
    855 	{ IPV6_DSTOPTS,		"IPV6_DSTOPTS"		},
    856 #endif
    857 #ifdef IPV6_FLOWINFO
    858 	{ IPV6_FLOWINFO,	"IPV6_FLOWINFO"		},
    859 #endif
    860 #ifdef IPV6_UNICAST_HOPS
    861 	{ IPV6_UNICAST_HOPS,	"IPV6_UNICAST_HOPS"	},
    862 #endif
    863 #ifdef IPV6_MULTICAST_HOPS
    864 	{ IPV6_MULTICAST_HOPS,	"IPV6_MULTICAST_HOPS"	},
    865 #endif
    866 #ifdef IPV6_MULTICAST_LOOP
    867 	{ IPV6_MULTICAST_LOOP,	"IPV6_MULTICAST_LOOP"	},
    868 #endif
    869 #ifdef IPV6_MULTICAST_IF
    870 	{ IPV6_MULTICAST_IF,	"IPV6_MULTICAST_IF"	},
    871 #endif
    872 #ifdef IPV6_MTU_DISCOVER
    873 	{ IPV6_MTU_DISCOVER,	"IPV6_MTU_DISCOVER"	},
    874 #endif
    875 #ifdef IPV6_RECVERR
    876 	{ IPV6_RECVERR,		"IPV6_RECVERR"		},
    877 #endif
    878 #ifdef IPV6_FLOWINFO_SEND
    879 	{ IPV6_FLOWINFO_SEND,	"IPV6_FLOWINFO_SEND"	},
    880 #endif
    881 #ifdef IPV6_ADD_MEMBERSHIP
    882 	{ IPV6_ADD_MEMBERSHIP,	"IPV6_ADD_MEMBERSHIP"	},
    883 #endif
    884 #ifdef IPV6_DROP_MEMBERSHIP
    885 	{ IPV6_DROP_MEMBERSHIP,	"IPV6_DROP_MEMBERSHIP"	},
    886 #endif
    887 #ifdef IPV6_ROUTER_ALERT
    888 	{ IPV6_ROUTER_ALERT,	"IPV6_ROUTER_ALERT"	},
    889 #endif
    890 	{ 0,			NULL			},
    891 };
    892 #endif /* SOL_IPV6 */
    893 
    894 #ifdef SOL_IPX
    895 static const struct xlat sockipxoptions[] = {
    896 	{ IPX_TYPE,     "IPX_TYPE"      },
    897 	{ 0,            NULL            },
    898 };
    899 #endif /* SOL_IPX */
    900 
    901 #ifdef SOL_RAW
    902 static const struct xlat sockrawoptions[] = {
    903 #if defined(ICMP_FILTER)
    904 	{ ICMP_FILTER,		"ICMP_FILTER"	},
    905 #endif
    906 	{ 0,			NULL		},
    907 };
    908 #endif /* SOL_RAW */
    909 
    910 #ifdef SOL_PACKET
    911 static const struct xlat sockpacketoptions[] = {
    912 #ifdef PACKET_ADD_MEMBERSHIP
    913 	{ PACKET_ADD_MEMBERSHIP,	"PACKET_ADD_MEMBERSHIP"	},
    914 #endif
    915 #ifdef PACKET_DROP_MEMBERSHIP
    916 	{ PACKET_DROP_MEMBERSHIP,	"PACKET_DROP_MEMBERSHIP"},
    917 #endif
    918 #if defined(PACKET_RECV_OUTPUT)
    919 	{ PACKET_RECV_OUTPUT,		"PACKET_RECV_OUTPUT"	},
    920 #endif
    921 #if defined(PACKET_RX_RING)
    922 	{ PACKET_RX_RING,		"PACKET_RX_RING"	},
    923 #endif
    924 #if defined(PACKET_STATISTICS)
    925 	{ PACKET_STATISTICS,		"PACKET_STATISTICS"	},
    926 #endif
    927 #if defined(PACKET_COPY_THRESH)
    928 	{ PACKET_COPY_THRESH,		"PACKET_COPY_THRESH"	},
    929 #endif
    930 #if defined(PACKET_AUXDATA)
    931 	{ PACKET_AUXDATA,		"PACKET_AUXDATA"	},
    932 #endif
    933 #if defined(PACKET_ORIGDEV)
    934 	{ PACKET_ORIGDEV,		"PACKET_ORIGDEV"	},
    935 #endif
    936 #if defined(PACKET_VERSION)
    937 	{ PACKET_VERSION,		"PACKET_VERSION"	},
    938 #endif
    939 #if defined(PACKET_HDRLEN)
    940 	{ PACKET_HDRLEN,		"PACKET_HDRLEN"	},
    941 #endif
    942 #if defined(PACKET_RESERVE)
    943 	{ PACKET_RESERVE,		"PACKET_RESERVE"	},
    944 #endif
    945 #if defined(PACKET_TX_RING)
    946 	{ PACKET_TX_RING,		"PACKET_TX_RING"	},
    947 #endif
    948 #if defined(PACKET_LOSS)
    949 	{ PACKET_LOSS,			"PACKET_LOSS"	},
    950 #endif
    951 	{ 0,				NULL			},
    952 };
    953 #endif /* SOL_PACKET */
    954 
    955 #ifdef SOL_SCTP
    956 static const struct xlat socksctpoptions[] = {
    957 #if defined(SCTP_RTOINFO)
    958 	{ SCTP_RTOINFO,			"SCTP_RTOINFO"	},
    959 #endif
    960 #if defined(SCTP_ASSOCINFO)
    961 	{ SCTP_ASSOCINFO,		"SCTP_ASSOCINFO"},
    962 #endif
    963 #if defined(SCTP_INITMSG)
    964 	{ SCTP_INITMSG,			"SCTP_INITMSG"	},
    965 #endif
    966 #if defined(SCTP_NODELAY)
    967 	{ SCTP_NODELAY,			"SCTP_NODELAY"	},
    968 #endif
    969 #if defined(SCTP_AUTOCLOSE)
    970 	{ SCTP_AUTOCLOSE,		"SCTP_AUTOCLOSE"},
    971 #endif
    972 #if defined(SCTP_SET_PEER_PRIMARY_ADDR)
    973 	{ SCTP_SET_PEER_PRIMARY_ADDR,	"SCTP_SET_PEER_PRIMARY_ADDR"},
    974 #endif
    975 #if defined(SCTP_PRIMARY_ADDR)
    976 	{ SCTP_PRIMARY_ADDR,		"SCTP_PRIMARY_ADDR"	},
    977 #endif
    978 #if defined(SCTP_ADAPTATION_LAYER)
    979 	{ SCTP_ADAPTATION_LAYER,	"SCTP_ADAPTATION_LAYER"	},
    980 #endif
    981 #if defined(SCTP_DISABLE_FRAGMENTS)
    982 	{ SCTP_DISABLE_FRAGMENTS,	"SCTP_DISABLE_FRAGMENTS"},
    983 #endif
    984 #if defined(SCTP_PEER_ADDR_PARAMS)
    985 	{ SCTP_PEER_ADDR_PARAMS,	"SCTP_PEER_ADDR_PARAMS"	},
    986 #endif
    987 #if defined(SCTP_DEFAULT_SEND_PARAM)
    988 	{ SCTP_DEFAULT_SEND_PARAM,	"SCTP_DEFAULT_SEND_PARAM"},
    989 #endif
    990 #if defined(SCTP_EVENTS)
    991 	{ SCTP_EVENTS,			"SCTP_EVENTS"		},
    992 #endif
    993 #if defined(SCTP_I_WANT_MAPPED_V4_ADDR)
    994 	{ SCTP_I_WANT_MAPPED_V4_ADDR,	"SCTP_I_WANT_MAPPED_V4_ADDR"},
    995 #endif
    996 #if defined(SCTP_MAXSEG)
    997 	{ SCTP_MAXSEG,			"SCTP_MAXSEG"		},
    998 #endif
    999 #if defined(SCTP_STATUS)
   1000 	{ SCTP_STATUS,			"SCTP_STATUS"		},
   1001 #endif
   1002 #if defined(SCTP_GET_PEER_ADDR_INFO)
   1003 	{ SCTP_GET_PEER_ADDR_INFO,	"SCTP_GET_PEER_ADDR_INFO"},
   1004 #endif
   1005 #if defined(SCTP_DELAYED_ACK)
   1006 	{ SCTP_DELAYED_ACK,		"SCTP_DELAYED_ACK"	},
   1007 #endif
   1008 #if defined(SCTP_CONTEXT)
   1009 	{ SCTP_CONTEXT,			"SCTP_CONTEXT"		},
   1010 #endif
   1011 #if defined(SCTP_FRAGMENT_INTERLEAVE)
   1012 	{ SCTP_FRAGMENT_INTERLEAVE,	"SCTP_FRAGMENT_INTERLEAVE"},
   1013 #endif
   1014 #if defined(SCTP_PARTIAL_DELIVERY_POINT)
   1015 	{ SCTP_PARTIAL_DELIVERY_POINT,	"SCTP_PARTIAL_DELIVERY_POINT"},
   1016 #endif
   1017 #if defined(SCTP_MAX_BURST)
   1018 	{ SCTP_MAX_BURST,		"SCTP_MAX_BURST"	},
   1019 #endif
   1020 #if defined(SCTP_AUTH_CHUNK)
   1021 	{ SCTP_AUTH_CHUNK,		"SCTP_AUTH_CHUNK"	},
   1022 #endif
   1023 #if defined(SCTP_HMAC_IDENT)
   1024 	{ SCTP_HMAC_IDENT,		"SCTP_HMAC_IDENT"	},
   1025 #endif
   1026 #if defined(SCTP_AUTH_KEY)
   1027 	{ SCTP_AUTH_KEY,		"SCTP_AUTH_KEY"		},
   1028 #endif
   1029 #if defined(SCTP_AUTH_ACTIVE_KEY)
   1030 	{ SCTP_AUTH_ACTIVE_KEY,		"SCTP_AUTH_ACTIVE_KEY"	},
   1031 #endif
   1032 #if defined(SCTP_AUTH_DELETE_KEY)
   1033 	{ SCTP_AUTH_DELETE_KEY,		"SCTP_AUTH_DELETE_KEY"	},
   1034 #endif
   1035 #if defined(SCTP_PEER_AUTH_CHUNKS)
   1036 	{ SCTP_PEER_AUTH_CHUNKS,	"SCTP_PEER_AUTH_CHUNKS"	},
   1037 #endif
   1038 #if defined(SCTP_LOCAL_AUTH_CHUNKS)
   1039 	{ SCTP_LOCAL_AUTH_CHUNKS,	"SCTP_LOCAL_AUTH_CHUNKS"},
   1040 #endif
   1041 #if defined(SCTP_GET_ASSOC_NUMBER)
   1042 	{ SCTP_GET_ASSOC_NUMBER,	"SCTP_GET_ASSOC_NUMBER"	},
   1043 #endif
   1044 
   1045 	/* linux specific things */
   1046 #if defined(SCTP_SOCKOPT_BINDX_ADD)
   1047 	{ SCTP_SOCKOPT_BINDX_ADD,	"SCTP_SOCKOPT_BINDX_ADD"	},
   1048 #endif
   1049 #if defined(SCTP_SOCKOPT_BINDX_REM)
   1050 	{ SCTP_SOCKOPT_BINDX_REM,	"SCTP_SOCKOPT_BINDX_REM"	},
   1051 #endif
   1052 #if defined(SCTP_SOCKOPT_PEELOFF)
   1053 	{ SCTP_SOCKOPT_PEELOFF,		"SCTP_SOCKOPT_PEELOFF"		},
   1054 #endif
   1055 #if defined(SCTP_GET_PEER_ADDRS_NUM_OLD)
   1056 	{ SCTP_GET_PEER_ADDRS_NUM_OLD,	"SCTP_GET_PEER_ADDRS_NUM_OLD"	},
   1057 #endif
   1058 #if defined(SCTP_GET_PEER_ADDRS_OLD)
   1059 	{ SCTP_GET_PEER_ADDRS_OLD,	"SCTP_GET_PEER_ADDRS_OLD"	},
   1060 #endif
   1061 #if defined(SCTP_GET_LOCAL_ADDRS_NUM_OLD)
   1062 	{ SCTP_GET_LOCAL_ADDRS_NUM_OLD,	"SCTP_GET_LOCAL_ADDRS_NUM_OLD"	},
   1063 #endif
   1064 #if defined(SCTP_GET_LOCAL_ADDRS_OLD)
   1065 	{ SCTP_GET_LOCAL_ADDRS_OLD,	"SCTP_GET_LOCAL_ADDRS_OLD"	},
   1066 #endif
   1067 #if defined(SCTP_SOCKOPT_CONNECTX_OLD)
   1068 	{ SCTP_SOCKOPT_CONNECTX_OLD,	"SCTP_SOCKOPT_CONNECTX_OLD"	},
   1069 #endif
   1070 #if defined(SCTP_GET_PEER_ADDRS)
   1071 	{ SCTP_GET_PEER_ADDRS,		"SCTP_GET_PEER_ADDRS"		},
   1072 #endif
   1073 #if defined(SCTP_GET_LOCAL_ADDRS)
   1074 	{ SCTP_GET_LOCAL_ADDRS,		"SCTP_GET_LOCAL_ADDRS"		},
   1075 #endif
   1076 
   1077 	{ 0,	NULL	},
   1078 };
   1079 #endif
   1080 
   1081 #if  !defined (SOL_TCP) && defined (IPPROTO_TCP)
   1082 #define SOL_TCP IPPROTO_TCP
   1083 #endif
   1084 
   1085 #ifdef SOL_TCP
   1086 static const struct xlat socktcpoptions[] = {
   1087 	{ TCP_NODELAY,		"TCP_NODELAY"	},
   1088 	{ TCP_MAXSEG,		"TCP_MAXSEG"	},
   1089 #if defined(TCP_CORK)
   1090 	{ TCP_CORK,		"TCP_CORK"	},
   1091 #endif
   1092 #if defined(TCP_KEEPIDLE)
   1093 	{ TCP_KEEPIDLE,		"TCP_KEEPIDLE" },
   1094 #endif
   1095 #if defined(TCP_KEEPINTVL)
   1096 	{ TCP_KEEPINTVL,	"TCP_KEEPINTVL" },
   1097 #endif
   1098 #if defined(TCP_KEEPCNT)
   1099 	{ TCP_KEEPCNT,		"TCP_KEEPCNT" },
   1100 #endif
   1101 #if defined(TCP_NKEEP)
   1102 	{ TCP_NKEEP,		"TCP_NKEEP"	},
   1103 #endif
   1104 #if defined(TCP_SYNCNT)
   1105 	{ TCP_SYNCNT,		"TCP_SYNCNT" },
   1106 #endif
   1107 #if defined(TCP_LINGER2)
   1108 	{ TCP_LINGER2,		"TCP_LINGER2" },
   1109 #endif
   1110 #if defined(TCP_DEFER_ACCEPT)
   1111 	{ TCP_DEFER_ACCEPT,	"TCP_DEFER_ACCEPT" },
   1112 #endif
   1113 #if defined(TCP_WINDOW_CLAMP)
   1114 	{ TCP_WINDOW_CLAMP,	"TCP_WINDOW_CLAMP" },
   1115 #endif
   1116 #if defined(TCP_INFO)
   1117 	{ TCP_INFO,		"TCP_INFO" },
   1118 #endif
   1119 #if defined(TCP_QUICKACK)
   1120 	{ TCP_QUICKACK,		"TCP_QUICKACK" },
   1121 #endif
   1122 	{ 0,			NULL		},
   1123 };
   1124 #endif /* SOL_TCP */
   1125 
   1126 #ifdef SOL_RAW
   1127 static const struct xlat icmpfilterflags[] = {
   1128 #if defined(ICMP_ECHOREPLY)
   1129 	{ (1<<ICMP_ECHOREPLY),		"ICMP_ECHOREPLY"	},
   1130 #endif
   1131 #if defined(ICMP_DEST_UNREACH)
   1132 	{ (1<<ICMP_DEST_UNREACH),	"ICMP_DEST_UNREACH"	},
   1133 #endif
   1134 #if defined(ICMP_SOURCE_QUENCH)
   1135 	{ (1<<ICMP_SOURCE_QUENCH),	"ICMP_SOURCE_QUENCH"	},
   1136 #endif
   1137 #if defined(ICMP_REDIRECT)
   1138 	{ (1<<ICMP_REDIRECT),		"ICMP_REDIRECT"		},
   1139 #endif
   1140 #if defined(ICMP_ECHO)
   1141 	{ (1<<ICMP_ECHO),		"ICMP_ECHO"		},
   1142 #endif
   1143 #if defined(ICMP_TIME_EXCEEDED)
   1144 	{ (1<<ICMP_TIME_EXCEEDED),	"ICMP_TIME_EXCEEDED"	},
   1145 #endif
   1146 #if defined(ICMP_PARAMETERPROB)
   1147 	{ (1<<ICMP_PARAMETERPROB),	"ICMP_PARAMETERPROB"	},
   1148 #endif
   1149 #if defined(ICMP_TIMESTAMP)
   1150 	{ (1<<ICMP_TIMESTAMP),		"ICMP_TIMESTAMP"	},
   1151 #endif
   1152 #if defined(ICMP_TIMESTAMPREPLY)
   1153 	{ (1<<ICMP_TIMESTAMPREPLY),	"ICMP_TIMESTAMPREPLY"	},
   1154 #endif
   1155 #if defined(ICMP_INFO_REQUEST)
   1156 	{ (1<<ICMP_INFO_REQUEST),	"ICMP_INFO_REQUEST"	},
   1157 #endif
   1158 #if defined(ICMP_INFO_REPLY)
   1159 	{ (1<<ICMP_INFO_REPLY),		"ICMP_INFO_REPLY"	},
   1160 #endif
   1161 #if defined(ICMP_ADDRESS)
   1162 	{ (1<<ICMP_ADDRESS),		"ICMP_ADDRESS"		},
   1163 #endif
   1164 #if defined(ICMP_ADDRESSREPLY)
   1165 	{ (1<<ICMP_ADDRESSREPLY),	"ICMP_ADDRESSREPLY"	},
   1166 #endif
   1167 	{ 0,				NULL			},
   1168 };
   1169 #endif /* SOL_RAW */
   1170 
   1171 #if defined(AF_PACKET) /* from e.g. linux/if_packet.h */
   1172 static const struct xlat af_packet_types[] = {
   1173 #if defined(PACKET_HOST)
   1174 	{ PACKET_HOST,			"PACKET_HOST"		},
   1175 #endif
   1176 #if defined(PACKET_BROADCAST)
   1177 	{ PACKET_BROADCAST,		"PACKET_BROADCAST"	},
   1178 #endif
   1179 #if defined(PACKET_MULTICAST)
   1180 	{ PACKET_MULTICAST,		"PACKET_MULTICAST"	},
   1181 #endif
   1182 #if defined(PACKET_OTHERHOST)
   1183 	{ PACKET_OTHERHOST,		"PACKET_OTHERHOST"	},
   1184 #endif
   1185 #if defined(PACKET_OUTGOING)
   1186 	{ PACKET_OUTGOING,		"PACKET_OUTGOING"	},
   1187 #endif
   1188 #if defined(PACKET_LOOPBACK)
   1189 	{ PACKET_LOOPBACK,		"PACKET_LOOPBACK"	},
   1190 #endif
   1191 #if defined(PACKET_FASTROUTE)
   1192 	{ PACKET_FASTROUTE,		"PACKET_FASTROUTE"	},
   1193 #endif
   1194 	{ 0,				NULL			},
   1195 };
   1196 #endif /* defined(AF_PACKET) */
   1197 
   1198 
   1199 void
   1200 printsock(struct tcb *tcp, long addr, int addrlen)
   1201 {
   1202 	union {
   1203 		char pad[128];
   1204 		struct sockaddr sa;
   1205 		struct sockaddr_in sin;
   1206 		struct sockaddr_un sau;
   1207 #ifdef HAVE_INET_NTOP
   1208 		struct sockaddr_in6 sa6;
   1209 #endif
   1210 #if defined(LINUX) && defined(AF_IPX)
   1211 		struct sockaddr_ipx sipx;
   1212 #endif
   1213 #ifdef AF_PACKET
   1214 		struct sockaddr_ll ll;
   1215 #endif
   1216 #ifdef AF_NETLINK
   1217 		struct sockaddr_nl nl;
   1218 #endif
   1219 	} addrbuf;
   1220 	char string_addr[100];
   1221 
   1222 	if (addr == 0) {
   1223 		tprintf("NULL");
   1224 		return;
   1225 	}
   1226 	if (!verbose(tcp)) {
   1227 		tprintf("%#lx", addr);
   1228 		return;
   1229 	}
   1230 
   1231 	if (addrlen < 2 || addrlen > sizeof(addrbuf))
   1232 		addrlen = sizeof(addrbuf);
   1233 
   1234 	memset(&addrbuf, 0, sizeof(addrbuf));
   1235 	if (umoven(tcp, addr, addrlen, addrbuf.pad) < 0) {
   1236 		tprintf("{...}");
   1237 		return;
   1238 	}
   1239 	addrbuf.pad[sizeof(addrbuf.pad) - 1] = '\0';
   1240 
   1241 	tprintf("{sa_family=");
   1242 	printxval(addrfams, addrbuf.sa.sa_family, "AF_???");
   1243 	tprintf(", ");
   1244 
   1245 	switch (addrbuf.sa.sa_family) {
   1246 	case AF_UNIX:
   1247 		if (addrlen == 2) {
   1248 			tprintf("NULL");
   1249 		} else if (addrbuf.sau.sun_path[0]) {
   1250 			tprintf("path=");
   1251 			printpathn(tcp, addr + 2, strlen(addrbuf.sau.sun_path));
   1252 		} else {
   1253 			tprintf("path=@");
   1254 			printpathn(tcp, addr + 3, strlen(addrbuf.sau.sun_path + 1));
   1255 		}
   1256 		break;
   1257 	case AF_INET:
   1258 		tprintf("sin_port=htons(%u), sin_addr=inet_addr(\"%s\")",
   1259 			ntohs(addrbuf.sin.sin_port), inet_ntoa(addrbuf.sin.sin_addr));
   1260 		break;
   1261 #ifdef HAVE_INET_NTOP
   1262 	case AF_INET6:
   1263 		inet_ntop(AF_INET6, &addrbuf.sa6.sin6_addr, string_addr, sizeof(string_addr));
   1264 		tprintf("sin6_port=htons(%u), inet_pton(AF_INET6, \"%s\", &sin6_addr), sin6_flowinfo=%u",
   1265 				ntohs(addrbuf.sa6.sin6_port), string_addr,
   1266 				addrbuf.sa6.sin6_flowinfo);
   1267 #ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
   1268 		{
   1269 #if defined(HAVE_IF_INDEXTONAME) && defined(IN6_IS_ADDR_LINKLOCAL) && defined(IN6_IS_ADDR_MC_LINKLOCAL)
   1270 		    int numericscope = 0;
   1271 		    if (IN6_IS_ADDR_LINKLOCAL (&addrbuf.sa6.sin6_addr)
   1272 			    || IN6_IS_ADDR_MC_LINKLOCAL (&addrbuf.sa6.sin6_addr)) {
   1273 			char scopebuf[IFNAMSIZ + 1];
   1274 
   1275 			if (if_indextoname (addrbuf.sa6.sin6_scope_id, scopebuf) == NULL)
   1276 			    numericscope++;
   1277 			else
   1278 			    tprintf(", sin6_scope_id=if_nametoindex(\"%s\")", scopebuf);
   1279 		    } else
   1280 			numericscope++;
   1281 
   1282 		    if (numericscope)
   1283 #endif
   1284 			tprintf(", sin6_scope_id=%u", addrbuf.sa6.sin6_scope_id);
   1285 		}
   1286 #endif
   1287 		    break;
   1288 #endif
   1289 #if defined(AF_IPX) && defined(linux)
   1290 	case AF_IPX:
   1291 		{
   1292 			int i;
   1293 			tprintf("sipx_port=htons(%u), ",
   1294 					ntohs(addrbuf.sipx.sipx_port));
   1295 			/* Yes, I know, this does not look too
   1296 			 * strace-ish, but otherwise the IPX
   1297 			 * addresses just look monstrous...
   1298 			 * Anyways, feel free if you don't like
   1299 			 * this way.. :)
   1300 			 */
   1301 			tprintf("%08lx:", (unsigned long)ntohl(addrbuf.sipx.sipx_network));
   1302 			for (i = 0; i<IPX_NODE_LEN; i++)
   1303 				tprintf("%02x", addrbuf.sipx.sipx_node[i]);
   1304 			tprintf("/[%02x]", addrbuf.sipx.sipx_type);
   1305 		}
   1306 		break;
   1307 #endif /* AF_IPX && linux */
   1308 #ifdef AF_PACKET
   1309 	case AF_PACKET:
   1310 		{
   1311 			int i;
   1312 			tprintf("proto=%#04x, if%d, pkttype=",
   1313 					ntohs(addrbuf.ll.sll_protocol),
   1314 					addrbuf.ll.sll_ifindex);
   1315 			printxval(af_packet_types, addrbuf.ll.sll_pkttype, "?");
   1316 			tprintf(", addr(%d)={%d, ",
   1317 					addrbuf.ll.sll_halen,
   1318 					addrbuf.ll.sll_hatype);
   1319 			for (i=0; i<addrbuf.ll.sll_halen; i++)
   1320 				tprintf("%02x", addrbuf.ll.sll_addr[i]);
   1321 		}
   1322 		break;
   1323 
   1324 #endif /* AF_APACKET */
   1325 #ifdef AF_NETLINK
   1326 	case AF_NETLINK:
   1327 		tprintf("pid=%d, groups=%08x", addrbuf.nl.nl_pid, addrbuf.nl.nl_groups);
   1328 		break;
   1329 #endif /* AF_NETLINK */
   1330 	/* AF_AX25 AF_APPLETALK AF_NETROM AF_BRIDGE AF_AAL5
   1331 	AF_X25 AF_ROSE etc. still need to be done */
   1332 
   1333 	default:
   1334 		tprintf("sa_data=");
   1335 		printstr(tcp, (long) &((struct sockaddr *) addr)->sa_data,
   1336 			sizeof addrbuf.sa.sa_data);
   1337 		break;
   1338 	}
   1339 	tprintf("}");
   1340 }
   1341 
   1342 #if HAVE_SENDMSG
   1343 static const struct xlat scmvals[] = {
   1344 #ifdef SCM_RIGHTS
   1345 	{ SCM_RIGHTS,		"SCM_RIGHTS"		},
   1346 #endif
   1347 #ifdef SCM_CREDENTIALS
   1348 	{ SCM_CREDENTIALS,	"SCM_CREDENTIALS"	},
   1349 #endif
   1350 	{ 0,			NULL			}
   1351 };
   1352 
   1353 static void
   1354 printcmsghdr(struct tcb *tcp, unsigned long addr, unsigned long len)
   1355 {
   1356 	struct cmsghdr *cmsg = len < sizeof(struct cmsghdr) ?
   1357 			       NULL : malloc(len);
   1358 	if (cmsg == NULL || umoven(tcp, addr, len, (char *) cmsg) < 0) {
   1359 		tprintf(", msg_control=%#lx", addr);
   1360 		free(cmsg);
   1361 		return;
   1362 	}
   1363 
   1364 	tprintf(", {cmsg_len=%u, cmsg_level=", (unsigned) cmsg->cmsg_len);
   1365 	printxval(socketlayers, cmsg->cmsg_level, "SOL_???");
   1366 	tprintf(", cmsg_type=");
   1367 
   1368 	if (cmsg->cmsg_level == SOL_SOCKET) {
   1369 		unsigned long cmsg_len;
   1370 
   1371 		printxval(scmvals, cmsg->cmsg_type, "SCM_???");
   1372 		cmsg_len = (len < cmsg->cmsg_len) ? len : cmsg->cmsg_len;
   1373 
   1374 		if (cmsg->cmsg_type == SCM_RIGHTS
   1375 		    && CMSG_LEN(sizeof(int)) <= cmsg_len) {
   1376 			int *fds = (int *) CMSG_DATA (cmsg);
   1377 			int first = 1;
   1378 
   1379 			tprintf(", {");
   1380 			while ((char *) fds < ((char *) cmsg + cmsg_len)) {
   1381 				if (!first)
   1382 					tprintf(", ");
   1383 				tprintf("%d", *fds++);
   1384 				first = 0;
   1385 			}
   1386 			tprintf("}}");
   1387 			free(cmsg);
   1388 			return;
   1389 		}
   1390 		if (cmsg->cmsg_type == SCM_CREDENTIALS
   1391 		    && CMSG_LEN(sizeof(struct ucred)) <= cmsg_len) {
   1392 			struct ucred *uc = (struct ucred *) CMSG_DATA (cmsg);
   1393 
   1394 			tprintf("{pid=%ld, uid=%ld, gid=%ld}}",
   1395 				(long)uc->pid, (long)uc->uid, (long)uc->gid);
   1396 			free(cmsg);
   1397 			return;
   1398 		}
   1399 	}
   1400 	free(cmsg);
   1401 	tprintf(", ...}");
   1402 }
   1403 
   1404 static void
   1405 do_msghdr(struct tcb *tcp, struct msghdr *msg)
   1406 {
   1407 	tprintf("{msg_name(%d)=", msg->msg_namelen);
   1408 	printsock(tcp, (long)msg->msg_name, msg->msg_namelen);
   1409 
   1410 	tprintf(", msg_iov(%lu)=", (unsigned long)msg->msg_iovlen);
   1411 	tprint_iov(tcp, (unsigned long)msg->msg_iovlen,
   1412 		   (unsigned long)msg->msg_iov);
   1413 
   1414 #ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
   1415 	tprintf(", msg_controllen=%lu", (unsigned long)msg->msg_controllen);
   1416 	if (msg->msg_controllen)
   1417 		printcmsghdr(tcp, (unsigned long) msg->msg_control,
   1418 			     msg->msg_controllen);
   1419 	tprintf(", msg_flags=");
   1420 	printflags(msg_flags, msg->msg_flags, "MSG_???");
   1421 #else /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */
   1422 	tprintf("msg_accrights=%#lx, msg_accrightslen=%u",
   1423 		(unsigned long) msg->msg_accrights, msg->msg_accrightslen);
   1424 #endif /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */
   1425 	tprintf("}");
   1426 }
   1427 
   1428 static void
   1429 printmsghdr(tcp, addr)
   1430 struct tcb *tcp;
   1431 long addr;
   1432 {
   1433 	struct msghdr msg;
   1434 
   1435 	if (umove(tcp, addr, &msg) < 0) {
   1436 		tprintf("%#lx", addr);
   1437 		return;
   1438 	}
   1439 	do_msghdr(tcp, &msg);
   1440 }
   1441 
   1442 #ifdef LINUX
   1443 static void
   1444 printmmsghdr(struct tcb *tcp, long addr)
   1445 {
   1446 	struct mmsghdr {
   1447 		struct msghdr msg_hdr;
   1448 		unsigned msg_len;
   1449 	} mmsg;
   1450 
   1451 	if (umove(tcp, addr, &mmsg) < 0) {
   1452 		tprintf("%#lx", addr);
   1453 		return;
   1454 	}
   1455 	tprintf("{");
   1456 	do_msghdr(tcp, &mmsg.msg_hdr);
   1457 	tprintf(", %u}", mmsg.msg_len);
   1458 }
   1459 #endif
   1460 
   1461 #endif /* HAVE_SENDMSG */
   1462 
   1463 /*
   1464  * low bits of the socket type define real socket type,
   1465  * other bits are socket type flags.
   1466  */
   1467 static void
   1468 tprint_sock_type(struct tcb *tcp, int flags)
   1469 {
   1470 	const char *str = xlookup(socktypes, flags & SOCK_TYPE_MASK);
   1471 
   1472 	if (str)
   1473 	{
   1474 		tprintf("%s", str);
   1475 		flags &= ~SOCK_TYPE_MASK;
   1476 		if (!flags)
   1477 			return;
   1478 		tprintf("|");
   1479 	}
   1480 	printflags(sock_type_flags, flags, "SOCK_???");
   1481 }
   1482 
   1483 int
   1484 sys_socket(struct tcb *tcp)
   1485 {
   1486 	if (entering(tcp)) {
   1487 		printxval(domains, tcp->u_arg[0], "PF_???");
   1488 		tprintf(", ");
   1489 		tprint_sock_type(tcp, tcp->u_arg[1]);
   1490 		tprintf(", ");
   1491 		switch (tcp->u_arg[0]) {
   1492 		case PF_INET:
   1493 #ifdef PF_INET6
   1494 		case PF_INET6:
   1495 #endif
   1496 			printxval(protocols, tcp->u_arg[2], "IPPROTO_???");
   1497 			break;
   1498 #ifdef PF_IPX
   1499 		case PF_IPX:
   1500 			/* BTW: I don't believe this.. */
   1501 			tprintf("[");
   1502 			printxval(domains, tcp->u_arg[2], "PF_???");
   1503 			tprintf("]");
   1504 			break;
   1505 #endif /* PF_IPX */
   1506 		default:
   1507 			tprintf("%lu", tcp->u_arg[2]);
   1508 			break;
   1509 		}
   1510 	}
   1511 	return 0;
   1512 }
   1513 
   1514 #ifdef SVR4
   1515 int
   1516 sys_so_socket(tcp)
   1517 struct tcb *tcp;
   1518 {
   1519 	if (entering(tcp)) {
   1520 		/* not sure really what these args are... but this
   1521 		 * is how truss prints it
   1522 		 */
   1523 		tprintf("%ld, %ld, %ld, ",
   1524 		  tcp->u_arg[0], tcp->u_arg[1], tcp->u_arg[2]);
   1525 		printpath(tcp, tcp->u_arg[3]);
   1526 		tprintf(", %ld", tcp->u_arg[4]);
   1527 	}
   1528 	return 0;
   1529 }
   1530 
   1531 int
   1532 sys_so_socketpair(tcp)
   1533 struct tcb *tcp;
   1534 {
   1535 	if (entering(tcp)) {
   1536 		/* not sure what this arg is */
   1537 		tprintf("0x%lx", tcp->u_arg[0]);
   1538 	}
   1539 	return 0;
   1540 }
   1541 #endif /* SVR4 */
   1542 
   1543 int
   1544 sys_bind(tcp)
   1545 struct tcb *tcp;
   1546 {
   1547 	if (entering(tcp)) {
   1548 		tprintf("%ld, ", tcp->u_arg[0]);
   1549 		printsock(tcp, tcp->u_arg[1], tcp->u_arg[2]);
   1550 		tprintf(", %lu", tcp->u_arg[2]);
   1551 	}
   1552 	return 0;
   1553 }
   1554 
   1555 int
   1556 sys_connect(tcp)
   1557 struct tcb *tcp;
   1558 {
   1559 	return sys_bind(tcp);
   1560 }
   1561 
   1562 int
   1563 sys_listen(tcp)
   1564 struct tcb *tcp;
   1565 {
   1566 	if (entering(tcp)) {
   1567 		tprintf("%ld, %lu", tcp->u_arg[0], tcp->u_arg[1]);
   1568 	}
   1569 	return 0;
   1570 }
   1571 
   1572 static int
   1573 do_accept(struct tcb *tcp, int flags_arg)
   1574 {
   1575 	if (entering(tcp)) {
   1576 		tprintf("%ld, ", tcp->u_arg[0]);
   1577 		return 0;
   1578 	}
   1579 	if (!tcp->u_arg[2])
   1580 		tprintf("%#lx, NULL", tcp->u_arg[1]);
   1581 	else {
   1582 		int len;
   1583 		if (tcp->u_arg[1] == 0 || syserror(tcp)
   1584 		    || umove (tcp, tcp->u_arg[2], &len) < 0) {
   1585 			tprintf("%#lx", tcp->u_arg[1]);
   1586 		} else {
   1587 			printsock(tcp, tcp->u_arg[1], len);
   1588 		}
   1589 		tprintf(", ");
   1590 		printnum_int(tcp, tcp->u_arg[2], "%u");
   1591 	}
   1592 	if (flags_arg >= 0) {
   1593 		tprintf(", ");
   1594 		printflags(sock_type_flags, tcp->u_arg[flags_arg],
   1595 			   "SOCK_???");
   1596 	}
   1597 	return 0;
   1598 }
   1599 
   1600 int
   1601 sys_accept(struct tcb *tcp)
   1602 {
   1603 	return do_accept(tcp, -1);
   1604 }
   1605 
   1606 #ifdef LINUX
   1607 int
   1608 sys_accept4(struct tcb *tcp)
   1609 {
   1610 	return do_accept(tcp, 3);
   1611 }
   1612 #endif
   1613 
   1614 int
   1615 sys_send(tcp)
   1616 struct tcb *tcp;
   1617 {
   1618 	if (entering(tcp)) {
   1619 		tprintf("%ld, ", tcp->u_arg[0]);
   1620 		printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
   1621 		tprintf(", %lu, ", tcp->u_arg[2]);
   1622 		/* flags */
   1623 		printflags(msg_flags, tcp->u_arg[3], "MSG_???");
   1624 	}
   1625 	return 0;
   1626 }
   1627 
   1628 int
   1629 sys_sendto(tcp)
   1630 struct tcb *tcp;
   1631 {
   1632 	if (entering(tcp)) {
   1633 		tprintf("%ld, ", tcp->u_arg[0]);
   1634 		printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
   1635 		tprintf(", %lu, ", tcp->u_arg[2]);
   1636 		/* flags */
   1637 		printflags(msg_flags, tcp->u_arg[3], "MSG_???");
   1638 		/* to address */
   1639 		tprintf(", ");
   1640 		printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]);
   1641 		/* to length */
   1642 		tprintf(", %lu", tcp->u_arg[5]);
   1643 	}
   1644 	return 0;
   1645 }
   1646 
   1647 #ifdef HAVE_SENDMSG
   1648 
   1649 int
   1650 sys_sendmsg(tcp)
   1651 struct tcb *tcp;
   1652 {
   1653 	if (entering(tcp)) {
   1654 		tprintf("%ld, ", tcp->u_arg[0]);
   1655 		printmsghdr(tcp, tcp->u_arg[1]);
   1656 		/* flags */
   1657 		tprintf(", ");
   1658 		printflags(msg_flags, tcp->u_arg[2], "MSG_???");
   1659 	}
   1660 	return 0;
   1661 }
   1662 
   1663 #endif /* HAVE_SENDMSG */
   1664 
   1665 int
   1666 sys_recv(tcp)
   1667 struct tcb *tcp;
   1668 {
   1669 	if (entering(tcp)) {
   1670 		tprintf("%ld, ", tcp->u_arg[0]);
   1671 	} else {
   1672 		if (syserror(tcp))
   1673 			tprintf("%#lx", tcp->u_arg[1]);
   1674 		else
   1675 			printstr(tcp, tcp->u_arg[1], tcp->u_rval);
   1676 
   1677 		tprintf(", %lu, ", tcp->u_arg[2]);
   1678 		printflags(msg_flags, tcp->u_arg[3], "MSG_???");
   1679 	}
   1680 	return 0;
   1681 }
   1682 
   1683 int
   1684 sys_recvfrom(tcp)
   1685 struct tcb *tcp;
   1686 {
   1687 	int fromlen;
   1688 
   1689 	if (entering(tcp)) {
   1690 		tprintf("%ld, ", tcp->u_arg[0]);
   1691 	} else {
   1692 		if (syserror(tcp)) {
   1693 			tprintf("%#lx, %lu, %lu, %#lx, %#lx",
   1694 				tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3],
   1695 				tcp->u_arg[4], tcp->u_arg[5]);
   1696 			return 0;
   1697 		}
   1698 		/* buf */
   1699 		printstr(tcp, tcp->u_arg[1], tcp->u_rval);
   1700 		/* len */
   1701 		tprintf(", %lu, ", tcp->u_arg[2]);
   1702 		/* flags */
   1703 		printflags(msg_flags, tcp->u_arg[3], "MSG_???");
   1704 		/* from address, len */
   1705 		if (!tcp->u_arg[4] || !tcp->u_arg[5]) {
   1706 			if (tcp->u_arg[4] == 0)
   1707 				tprintf(", NULL");
   1708 			else
   1709 				tprintf(", %#lx", tcp->u_arg[4]);
   1710 			if (tcp->u_arg[5] == 0)
   1711 				tprintf(", NULL");
   1712 			else
   1713 				tprintf(", %#lx", tcp->u_arg[5]);
   1714 			return 0;
   1715 		}
   1716 		if (umove(tcp, tcp->u_arg[5], &fromlen) < 0) {
   1717 			tprintf(", {...}, [?]");
   1718 			return 0;
   1719 		}
   1720 		tprintf(", ");
   1721 		printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]);
   1722 		/* from length */
   1723 		tprintf(", [%u]", fromlen);
   1724 	}
   1725 	return 0;
   1726 }
   1727 
   1728 #ifdef HAVE_SENDMSG
   1729 
   1730 int
   1731 sys_recvmsg(tcp)
   1732 struct tcb *tcp;
   1733 {
   1734 	if (entering(tcp)) {
   1735 		tprintf("%ld, ", tcp->u_arg[0]);
   1736 	} else {
   1737 		if (syserror(tcp) || !verbose(tcp))
   1738 			tprintf("%#lx", tcp->u_arg[1]);
   1739 		else
   1740 			printmsghdr(tcp, tcp->u_arg[1]);
   1741 		/* flags */
   1742 		tprintf(", ");
   1743 		printflags(msg_flags, tcp->u_arg[2], "MSG_???");
   1744 	}
   1745 	return 0;
   1746 }
   1747 
   1748 #ifdef LINUX
   1749 int
   1750 sys_recvmmsg(struct tcb *tcp)
   1751 {
   1752 	static char str[128];
   1753 	if (entering(tcp)) {
   1754 
   1755 		tprintf("%ld, ", tcp->u_arg[0]);
   1756 		if (verbose(tcp)) {
   1757 			sprint_timespec(str, tcp, tcp->u_arg[4]);
   1758 			tcp->auxstr = strdup(str);
   1759 		} else {
   1760 			tprintf("%#lx, %ld, ", tcp->u_arg[1], tcp->u_arg[2]);
   1761 			printflags(msg_flags, tcp->u_arg[3], "MSG_???");
   1762 			tprintf(", ");
   1763 			print_timespec(tcp, tcp->u_arg[4]);
   1764 		}
   1765 		return 0;
   1766 	} else {
   1767 		if (verbose(tcp)) {
   1768 			if (syserror(tcp))
   1769 				tprintf("%#lx", tcp->u_arg[1]);
   1770 			else
   1771 				printmmsghdr(tcp, tcp->u_arg[1]);
   1772 			tprintf(", %ld, ", tcp->u_arg[2]);
   1773 			/* flags */
   1774 			printflags(msg_flags, tcp->u_arg[3], "MSG_???");
   1775 			/* timeout on entrance */
   1776 			tprintf(", %s", tcp->auxstr ? tcp->auxstr : "{...}");
   1777 			free((void *) tcp->auxstr);
   1778 			tcp->auxstr = NULL;
   1779 		}
   1780 		if (syserror(tcp))
   1781 			return 0;
   1782 		if (tcp->u_rval == 0) {
   1783 			tcp->auxstr = "Timeout";
   1784 			return RVAL_STR;
   1785 		}
   1786 		if (!verbose(tcp))
   1787 			return 0;
   1788 		/* timeout on exit */
   1789 		strcpy(str, "left ");
   1790 		sprint_timespec(str + strlen(str), tcp, tcp->u_arg[4]);
   1791 		tcp->auxstr = str;
   1792 		return RVAL_STR;
   1793 	}
   1794 }
   1795 #endif
   1796 
   1797 #endif /* HAVE_SENDMSG */
   1798 
   1799 static const struct xlat shutdown_modes[] = {
   1800        { 0,	"SHUT_RD"	},
   1801        { 1,	"SHUT_WR"	},
   1802        { 2,	"SHUT_RDWR"	},
   1803        { 0,	NULL		}
   1804 };
   1805 
   1806 int
   1807 sys_shutdown(tcp)
   1808 struct tcb *tcp;
   1809 {
   1810 	if (entering(tcp)) {
   1811 		tprintf("%ld, ", tcp->u_arg[0]);
   1812 		printxval(shutdown_modes, tcp->u_arg[1], "SHUT_???");
   1813 	}
   1814 	return 0;
   1815 }
   1816 
   1817 int
   1818 sys_getsockname(tcp)
   1819 struct tcb *tcp;
   1820 {
   1821 	return sys_accept(tcp);
   1822 }
   1823 
   1824 int
   1825 sys_getpeername(tcp)
   1826 struct tcb *tcp;
   1827 {
   1828 	return sys_accept(tcp);
   1829 }
   1830 
   1831 static int
   1832 do_pipe(struct tcb *tcp, int flags_arg)
   1833 {
   1834 	if (exiting(tcp)) {
   1835 		if (syserror(tcp)) {
   1836 			tprintf("%#lx", tcp->u_arg[0]);
   1837 		} else {
   1838 #if defined(LINUX) && !defined(SPARC) && !defined(SPARC64) && !defined(SH) && !defined(IA64)
   1839 			int fds[2];
   1840 
   1841 			if (umoven(tcp, tcp->u_arg[0], sizeof fds, (char *) fds) < 0)
   1842 				tprintf("[...]");
   1843 			else
   1844 				tprintf("[%u, %u]", fds[0], fds[1]);
   1845 #elif defined(SPARC) || defined(SPARC64) || defined(SH) || defined(SVR4) || defined(FREEBSD) || defined(IA64)
   1846 			tprintf("[%lu, %lu]", tcp->u_rval, getrval2(tcp));
   1847 #else
   1848 			tprintf("%#lx", tcp->u_arg[0]);
   1849 #endif
   1850 		}
   1851 		if (flags_arg >= 0) {
   1852 			tprintf(", ");
   1853 			printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???");
   1854 		}
   1855 	}
   1856 	return 0;
   1857 }
   1858 
   1859 int
   1860 sys_pipe(struct tcb *tcp)
   1861 {
   1862 	return do_pipe(tcp, -1);
   1863 }
   1864 
   1865 #ifdef LINUX
   1866 int
   1867 sys_pipe2(struct tcb *tcp)
   1868 {
   1869 	return do_pipe(tcp, 1);
   1870 }
   1871 #endif
   1872 
   1873 int
   1874 sys_socketpair(struct tcb *tcp)
   1875 {
   1876 #ifdef LINUX
   1877 	int fds[2];
   1878 #endif
   1879 
   1880 	if (entering(tcp)) {
   1881 		printxval(domains, tcp->u_arg[0], "PF_???");
   1882 		tprintf(", ");
   1883 		tprint_sock_type(tcp, tcp->u_arg[1]);
   1884 		tprintf(", ");
   1885 		switch (tcp->u_arg[0]) {
   1886 		case PF_INET:
   1887 			printxval(protocols, tcp->u_arg[2], "IPPROTO_???");
   1888 			break;
   1889 #ifdef PF_IPX
   1890 		case PF_IPX:
   1891 			/* BTW: I don't believe this.. */
   1892 			tprintf("[");
   1893 			printxval(domains, tcp->u_arg[2], "PF_???");
   1894 			tprintf("]");
   1895 			break;
   1896 #endif /* PF_IPX */
   1897 		default:
   1898 			tprintf("%lu", tcp->u_arg[2]);
   1899 			break;
   1900 		}
   1901 	} else {
   1902 		if (syserror(tcp)) {
   1903 			tprintf(", %#lx", tcp->u_arg[3]);
   1904 			return 0;
   1905 		}
   1906 #ifdef LINUX
   1907 		if (umoven(tcp, tcp->u_arg[3], sizeof fds, (char *) fds) < 0)
   1908 			tprintf(", [...]");
   1909 		else
   1910 			tprintf(", [%u, %u]", fds[0], fds[1]);
   1911 #endif /* LINUX */
   1912 #if defined(SUNOS4) || defined(SVR4) || defined(FREEBSD)
   1913 		tprintf(", [%lu, %lu]", tcp->u_rval, getrval2(tcp));
   1914 #endif /* SUNOS4 || SVR4 || FREEBSD */
   1915 	}
   1916 	return 0;
   1917 }
   1918 
   1919 int
   1920 sys_getsockopt(struct tcb *tcp)
   1921 {
   1922 	if (entering(tcp)) {
   1923 		tprintf("%ld, ", tcp->u_arg[0]);
   1924 		printxval(socketlayers, tcp->u_arg[1], "SOL_???");
   1925 		tprintf (", ");
   1926 		switch (tcp->u_arg[1]) {
   1927 		case SOL_SOCKET:
   1928 			printxval(sockoptions, tcp->u_arg[2], "SO_???");
   1929 			break;
   1930 #ifdef SOL_IP
   1931 		case SOL_IP:
   1932 			printxval(sockipoptions, tcp->u_arg[2], "IP_???");
   1933 			break;
   1934 #endif
   1935 #ifdef SOL_IPV6
   1936 		case SOL_IPV6:
   1937 			printxval(sockipv6options, tcp->u_arg[2], "IPV6_???");
   1938 			break;
   1939 #endif
   1940 #ifdef SOL_IPX
   1941 		case SOL_IPX:
   1942 			printxval(sockipxoptions, tcp->u_arg[2], "IPX_???");
   1943 			break;
   1944 #endif
   1945 #ifdef SOL_PACKET
   1946 		case SOL_PACKET:
   1947 			printxval(sockpacketoptions, tcp->u_arg[2], "PACKET_???");
   1948 			break;
   1949 #endif
   1950 #ifdef SOL_TCP
   1951 		case SOL_TCP:
   1952 			printxval(socktcpoptions, tcp->u_arg[2], "TCP_???");
   1953 			break;
   1954 #endif
   1955 #ifdef SOL_SCTP
   1956 		case SOL_SCTP:
   1957 			printxval(socksctpoptions, tcp->u_arg[2], "SCTP_???");
   1958 			break;
   1959 #endif
   1960 
   1961 		/* SOL_AX25 SOL_ROSE SOL_ATALK SOL_NETROM SOL_UDP SOL_DECNET SOL_X25
   1962 		 * etc. still need work */
   1963 		default:
   1964 			tprintf("%lu", tcp->u_arg[2]);
   1965 			break;
   1966 		}
   1967 		tprintf (", ");
   1968 	} else {
   1969 		int len;
   1970 		if (syserror(tcp) || umove (tcp, tcp->u_arg[4], &len) < 0) {
   1971 			tprintf("%#lx, %#lx",
   1972 				tcp->u_arg[3], tcp->u_arg[4]);
   1973 			return 0;
   1974 		}
   1975 
   1976 		switch (tcp->u_arg[1]) {
   1977 		case SOL_SOCKET:
   1978 			switch (tcp->u_arg[2]) {
   1979 #ifdef SO_LINGER
   1980 			case SO_LINGER:
   1981 				if (len == sizeof (struct linger)) {
   1982 					struct linger linger;
   1983 					if (umove (tcp,
   1984 						   tcp->u_arg[3],
   1985 						   &linger) < 0)
   1986 						break;
   1987 					tprintf("{onoff=%d, linger=%d}, "
   1988 						"[%d]",
   1989 						linger.l_onoff,
   1990 						linger.l_linger,
   1991 						len);
   1992 					return 0;
   1993 				}
   1994 				break;
   1995 #endif
   1996 #ifdef SO_PEERCRED
   1997 			case SO_PEERCRED:
   1998 				if (len == sizeof (struct ucred)) {
   1999 					struct ucred uc;
   2000 					if (umove (tcp,
   2001 						   tcp->u_arg[3],
   2002 						   &uc) < 0)
   2003 						break;
   2004 					tprintf("{pid=%ld, uid=%ld, gid=%ld}, "
   2005 						"[%d]",
   2006 						(long)uc.pid,
   2007 						(long)uc.uid,
   2008 						(long)uc.gid,
   2009 						len);
   2010 					return 0;
   2011 				}
   2012 				break;
   2013 #endif
   2014 			}
   2015 			break;
   2016 		case SOL_PACKET:
   2017 			switch (tcp->u_arg[2]) {
   2018 #ifdef PACKET_STATISTICS
   2019 			case PACKET_STATISTICS:
   2020 				if (len == sizeof(struct tpacket_stats)) {
   2021 					struct tpacket_stats stats;
   2022 					if (umove (tcp,
   2023 						   tcp->u_arg[3],
   2024 						   &stats) < 0)
   2025 						break;
   2026 					tprintf("{packets=%u, drops=%u}, "
   2027 						"[%d]",
   2028 						stats.tp_packets,
   2029 						stats.tp_drops,
   2030 						len);
   2031 					return 0;
   2032 				}
   2033 				break;
   2034 #endif
   2035 			}
   2036 			break;
   2037 		}
   2038 
   2039 		if (len == sizeof (int)) {
   2040 			printnum_int(tcp, tcp->u_arg[3], "%d");
   2041 		}
   2042 		else {
   2043 			printstr (tcp, tcp->u_arg[3], len);
   2044 		}
   2045 		tprintf(", [%d]", len);
   2046 	}
   2047 	return 0;
   2048 }
   2049 
   2050 #if defined(ICMP_FILTER)
   2051 static void printicmpfilter(tcp, addr)
   2052 struct tcb *tcp;
   2053 long addr;
   2054 {
   2055 	struct icmp_filter	filter;
   2056 
   2057 	if (!addr) {
   2058 		tprintf("NULL");
   2059 		return;
   2060 	}
   2061 	if (syserror(tcp) || !verbose(tcp)) {
   2062 		tprintf("%#lx", addr);
   2063 		return;
   2064 	}
   2065 	if (umove(tcp, addr, &filter) < 0) {
   2066 		tprintf("{...}");
   2067 		return;
   2068 	}
   2069 
   2070 	tprintf("~(");
   2071 	printflags(icmpfilterflags, ~filter.data, "ICMP_???");
   2072 	tprintf(")");
   2073 }
   2074 #endif /* ICMP_FILTER */
   2075 
   2076 static int
   2077 printsockopt (tcp, level, name, addr, len)
   2078 struct tcb *tcp;
   2079 int level;
   2080 int name;
   2081 long addr;
   2082 int len;
   2083 {
   2084 	printxval(socketlayers, level, "SOL_??");
   2085 	tprintf (", ");
   2086 	switch (level) {
   2087 	    case SOL_SOCKET:
   2088 		printxval(sockoptions, name, "SO_???");
   2089 		switch (name) {
   2090 #if defined(SO_LINGER)
   2091 		    case SO_LINGER:
   2092 			if (len == sizeof (struct linger)) {
   2093 				struct linger linger;
   2094 				if (umove (tcp, addr, &linger) < 0)
   2095 					break;
   2096 				tprintf(", {onoff=%d, linger=%d}",
   2097 					linger.l_onoff,
   2098 					linger.l_linger);
   2099 				return 0;
   2100 			}
   2101 			break;
   2102 #endif
   2103 		}
   2104 		break;
   2105 #ifdef SOL_IP
   2106 	    case SOL_IP:
   2107 		printxval(sockipoptions, name, "IP_???");
   2108 		break;
   2109 #endif
   2110 #ifdef SOL_IPV6
   2111 	    case SOL_IPV6:
   2112 		printxval(sockipv6options, name, "IPV6_???");
   2113 		break;
   2114 #endif
   2115 #ifdef SOL_IPX
   2116 	    case SOL_IPX:
   2117 		printxval(sockipxoptions, name, "IPX_???");
   2118 		break;
   2119 #endif
   2120 #ifdef SOL_PACKET
   2121 	    case SOL_PACKET:
   2122 		printxval(sockpacketoptions, name, "PACKET_???");
   2123 		/* TODO: decode packate_mreq for PACKET_*_MEMBERSHIP */
   2124 		switch (name) {
   2125 #ifdef PACKET_RX_RING
   2126 		    case PACKET_RX_RING:
   2127 #endif
   2128 #ifdef PACKET_TX_RING
   2129 		    case PACKET_TX_RING:
   2130 #endif
   2131 #if defined(PACKET_RX_RING) || defined(PACKET_TX_RING)
   2132 			if (len == sizeof(struct tpacket_req)) {
   2133 				struct tpacket_req req;
   2134 				if (umove(tcp, addr, &req) < 0)
   2135 					break;
   2136 				tprintf(", {block_size=%u, block_nr=%u, frame_size=%u, frame_nr=%u}",
   2137 					req.tp_block_size,
   2138 					req.tp_block_nr,
   2139 					req.tp_frame_size,
   2140 					req.tp_frame_nr);
   2141 				return 0;
   2142 			}
   2143 			break;
   2144 #endif /* PACKET_RX_RING || PACKET_TX_RING */
   2145 		}
   2146 		break;
   2147 #endif
   2148 #ifdef SOL_TCP
   2149 	    case SOL_TCP:
   2150 		printxval(socktcpoptions, name, "TCP_???");
   2151 		break;
   2152 #endif
   2153 #ifdef SOL_SCTP
   2154 	   case SOL_SCTP:
   2155 		printxval(socksctpoptions, name, "SCTP_???");
   2156 		break;
   2157 #endif
   2158 #ifdef SOL_RAW
   2159 	    case SOL_RAW:
   2160 		printxval(sockrawoptions, name, "RAW_???");
   2161 		switch (name) {
   2162 #if defined(ICMP_FILTER)
   2163 		    case ICMP_FILTER:
   2164 			tprintf(", ");
   2165 			printicmpfilter(tcp, addr);
   2166 			return 0;
   2167 #endif
   2168 		}
   2169 		break;
   2170 #endif
   2171 
   2172 		/* SOL_AX25 SOL_ATALK SOL_NETROM SOL_UDP SOL_DECNET SOL_X25
   2173 		 * etc. still need work  */
   2174 
   2175 	    default:
   2176 		tprintf("%u", name);
   2177 	}
   2178 
   2179 	/* default arg printing */
   2180 
   2181 	tprintf (", ");
   2182 
   2183 	if (len == sizeof (int)) {
   2184 		printnum_int (tcp, addr, "%d");
   2185 	}
   2186 	else {
   2187 		printstr (tcp, addr, len);
   2188 	}
   2189 	return 0;
   2190 }
   2191 
   2192 
   2193 #ifdef HAVE_STRUCT_OPTHDR
   2194 
   2195 void
   2196 print_sock_optmgmt (tcp, addr, len)
   2197 struct tcb *tcp;
   2198 long addr;
   2199 int len;
   2200 {
   2201 	int c = 0;
   2202 	struct opthdr hdr;
   2203 
   2204 	while (len >= (int) sizeof hdr) {
   2205 		if (umove(tcp, addr, &hdr) < 0) break;
   2206 		if (c++) {
   2207 			tprintf (", ");
   2208 		}
   2209 		else if (len > hdr.len + sizeof hdr) {
   2210 			tprintf ("[");
   2211 		}
   2212 		tprintf ("{");
   2213 		addr += sizeof hdr;
   2214 		len -= sizeof hdr;
   2215 		printsockopt (tcp, hdr.level, hdr.name, addr, hdr.len);
   2216 		if (hdr.len > 0) {
   2217 			addr += hdr.len;
   2218 			len -= hdr.len;
   2219 		}
   2220 		tprintf ("}");
   2221 	}
   2222 	if (len > 0) {
   2223 		if (c++) tprintf (", ");
   2224 		printstr (tcp, addr, len);
   2225 	}
   2226 	if (c > 1) tprintf ("]");
   2227 }
   2228 
   2229 #endif
   2230 
   2231 int
   2232 sys_setsockopt(tcp)
   2233 struct tcb *tcp;
   2234 {
   2235 	if (entering(tcp)) {
   2236 		tprintf("%ld, ", tcp->u_arg[0]);
   2237 		printsockopt (tcp, tcp->u_arg[1], tcp->u_arg[2],
   2238 			      tcp->u_arg[3], tcp->u_arg[4]);
   2239 		tprintf(", %lu", tcp->u_arg[4]);
   2240 	}
   2241 	return 0;
   2242 }
   2243 
   2244 #if UNIXWARE >= 7
   2245 
   2246 static const struct xlat sock_version[] = {
   2247 	{ __NETLIB_UW211_SVR4,	"UW211_SVR4" },
   2248 	{ __NETLIB_UW211_XPG4,	"UW211_XPG4" },
   2249 	{ __NETLIB_GEMINI_SVR4,	"GEMINI_SVR4" },
   2250 	{ __NETLIB_GEMINI_XPG4,	"GEMINI_XPG4" },
   2251 	{ __NETLIB_FP1_SVR4,	"FP1_SVR4" },
   2252 	{ __NETLIB_FP1_XPG4,	"FP1_XPG4" },
   2253 	{ 0,            NULL            },
   2254 };
   2255 
   2256 
   2257 int
   2258 netlib_call(tcp, func)
   2259 struct tcb *tcp;
   2260 int (*func) ();
   2261 {
   2262 	if (entering(tcp)) {
   2263 		int i;
   2264 		printxval (sock_version, tcp->u_arg[0], "__NETLIB_???");
   2265 		tprintf(", ");
   2266 		--tcp->u_nargs;
   2267 		for (i = 0; i < tcp->u_nargs; i++)
   2268 			tcp->u_arg[i] = tcp->u_arg[i + 1];
   2269 		return func (tcp);
   2270 
   2271 	}
   2272 
   2273 	return func (tcp);
   2274 }
   2275 
   2276 int
   2277 sys_xsocket(tcp)
   2278 struct tcb *tcp;
   2279 {
   2280 	return netlib_call (tcp, sys_socket);
   2281 }
   2282 
   2283 int
   2284 sys_xsocketpair(tcp)
   2285 struct tcb *tcp;
   2286 {
   2287 	return netlib_call (tcp, sys_socketpair);
   2288 }
   2289 
   2290 int
   2291 sys_xbind(tcp)
   2292 struct tcb *tcp;
   2293 {
   2294 	return netlib_call (tcp, sys_bind);
   2295 }
   2296 
   2297 int
   2298 sys_xconnect(tcp)
   2299 struct tcb *tcp;
   2300 {
   2301 	return netlib_call (tcp, sys_connect);
   2302 }
   2303 
   2304 int
   2305 sys_xlisten(tcp)
   2306 struct tcb *tcp;
   2307 {
   2308 	return netlib_call (tcp, sys_listen);
   2309 }
   2310 
   2311 int
   2312 sys_xaccept(tcp)
   2313 struct tcb *tcp;
   2314 {
   2315 	return netlib_call (tcp, sys_accept);
   2316 }
   2317 
   2318 int
   2319 sys_xsendmsg(tcp)
   2320 struct tcb *tcp;
   2321 {
   2322 	return netlib_call (tcp, sys_sendmsg);
   2323 }
   2324 
   2325 int
   2326 sys_xrecvmsg(tcp)
   2327 struct tcb *tcp;
   2328 {
   2329 	return netlib_call (tcp, sys_recvmsg);
   2330 }
   2331 
   2332 int
   2333 sys_xgetsockaddr(tcp)
   2334 struct tcb *tcp;
   2335 {
   2336 	if (entering(tcp)) {
   2337 		printxval (sock_version, tcp->u_arg[0], "__NETLIB_???");
   2338 		tprintf(", ");
   2339 		if (tcp->u_arg[1] == 0) {
   2340 			tprintf ("LOCALNAME, ");
   2341 		}
   2342 		else if (tcp->u_arg[1] == 1) {
   2343 			tprintf ("REMOTENAME, ");
   2344 		}
   2345 		else {
   2346 			tprintf ("%ld, ", tcp->u_arg [1]);
   2347 		}
   2348 		tprintf ("%ld, ", tcp->u_arg [2]);
   2349 	}
   2350 	else {
   2351 		if (tcp->u_arg[3] == 0 || syserror(tcp)) {
   2352 			tprintf("%#lx", tcp->u_arg[3]);
   2353 		} else {
   2354 			printsock(tcp, tcp->u_arg[3], tcp->u_arg[4]);
   2355 		}
   2356 		tprintf(", ");
   2357 		printnum(tcp, tcp->u_arg[4], "%lu");
   2358 	}
   2359 
   2360 	return 0;
   2361 
   2362 }
   2363 
   2364 int
   2365 sys_xgetsockopt(tcp)
   2366 struct tcb *tcp;
   2367 {
   2368 	return netlib_call (tcp, sys_getsockopt);
   2369 }
   2370 
   2371 int
   2372 sys_xsetsockopt(tcp)
   2373 struct tcb *tcp;
   2374 {
   2375 	return netlib_call (tcp, sys_setsockopt);
   2376 }
   2377 
   2378 int
   2379 sys_xshutdown(tcp)
   2380 struct tcb *tcp;
   2381 {
   2382 	return netlib_call (tcp, sys_shutdown);
   2383 }
   2384 
   2385 #endif /* UNIXWARE */
   2386