176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman/*
276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
57987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman * Copyright (c) 1996-2000 Wichert Akkerman <wichert@cistron.nl>
676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * All rights reserved.
776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *
876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * Redistribution and use in source and binary forms, with or without
976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * modification, are permitted provided that the following conditions
1076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * are met:
1176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * 1. Redistributions of source code must retain the above copyright
1276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *    notice, this list of conditions and the following disclaimer.
1376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * 2. Redistributions in binary form must reproduce the above copyright
1476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *    notice, this list of conditions and the following disclaimer in the
1576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *    documentation and/or other materials provided with the distribution.
1676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * 3. The name of the author may not be used to endorse or promote products
1776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *    derived from this software without specific prior written permission.
1876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *
1976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman */
3076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
3176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include "defs.h"
3276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include <sys/stat.h>
3376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include <sys/socket.h>
34b2fa2beedc603a17ed7afaa32b80180e54b901f1Dmitry V. Levin#include <sys/uio.h>
3576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include <sys/un.h>
3676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include <netinet/in.h>
378c7122c9519dfd46ea7c8c026eab6f7aed74cf21Wichert Akkerman#ifdef HAVE_NETINET_TCP_H
38a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# include <netinet/tcp.h>
39bf79f2e16b090ffe59cd1e1820935680a2da7b78Wichert Akkerman#endif
408c7122c9519dfd46ea7c8c026eab6f7aed74cf21Wichert Akkerman#ifdef HAVE_NETINET_UDP_H
41a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# include <netinet/udp.h>
428c7122c9519dfd46ea7c8c026eab6f7aed74cf21Wichert Akkerman#endif
437fea79b7606644ec4e7c2e0a9fbb070c15cbc589Holger Hans Peter Freyther#ifdef HAVE_NETINET_SCTP_H
44a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# include <netinet/sctp.h>
457fea79b7606644ec4e7c2e0a9fbb070c15cbc589Holger Hans Peter Freyther#endif
4676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include <arpa/inet.h>
47f185065a405794eaf6abc0dcf8345d9e6aa882f7Wichert Akkerman#include <net/if.h>
4876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include <asm/types.h>
4999aa181ebcee3f6ae4f8eb83c719cc64cc5a09ecDenys Vlasenko#if defined(__GLIBC__)
50a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# include <netipx/ipx.h>
5176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#else
52a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# include <linux/ipx.h>
5376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
5476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
55f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#if defined(HAVE_LINUX_NETLINK_H)
56a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# include <linux/netlink.h>
57f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#endif
58f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#if defined(HAVE_LINUX_IF_PACKET_H)
59a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# include <linux/if_packet.h>
60f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#endif
617987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman#if defined(HAVE_LINUX_ICMP_H)
62a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# include <linux/icmp.h>
637987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman#endif
64c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
65c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel# include <bluetooth/bluetooth.h>
66c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel# include <bluetooth/hci.h>
67c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel# include <bluetooth/l2cap.h>
68c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel# include <bluetooth/rfcomm.h>
69c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel# include <bluetooth/sco.h>
70c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#endif
7176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifndef PF_UNSPEC
72a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# define PF_UNSPEC AF_UNSPEC
7376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
7476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
750ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/domains.h"
760ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/addrfams.h"
770ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/socktypes.h"
780ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/sock_type_flags.h"
798a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin#ifndef SOCK_TYPE_MASK
808a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin# define SOCK_TYPE_MASK 0xf
818a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin#endif
826d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin
836d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_IP
846d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_IP 0
856d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
866d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_TCP
876d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_TCP 6
886d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
896d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_UDP
906d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_UDP 17
916d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
926d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_IPV6
936d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_IPV6 41
946d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
956d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_ICMPV6
966d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_ICMPV6 58
976d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
986d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_SCTP
996d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_SCTP 132
1006d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1016d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_UDPLITE
1026d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_UDPLITE 136
1036d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1046d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_RAW
1056d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_RAW 255
1066d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1076d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_IPX
1086d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_IPX 256
1096d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1106d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_AX25
1116d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_AX25 257
1126d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1136d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_ATALK
1146d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_ATALK 258
1156d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1166d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_NETROM
1176d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_NETROM 259
1186d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1196d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_ROSE
1206d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_ROSE 260
1216d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1226d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_DECNET
1236d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_DECNET 261
1246d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1256d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_X25
1266d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_X25 262
1276d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1286d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_PACKET
1296d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_PACKET 263
1306d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1316d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_ATM
1326d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_ATM 264
1336d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1346d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_AAL
1356d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_AAL 265
1366d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1376d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_IRDA
1386d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_IRDA 266
1396d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1406d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_NETBEUI
1416d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_NETBEUI 267
1426d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1436d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_LLC
1446d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_LLC 268
1456d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1466d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_DCCP
1476d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_DCCP 269
1486d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1496d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_NETLINK
1506d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_NETLINK 270
1516d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1526d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_TIPC
1536d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_TIPC 271
1546d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1556d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_RXRPC
1566d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_RXRPC 272
1576d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1586d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_PPPOL2TP
1596d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_PPPOL2TP 273
1606d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1616d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_BLUETOOTH
1626d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_BLUETOOTH 274
1636d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1646d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_PNPIPE
1656d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_PNPIPE 275
1666d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1676d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_RDS
1686d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_RDS 276
1696d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1706d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_IUCV
1716d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_IUCV 277
1726d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1736d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_CAIF
1746d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_CAIF 278
1756d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1766d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_ALG
1776d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_ALG 279
1786d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1796d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifndef SOL_NFC
1806d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# define SOL_NFC 280
1816d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
1820ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/socketlayers.h"
1836d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin
1840ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/inet_protocols.h"
1852394a3d0e5ee5684a42b36218ada2dcf3b4e705fMasatake YAMATO
1862394a3d0e5ee5684a42b36218ada2dcf3b4e705fMasatake YAMATO#ifdef PF_NETLINK
187d9f7e7a4392a5fb38b3c60825fedddb28f30572fDmitry V. Levin# if !defined NETLINK_SOCK_DIAG && defined NETLINK_INET_DIAG
188d9f7e7a4392a5fb38b3c60825fedddb28f30572fDmitry V. Levin#  define NETLINK_SOCK_DIAG NETLINK_INET_DIAG
189d9f7e7a4392a5fb38b3c60825fedddb28f30572fDmitry V. Levin# endif
190d9f7e7a4392a5fb38b3c60825fedddb28f30572fDmitry V. Levin# include "xlat/netlink_protocols.h"
1912394a3d0e5ee5684a42b36218ada2dcf3b4e705fMasatake YAMATO#endif
1922394a3d0e5ee5684a42b36218ada2dcf3b4e705fMasatake YAMATO
193c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#if defined(HAVE_BLUETOOTH_BLUETOOTH_H)
194c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel# include "xlat/bt_protocols.h"
195c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#endif
196c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel
1970ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/msg_flags.h"
1987987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman
199b0c598ff8d03a57627a5335448a8a60f0950f4f7Wichert Akkerman#if defined(AF_PACKET) /* from e.g. linux/if_packet.h */
2006d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# include "xlat/af_packet_types.h"
2016d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
202b0c598ff8d03a57627a5335448a8a60f0950f4f7Wichert Akkerman
20376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanvoid
204b6c32f4598b84364472bc3febcb80ff3e475def8Dmitry V. Levinprintsock(struct tcb *tcp, long addr, int addrlen)
20576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
206f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman	union {
207f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		char pad[128];
208f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		struct sockaddr sa;
209f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		struct sockaddr_in sin;
210f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		struct sockaddr_un sau;
2119ce1a63eb20b069607c06f9645ac5a17b418a5f3Wichert Akkerman#ifdef HAVE_INET_NTOP
212f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		struct sockaddr_in6 sa6;
2139ce1a63eb20b069607c06f9645ac5a17b418a5f3Wichert Akkerman#endif
2148470374cba7df0e70653d95c4f336a4082c68d82Denys Vlasenko#if defined(AF_IPX)
215f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		struct sockaddr_ipx sipx;
216f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#endif
217f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#ifdef AF_PACKET
218f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		struct sockaddr_ll ll;
21976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
220f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#ifdef AF_NETLINK
221f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		struct sockaddr_nl nl;
222f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#endif
223c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
224c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel		struct sockaddr_hci hci;
225c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel		struct sockaddr_l2 l2;
226c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel		struct sockaddr_rc rc;
227c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel		struct sockaddr_sco sco;
228c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#endif
229f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman	} addrbuf;
230f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman	char string_addr[100];
23176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
23276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (addr == 0) {
23360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("NULL");
23476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return;
23576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
23676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (!verbose(tcp)) {
23776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%#lx", addr);
23876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return;
23976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
240f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman
2413ed5d021837768405d9f9c9e7d2b05dc6a110d94Dmitry V. Levin	if (addrlen < 2 || addrlen > (int) sizeof(addrbuf))
242b6c32f4598b84364472bc3febcb80ff3e475def8Dmitry V. Levin		addrlen = sizeof(addrbuf);
243b6c32f4598b84364472bc3febcb80ff3e475def8Dmitry V. Levin
244b6c32f4598b84364472bc3febcb80ff3e475def8Dmitry V. Levin	memset(&addrbuf, 0, sizeof(addrbuf));
245b6c32f4598b84364472bc3febcb80ff3e475def8Dmitry V. Levin	if (umoven(tcp, addr, addrlen, addrbuf.pad) < 0) {
24660fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("{...}");
24776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return;
24876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
249b6c32f4598b84364472bc3febcb80ff3e475def8Dmitry V. Levin	addrbuf.pad[sizeof(addrbuf.pad) - 1] = '\0';
250f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman
25160fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints("{sa_family=");
252f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman	printxval(addrfams, addrbuf.sa.sa_family, "AF_???");
25360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints(", ");
254f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman
255f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman	switch (addrbuf.sa.sa_family) {
25676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case AF_UNIX:
257b6c32f4598b84364472bc3febcb80ff3e475def8Dmitry V. Levin		if (addrlen == 2) {
25860fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("NULL");
259f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		} else if (addrbuf.sau.sun_path[0]) {
260c86340e171ebbb4b11e986d172e9b27535ae1807Dmitry V. Levin			tprints("sun_path=");
261d9177dfc12f82a9238bf71e85d07d41346c5e5e8Dmitry V. Levin			print_quoted_string(addrbuf.sau.sun_path,
262f57bd11eb0b20de9642c9da7b7b870e6c59fef6eDmitry V. Levin					    sizeof(addrbuf.sau.sun_path) + 1,
263d9177dfc12f82a9238bf71e85d07d41346c5e5e8Dmitry V. Levin					    QUOTE_0_TERMINATED);
264f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		} else {
265c86340e171ebbb4b11e986d172e9b27535ae1807Dmitry V. Levin			tprints("sun_path=@");
266d9177dfc12f82a9238bf71e85d07d41346c5e5e8Dmitry V. Levin			print_quoted_string(addrbuf.sau.sun_path + 1,
267f57bd11eb0b20de9642c9da7b7b870e6c59fef6eDmitry V. Levin					    sizeof(addrbuf.sau.sun_path),
268d9177dfc12f82a9238bf71e85d07d41346c5e5e8Dmitry V. Levin					    QUOTE_0_TERMINATED);
269f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		}
27076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		break;
27176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case AF_INET:
2721fcb1d64ed13836334d100af9412f220efa1bbfaJohn Hughes		tprintf("sin_port=htons(%u), sin_addr=inet_addr(\"%s\")",
273f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman			ntohs(addrbuf.sin.sin_port), inet_ntoa(addrbuf.sin.sin_addr));
27476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		break;
2759ce1a63eb20b069607c06f9645ac5a17b418a5f3Wichert Akkerman#ifdef HAVE_INET_NTOP
2769ce1a63eb20b069607c06f9645ac5a17b418a5f3Wichert Akkerman	case AF_INET6:
277f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		inet_ntop(AF_INET6, &addrbuf.sa6.sin6_addr, string_addr, sizeof(string_addr));
278f185065a405794eaf6abc0dcf8345d9e6aa882f7Wichert Akkerman		tprintf("sin6_port=htons(%u), inet_pton(AF_INET6, \"%s\", &sin6_addr), sin6_flowinfo=%u",
279f185065a405794eaf6abc0dcf8345d9e6aa882f7Wichert Akkerman				ntohs(addrbuf.sa6.sin6_port), string_addr,
280f185065a405794eaf6abc0dcf8345d9e6aa882f7Wichert Akkerman				addrbuf.sa6.sin6_flowinfo);
2816d2b34971b33d379c89c36c5ad1b0c6d5d12c453Roland McGrath#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
282f185065a405794eaf6abc0dcf8345d9e6aa882f7Wichert Akkerman		{
283f185065a405794eaf6abc0dcf8345d9e6aa882f7Wichert Akkerman#if defined(HAVE_IF_INDEXTONAME) && defined(IN6_IS_ADDR_LINKLOCAL) && defined(IN6_IS_ADDR_MC_LINKLOCAL)
284b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			int numericscope = 0;
285b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			if (IN6_IS_ADDR_LINKLOCAL(&addrbuf.sa6.sin6_addr)
286b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			    || IN6_IS_ADDR_MC_LINKLOCAL(&addrbuf.sa6.sin6_addr)) {
287b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko				char scopebuf[IFNAMSIZ + 1];
2886d2b34971b33d379c89c36c5ad1b0c6d5d12c453Roland McGrath
289b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko				if (if_indextoname(addrbuf.sa6.sin6_scope_id, scopebuf) == NULL)
290b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko					numericscope++;
2910e9d594caa0362d30ab3c39d509da997d051220bDmitry V. Levin				else {
2920e9d594caa0362d30ab3c39d509da997d051220bDmitry V. Levin					tprints(", sin6_scope_id=if_nametoindex(");
2930e9d594caa0362d30ab3c39d509da997d051220bDmitry V. Levin					print_quoted_string(scopebuf,
2940e9d594caa0362d30ab3c39d509da997d051220bDmitry V. Levin							    sizeof(scopebuf),
2950e9d594caa0362d30ab3c39d509da997d051220bDmitry V. Levin							    QUOTE_0_TERMINATED);
2960e9d594caa0362d30ab3c39d509da997d051220bDmitry V. Levin					tprints(")");
2970e9d594caa0362d30ab3c39d509da997d051220bDmitry V. Levin				}
298b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			} else
299b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko				numericscope++;
3006d2b34971b33d379c89c36c5ad1b0c6d5d12c453Roland McGrath
301b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			if (numericscope)
302f185065a405794eaf6abc0dcf8345d9e6aa882f7Wichert Akkerman#endif
303b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko				tprintf(", sin6_scope_id=%u", addrbuf.sa6.sin6_scope_id);
304f185065a405794eaf6abc0dcf8345d9e6aa882f7Wichert Akkerman		}
305f185065a405794eaf6abc0dcf8345d9e6aa882f7Wichert Akkerman#endif
306b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		break;
3079ce1a63eb20b069607c06f9645ac5a17b418a5f3Wichert Akkerman#endif
3088470374cba7df0e70653d95c4f336a4082c68d82Denys Vlasenko#if defined(AF_IPX)
30976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case AF_IPX:
310f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		{
31176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			int i;
3121fcb1d64ed13836334d100af9412f220efa1bbfaJohn Hughes			tprintf("sipx_port=htons(%u), ",
313f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman					ntohs(addrbuf.sipx.sipx_port));
31476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			/* Yes, I know, this does not look too
31576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			 * strace-ish, but otherwise the IPX
31676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			 * addresses just look monstrous...
31776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			 * Anyways, feel free if you don't like
3186d2b34971b33d379c89c36c5ad1b0c6d5d12c453Roland McGrath			 * this way.. :)
31976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			 */
320f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman			tprintf("%08lx:", (unsigned long)ntohl(addrbuf.sipx.sipx_network));
321b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			for (i = 0; i < IPX_NODE_LEN; i++)
322f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman				tprintf("%02x", addrbuf.sipx.sipx_node[i]);
323f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman			tprintf("/[%02x]", addrbuf.sipx.sipx_type);
324f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		}
325f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		break;
3268470374cba7df0e70653d95c4f336a4082c68d82Denys Vlasenko#endif /* AF_IPX */
327f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#ifdef AF_PACKET
328f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman	case AF_PACKET:
329f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		{
330f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman			int i;
331b0c598ff8d03a57627a5335448a8a60f0950f4f7Wichert Akkerman			tprintf("proto=%#04x, if%d, pkttype=",
332f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman					ntohs(addrbuf.ll.sll_protocol),
333b0c598ff8d03a57627a5335448a8a60f0950f4f7Wichert Akkerman					addrbuf.ll.sll_ifindex);
334130636529156859aaafbf57278f5dbcceae2c76aDmitry V. Levin			printxval(af_packet_types, addrbuf.ll.sll_pkttype, "PACKET_???");
335b0c598ff8d03a57627a5335448a8a60f0950f4f7Wichert Akkerman			tprintf(", addr(%d)={%d, ",
336f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman					addrbuf.ll.sll_halen,
337f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman					addrbuf.ll.sll_hatype);
338b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			for (i = 0; i < addrbuf.ll.sll_halen; i++)
339f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman				tprintf("%02x", addrbuf.ll.sll_addr[i]);
34076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
34176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		break;
342f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman
3438470374cba7df0e70653d95c4f336a4082c68d82Denys Vlasenko#endif /* AF_PACKET */
34436ef1bc03e291f98eb5f44ba722a49b87c3cb5e5Roland McGrath#ifdef AF_NETLINK
345f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman	case AF_NETLINK:
346f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		tprintf("pid=%d, groups=%08x", addrbuf.nl.nl_pid, addrbuf.nl.nl_groups);
347f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		break;
348f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#endif /* AF_NETLINK */
349c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#if defined(AF_BLUETOOTH) && defined(HAVE_BLUETOOTH_BLUETOOTH_H)
350c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel	case AF_BLUETOOTH:
351c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel		tprintf("{sco_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X} or "
352c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			"{rc_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X, rc_channel=%d} or "
353c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			"{l2_psm=htobs(%d), l2_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X, l2_cid=htobs(%d)} or "
354c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			"{hci_dev=htobs(%d)}",
355c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			addrbuf.sco.sco_bdaddr.b[0], addrbuf.sco.sco_bdaddr.b[1],
356c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			addrbuf.sco.sco_bdaddr.b[2], addrbuf.sco.sco_bdaddr.b[3],
357c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			addrbuf.sco.sco_bdaddr.b[4], addrbuf.sco.sco_bdaddr.b[5],
358c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			addrbuf.rc.rc_bdaddr.b[0], addrbuf.rc.rc_bdaddr.b[1],
359c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			addrbuf.rc.rc_bdaddr.b[2], addrbuf.rc.rc_bdaddr.b[3],
360c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			addrbuf.rc.rc_bdaddr.b[4], addrbuf.rc.rc_bdaddr.b[5],
361c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			addrbuf.rc.rc_channel,
362c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			btohs(addrbuf.l2.l2_psm), addrbuf.l2.l2_bdaddr.b[0],
363c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			addrbuf.l2.l2_bdaddr.b[1], addrbuf.l2.l2_bdaddr.b[2],
364c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			addrbuf.l2.l2_bdaddr.b[3], addrbuf.l2.l2_bdaddr.b[4],
365c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			addrbuf.l2.l2_bdaddr.b[5], btohs(addrbuf.l2.l2_cid),
366c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			btohs(addrbuf.hci.hci_dev));
367c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel		break;
368c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#endif /* AF_BLUETOOTH && HAVE_BLUETOOTH_BLUETOOTH_H */
36976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	/* AF_AX25 AF_APPLETALK AF_NETROM AF_BRIDGE AF_AAL5
370f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman	AF_X25 AF_ROSE etc. still need to be done */
37176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
37276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	default:
37360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("sa_data=");
374d0dceaf0ffdd1ad0e5169777126da8126903dba8Dmitry V. Levin		print_quoted_string(addrbuf.sa.sa_data,
375d0dceaf0ffdd1ad0e5169777126da8126903dba8Dmitry V. Levin				    sizeof(addrbuf.sa.sa_data), 0);
37676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		break;
37776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
37860fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints("}");
37976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
38076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
38176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#if HAVE_SENDMSG
382b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin# ifndef SCM_SECURITY
383b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin#  define SCM_SECURITY 0x03
384b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin# endif
385b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin# include "xlat/scmvals.h"
3865077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath
38705884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
38805884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levinstruct cmsghdr32 {
38905884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin	uint32_t cmsg_len;
39005884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin	int cmsg_level;
39105884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin	int cmsg_type;
39205884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin};
39305884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#endif
39405884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin
39505884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levintypedef union {
396b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	char *ptr;
39705884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin	struct cmsghdr *cmsg;
39805884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
39905884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin	struct cmsghdr32 *cmsg32;
40005884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#endif
40105884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin} union_cmsghdr;
40205884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin
403b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levinstatic bool
404b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levinprint_scm_rights(struct tcb *tcp, size_t cmsg_size, char *ptr, size_t cmsg_len)
4055077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath{
406b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	if (cmsg_size + sizeof(int) > cmsg_len)
407b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		return false;
408b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
409b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	int *fds = (int *) (ptr + cmsg_size);
410b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	bool seen = false;
411b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
412b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	tprints(", [");
413b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	while ((char *) fds < (ptr + cmsg_len)) {
414b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		if (seen)
415b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			tprints(", ");
416b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		else
417b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			seen = true;
418b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		printfd(tcp, *fds++);
419b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	}
420b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	tprints("]}");
421b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	return true;
422b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin}
423b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
424b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levinstatic bool
425b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levinprint_scm_creds(struct tcb *tcp, size_t cmsg_size, char *ptr, size_t cmsg_len)
426b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin{
427b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	if (cmsg_size + sizeof(struct ucred) > cmsg_len)
428b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		return false;
429b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
430b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	const struct ucred *uc = (void *) (ptr + cmsg_size);
431b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
432b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	tprintf(", {pid=%u, uid=%u, gid=%u}}",
433b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		(unsigned) uc->pid, (unsigned) uc->uid, (unsigned) uc->gid);
434b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	return true;
435b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin}
436b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
437b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levinstatic bool
438b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levinprint_scm_security(struct tcb *tcp, size_t cmsg_size, char *ptr, size_t cmsg_len)
439b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin{
440b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	if (cmsg_size + sizeof(char) > cmsg_len)
441b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		return false;
442b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
443b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	const char *label = (const char *) (ptr + cmsg_size);
444b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	const size_t label_len = cmsg_len - cmsg_size;
44505884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin
446513e96eb94841734274c0607aae2c9f212411eeeDmitry V. Levin	tprints(", ");
447513e96eb94841734274c0607aae2c9f212411eeeDmitry V. Levin	print_quoted_string(label, label_len, 0);
448513e96eb94841734274c0607aae2c9f212411eeeDmitry V. Levin	tprints("}");
449b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
450b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	return true;
451b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin}
452b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
453b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levinstatic void
454b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levinprintcmsghdr(struct tcb *tcp, unsigned long addr, size_t len)
455b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin{
456b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	const size_t cmsg_size =
45705884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
45805884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin		(current_wordsize < sizeof(long)) ? sizeof(struct cmsghdr32) :
45905884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#endif
46005884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin			sizeof(struct cmsghdr);
46105884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin
462b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	char *buf = len < cmsg_size ? NULL : malloc(len);
463b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	if (!buf || umoven(tcp, addr, len, buf) < 0) {
4645077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath		tprintf(", msg_control=%#lx", addr);
465b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		free(buf);
4665077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath		return;
4675077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath	}
4685077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath
469b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	union_cmsghdr u = { .ptr = buf };
470b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
471b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	tprints(", [");
472b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	while (len >= cmsg_size) {
473b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		size_t cmsg_len =
47405884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
475b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			(current_wordsize < sizeof(long)) ? u.cmsg32->cmsg_len :
47605884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#endif
477b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin				u.cmsg->cmsg_len;
478b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		int cmsg_level =
47905884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
480b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			(current_wordsize < sizeof(long)) ? u.cmsg32->cmsg_level :
48105884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#endif
482b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin				u.cmsg->cmsg_level;
483b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		int cmsg_type =
48405884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
485b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			(current_wordsize < sizeof(long)) ? u.cmsg32->cmsg_type :
48605884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#endif
487b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin				u.cmsg->cmsg_type;
488b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
489b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		if (u.ptr != buf)
490b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			tprints(", ");
491b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		tprintf("{cmsg_len=%lu, cmsg_level=", (unsigned long) cmsg_len);
492b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		printxval(socketlayers, cmsg_level, "SOL_???");
493b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		tprints(", cmsg_type=");
494b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
495b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		if (cmsg_len > len)
496b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			cmsg_len = len;
497b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
498b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		if (cmsg_level == SOL_SOCKET) {
499b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			printxval(scmvals, cmsg_type, "SCM_???");
500b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			switch (cmsg_type) {
501b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			case SCM_RIGHTS:
502b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin				if (print_scm_rights(tcp, cmsg_size, u.ptr, cmsg_len))
503b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin					goto next_cmsg;
504b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin				break;
505b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			case SCM_CREDENTIALS:
506b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin				if (print_scm_creds(tcp, cmsg_size, u.ptr, cmsg_len))
507b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin					goto next_cmsg;
508b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin				break;
509b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			case SCM_SECURITY:
510b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin				if (print_scm_security(tcp, cmsg_size, u.ptr, cmsg_len))
511b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin					goto next_cmsg;
512b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin				break;
5135077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath			}
514b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		} else {
515b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			tprintf("%u", cmsg_type);
516b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		}
517b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		tprints(", ...}");
518b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levinnext_cmsg:
519b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		if (cmsg_len < cmsg_size) {
520b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			len -= cmsg_size;
521b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			break;
5225077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath		}
523b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		cmsg_len = (cmsg_len + current_wordsize - 1) &
524b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			(size_t) ~(current_wordsize - 1);
525b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		if (cmsg_len >= len) {
526b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			len = 0;
527b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			break;
5285077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath		}
529b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		u.ptr += cmsg_len;
530b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		len -= cmsg_len;
5315077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath	}
532b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	if (len)
533b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		tprints(", ...");
534b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	tprints("]");
535b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	free(buf);
5365077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath}
53776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
53876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanstatic void
539e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenkodo_msghdr(struct tcb *tcp, struct msghdr *msg, unsigned long data_size)
5400873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab{
5410873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	tprintf("{msg_name(%d)=", msg->msg_namelen);
5420873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	printsock(tcp, (long)msg->msg_name, msg->msg_namelen);
5430873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab
5440873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	tprintf(", msg_iov(%lu)=", (unsigned long)msg->msg_iovlen);
545e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko	tprint_iov_upto(tcp, (unsigned long)msg->msg_iovlen,
546e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko		   (unsigned long)msg->msg_iov, 1, data_size);
5470873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab
5480873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
5490873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	tprintf(", msg_controllen=%lu", (unsigned long)msg->msg_controllen);
5500873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	if (msg->msg_controllen)
5510873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab		printcmsghdr(tcp, (unsigned long) msg->msg_control,
5520873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab			     msg->msg_controllen);
55360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints(", msg_flags=");
5540873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	printflags(msg_flags, msg->msg_flags, "MSG_???");
5550873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab#else /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */
5560873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	tprintf("msg_accrights=%#lx, msg_accrightslen=%u",
5570873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab		(unsigned long) msg->msg_accrights, msg->msg_accrightslen);
5580873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab#endif /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */
55960fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints("}");
5600873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab}
5610873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab
5623e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenkostruct msghdr32 {
5633e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	uint32_t /* void* */    msg_name;
5643e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	uint32_t /* socklen_t */msg_namelen;
5653e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	uint32_t /* iovec* */   msg_iov;
5663e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	uint32_t /* size_t */   msg_iovlen;
5673e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	uint32_t /* void* */    msg_control;
5683e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	uint32_t /* size_t */   msg_controllen;
5693e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	uint32_t /* int */      msg_flags;
5703e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko};
5713e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenkostruct mmsghdr32 {
5723e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	struct msghdr32         msg_hdr;
5733e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	uint32_t /* unsigned */ msg_len;
5743e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko};
5753e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko
576caf6a438f9d97684c10da8a6453d1e0e151a9613Masatake YAMATO#ifndef HAVE_STRUCT_MMSGHDR
577caf6a438f9d97684c10da8a6453d1e0e151a9613Masatake YAMATOstruct mmsghdr {
578caf6a438f9d97684c10da8a6453d1e0e151a9613Masatake YAMATO	struct msghdr msg_hdr;
579caf6a438f9d97684c10da8a6453d1e0e151a9613Masatake YAMATO	unsigned msg_len;
580caf6a438f9d97684c10da8a6453d1e0e151a9613Masatake YAMATO};
581caf6a438f9d97684c10da8a6453d1e0e151a9613Masatake YAMATO#endif
582caf6a438f9d97684c10da8a6453d1e0e151a9613Masatake YAMATO
583b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
584b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATOstatic void
585b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATOcopy_from_msghdr32(struct msghdr *to_msg, struct msghdr32 *from_msg32)
586b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO{
587b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO	to_msg->msg_name       = (void*)(long)from_msg32->msg_name;
588b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO	to_msg->msg_namelen    =              from_msg32->msg_namelen;
589b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO	to_msg->msg_iov        = (void*)(long)from_msg32->msg_iov;
590b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO	to_msg->msg_iovlen     =              from_msg32->msg_iovlen;
591b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO	to_msg->msg_control    = (void*)(long)from_msg32->msg_control;
592b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO	to_msg->msg_controllen =              from_msg32->msg_controllen;
593b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO	to_msg->msg_flags      =              from_msg32->msg_flags;
594b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO}
595b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO#endif
596b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO
59702f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATOstatic bool
59802f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATOextractmsghdr(struct tcb *tcp, long addr, struct msghdr *msg)
59976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
6003e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
6013e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	if (current_wordsize == 4) {
6023e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko		struct msghdr32 msg32;
6033e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko
60402f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO		if (umove(tcp, addr, &msg32) < 0)
60502f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO			return false;
606b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO		copy_from_msghdr32(msg, &msg32);
6073e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	} else
6083e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko#endif
60902f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO	if (umove(tcp, addr, msg) < 0)
61002f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO		return false;
61102f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO	return true;
61202f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO}
61302f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO
614a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATOstatic bool
615a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATOextractmmsghdr(struct tcb *tcp, long addr, unsigned int idx, struct mmsghdr *mmsg)
616a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO{
617a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
618a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	if (current_wordsize == 4) {
619a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		struct mmsghdr32 mmsg32;
620a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO
621a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		addr += sizeof(struct mmsghdr32) * idx;
622a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		if (umove(tcp, addr, &mmsg32) < 0)
623a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO			return false;
624a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO
625a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		copy_from_msghdr32(&mmsg->msg_hdr, &mmsg32.msg_hdr);
626a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		mmsg->msg_len = mmsg32.msg_len;
627a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	} else
628a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO#endif
629a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	{
630a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		addr += sizeof(*mmsg) * idx;
631a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		if (umove(tcp, addr, mmsg) < 0)
632a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO			return false;
633a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	}
634a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	return true;
635a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO}
636a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO
63702f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATOstatic void
63802f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATOprintmsghdr(struct tcb *tcp, long addr, unsigned long data_size)
63902f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO{
64002f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO	struct msghdr msg;
64102f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO
64200244b94bbfc3edd2ca17c83e879154b6f6708d4Dmitry V. Levin	if (verbose(tcp) && extractmsghdr(tcp, addr, &msg))
64302f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO		do_msghdr(tcp, &msg, data_size);
64402f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO	else
6452e2553a534f532a1546ea2b2f3dc3cd2276d020dWichert Akkerman		tprintf("%#lx", addr);
64602f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO}
64702f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO
64802f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATOvoid
64902f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATOdumpiov_in_msghdr(struct tcb *tcp, long addr)
65002f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO{
65102f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO	struct msghdr msg;
65202f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO
65302f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO	if (extractmsghdr(tcp, addr, &msg))
65402f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO		dumpiov(tcp, msg.msg_iovlen, (long)msg.msg_iov);
6550873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab}
656f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman
6570873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwabstatic void
6585ea97658e78b6ce9fb768ffdd6a4b682c5df8e90Dmitry V. Levinprintmmsghdr(struct tcb *tcp, long addr, unsigned int idx, unsigned long msg_len)
6590873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab{
660caf6a438f9d97684c10da8a6453d1e0e151a9613Masatake YAMATO	struct mmsghdr mmsg;
661f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman
662a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	if (extractmmsghdr(tcp, addr, idx, &mmsg)) {
663a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		tprints("{");
664a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		do_msghdr(tcp, &mmsg.msg_hdr, msg_len ? msg_len : mmsg.msg_len);
665a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		tprintf(", %u}", mmsg.msg_len);
6660873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	}
667a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	else
668a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		tprintf("%#lx", addr);
66976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
67076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
6717af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levinstatic void
6725ea97658e78b6ce9fb768ffdd6a4b682c5df8e90Dmitry V. Levindecode_mmsg(struct tcb *tcp, unsigned long msg_len)
6737af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin{
6747af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	/* mmsgvec */
6757af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	if (syserror(tcp)) {
6767af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		tprintf("%#lx", tcp->u_arg[1]);
6777af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	} else {
6787af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		unsigned int len = tcp->u_rval;
6797af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		unsigned int i;
6807af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin
6817af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		tprints("{");
6827af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		for (i = 0; i < len; ++i) {
6837af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin			if (i)
6847af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin				tprints(", ");
6855ea97658e78b6ce9fb768ffdd6a4b682c5df8e90Dmitry V. Levin			printmmsghdr(tcp, tcp->u_arg[1], i, msg_len);
6867af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		}
6877af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		tprints("}");
6887af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	}
6897af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	/* vlen */
6907af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	tprintf(", %u, ", (unsigned int) tcp->u_arg[2]);
6917af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	/* flags */
6927af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	printflags(msg_flags, tcp->u_arg[3], "MSG_???");
6937af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin}
6947af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin
695a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATOvoid
696a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATOdumpiov_in_mmsghdr(struct tcb *tcp, long addr)
697a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO{
698a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	unsigned int len = tcp->u_rval;
699a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	unsigned int i;
700a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	struct mmsghdr mmsg;
701a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO
702a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	for (i = 0; i < len; ++i) {
703a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		if (extractmmsghdr(tcp, addr, i, &mmsg)) {
704a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO			tprintf(" = %lu buffers in vector %u\n",
705a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO				(unsigned long)mmsg.msg_hdr.msg_iovlen, i);
706a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO			dumpiov(tcp, mmsg.msg_hdr.msg_iovlen,
707a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO				(long)mmsg.msg_hdr.msg_iov);
708a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		}
709a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	}
710a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO}
71176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* HAVE_SENDMSG */
71276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
7138a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin/*
7148a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin * low bits of the socket type define real socket type,
7158a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin * other bits are socket type flags.
7168a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin */
7178a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levinstatic void
7181e42f2dbe721f7cb1e4bdfc9103bf358b4a443c1Dmitry V. Levintprint_sock_type(int flags)
7198a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin{
7208a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin	const char *str = xlookup(socktypes, flags & SOCK_TYPE_MASK);
7218a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin
7227b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko	if (str) {
7235940e6593911dcace424c668a1c0934c71fccb9eDenys Vlasenko		tprints(str);
7248a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin		flags &= ~SOCK_TYPE_MASK;
7258a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin		if (!flags)
7268a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin			return;
72760fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("|");
7288a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin	}
7298a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin	printflags(sock_type_flags, flags, "SOCK_???");
7308a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin}
7318a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin
732a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(socket)
73376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
73476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
73576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printxval(domains, tcp->u_arg[0], "PF_???");
73660fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
7371e42f2dbe721f7cb1e4bdfc9103bf358b4a443c1Dmitry V. Levin		tprint_sock_type(tcp->u_arg[1]);
73860fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
73976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		switch (tcp->u_arg[0]) {
74076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case PF_INET:
7418758e544d502e54202079b0521ae0a234d644a4aRoland McGrath#ifdef PF_INET6
7428758e544d502e54202079b0521ae0a234d644a4aRoland McGrath		case PF_INET6:
7438758e544d502e54202079b0521ae0a234d644a4aRoland McGrath#endif
7442394a3d0e5ee5684a42b36218ada2dcf3b4e705fMasatake YAMATO			printxval(inet_protocols, tcp->u_arg[2], "IPPROTO_???");
74576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
74676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef PF_IPX
74776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case PF_IPX:
74876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			/* BTW: I don't believe this.. */
74960fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("[");
75076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printxval(domains, tcp->u_arg[2], "PF_???");
75160fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("]");
75276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
75376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* PF_IPX */
7542394a3d0e5ee5684a42b36218ada2dcf3b4e705fMasatake YAMATO#ifdef PF_NETLINK
7552394a3d0e5ee5684a42b36218ada2dcf3b4e705fMasatake YAMATO		case PF_NETLINK:
7562394a3d0e5ee5684a42b36218ada2dcf3b4e705fMasatake YAMATO			printxval(netlink_protocols, tcp->u_arg[2], "NETLINK_???");
7572394a3d0e5ee5684a42b36218ada2dcf3b4e705fMasatake YAMATO			break;
7582394a3d0e5ee5684a42b36218ada2dcf3b4e705fMasatake YAMATO#endif
759c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#if defined(PF_BLUETOOTH) && defined(HAVE_BLUETOOTH_BLUETOOTH_H)
760c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel		case PF_BLUETOOTH:
761c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			printxval(bt_protocols, tcp->u_arg[2], "BTPROTO_???");
762c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			break;
763c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#endif
76476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		default:
76576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("%lu", tcp->u_arg[2]);
76676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
76776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
76876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
76976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
77076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
77176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
772a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(bind)
77376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
77476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
775894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
776894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
777f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		printsock(tcp, tcp->u_arg[1], tcp->u_arg[2]);
77876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", %lu", tcp->u_arg[2]);
77976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
78076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
78176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
78276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
783a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(connect)
78476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
78576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return sys_bind(tcp);
78676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
78776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
788a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(listen)
78976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
79076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
791894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
792894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
793894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprintf("%lu", tcp->u_arg[1]);
79476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
79576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
79676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
79776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
798705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzinistatic int
79915114ec215f889b71fd1f9ed2012b8deeb33a55cDmitry V. Levindo_sockname(struct tcb *tcp, int flags_arg)
80076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
80176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
802894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
803894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
804705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini		return 0;
805705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini	}
806705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini	if (!tcp->u_arg[2])
80776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%#lx, NULL", tcp->u_arg[1]);
80876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	else {
8092fc6615b9137234af661ed15796e021e98e43bf9Dmitry V. Levin		int len;
8102fc6615b9137234af661ed15796e021e98e43bf9Dmitry V. Levin		if (tcp->u_arg[1] == 0 || syserror(tcp)
811b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		    || umove(tcp, tcp->u_arg[2], &len) < 0) {
81276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("%#lx", tcp->u_arg[1]);
81376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		} else {
8142fc6615b9137234af661ed15796e021e98e43bf9Dmitry V. Levin			printsock(tcp, tcp->u_arg[1], len);
81576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
81660fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
8172fc6615b9137234af661ed15796e021e98e43bf9Dmitry V. Levin		printnum_int(tcp, tcp->u_arg[2], "%u");
81876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
819705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini	if (flags_arg >= 0) {
82060fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
821705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini		printflags(sock_type_flags, tcp->u_arg[flags_arg],
822705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini			   "SOCK_???");
823705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini	}
82476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
82576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
82676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
827a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(accept)
828705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini{
82915114ec215f889b71fd1f9ed2012b8deeb33a55cDmitry V. Levin	do_sockname(tcp, -1);
83015114ec215f889b71fd1f9ed2012b8deeb33a55cDmitry V. Levin	return RVAL_FD;
831705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini}
832705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini
833a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(accept4)
834705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini{
83515114ec215f889b71fd1f9ed2012b8deeb33a55cDmitry V. Levin	do_sockname(tcp, 3);
83615114ec215f889b71fd1f9ed2012b8deeb33a55cDmitry V. Levin	return RVAL_FD;
837705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini}
838705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini
839a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(send)
84076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
84176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
842894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
843894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
84476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
84576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", %lu, ", tcp->u_arg[2]);
84676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* flags */
847b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(msg_flags, tcp->u_arg[3], "MSG_???");
84876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
84976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
85076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
85176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
852a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(sendto)
85376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
85476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
855894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
856894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
85776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
85876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", %lu, ", tcp->u_arg[2]);
85976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* flags */
860b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(msg_flags, tcp->u_arg[3], "MSG_???");
86176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* to address */
86260fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
863f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]);
86476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* to length */
86576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", %lu", tcp->u_arg[5]);
86676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
86776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
86876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
86976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
87076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef HAVE_SENDMSG
87176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
872a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(sendmsg)
87376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
87476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
875894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
876894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
877043b5f81429412cf23d578d1dc2b45107a8352e5Dmitry V. Levin		printmsghdr(tcp, tcp->u_arg[1], (unsigned long) -1L);
87876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* flags */
87960fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
880b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(msg_flags, tcp->u_arg[2], "MSG_???");
88176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
88276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
88376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
88476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
885a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(sendmmsg)
8867af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin{
8877af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	if (entering(tcp)) {
8887af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		/* sockfd */
889894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
890894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
8917af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		if (!verbose(tcp)) {
8927af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin			tprintf("%#lx, %u, ",
8937af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin				tcp->u_arg[1], (unsigned int) tcp->u_arg[2]);
8947af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin			printflags(msg_flags, tcp->u_arg[3], "MSG_???");
8957af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		}
8967af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	} else {
8977af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		if (verbose(tcp))
8985ea97658e78b6ce9fb768ffdd6a4b682c5df8e90Dmitry V. Levin			decode_mmsg(tcp, (unsigned long) -1L);
8997af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	}
9007af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	return 0;
9017af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin}
9027af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin
90376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* HAVE_SENDMSG */
90476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
905a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(recv)
90676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
90776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
908894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
909894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
91076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
91176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp))
91276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("%#lx", tcp->u_arg[1]);
91376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else
91476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printstr(tcp, tcp->u_arg[1], tcp->u_rval);
91576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
91676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", %lu, ", tcp->u_arg[2]);
917b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(msg_flags, tcp->u_arg[3], "MSG_???");
91876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
91976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
92076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
92176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
922a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(recvfrom)
92376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
92476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int fromlen;
92576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
92676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
927894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
928894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
92976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
93076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp)) {
93176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("%#lx, %lu, %lu, %#lx, %#lx",
93276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman				tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3],
93376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman				tcp->u_arg[4], tcp->u_arg[5]);
93476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
93576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
93676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* buf */
93776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printstr(tcp, tcp->u_arg[1], tcp->u_rval);
93876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* len */
93976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", %lu, ", tcp->u_arg[2]);
94076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* flags */
941b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(msg_flags, tcp->u_arg[3], "MSG_???");
94276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* from address, len */
94376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (!tcp->u_arg[4] || !tcp->u_arg[5]) {
94476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			if (tcp->u_arg[4] == 0)
94560fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko				tprints(", NULL");
94676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			else
94776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman				tprintf(", %#lx", tcp->u_arg[4]);
94876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			if (tcp->u_arg[5] == 0)
94960fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko				tprints(", NULL");
95076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			else
95176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman				tprintf(", %#lx", tcp->u_arg[5]);
95276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
95376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
95476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (umove(tcp, tcp->u_arg[5], &fromlen) < 0) {
95560fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints(", {...}, [?]");
95676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
95776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
95860fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
959f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]);
96076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* from length */
96176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", [%u]", fromlen);
96276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
96376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
96476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
96576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
96676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef HAVE_SENDMSG
96776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
968a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(recvmsg)
96976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
97076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
971894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
972894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
97376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
97400244b94bbfc3edd2ca17c83e879154b6f6708d4Dmitry V. Levin		if (syserror(tcp))
97576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("%#lx", tcp->u_arg[1]);
97676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else
977e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko			printmsghdr(tcp, tcp->u_arg[1], tcp->u_rval);
97876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* flags */
97960fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
980b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(msg_flags, tcp->u_arg[2], "MSG_???");
98176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
98276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
98376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
98476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
985a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(recvmmsg)
9860873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab{
987a1d541ec56e2fb4716f083fcc814b1dedde63d87Denys Vlasenko	/* +5 chars are for "left " prefix */
988a1d541ec56e2fb4716f083fcc814b1dedde63d87Denys Vlasenko	static char str[5 + TIMESPEC_TEXT_BUFSIZE];
989e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin
990a1d541ec56e2fb4716f083fcc814b1dedde63d87Denys Vlasenko	if (entering(tcp)) {
991894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
992894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
993e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		if (verbose(tcp)) {
994e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			sprint_timespec(str, tcp, tcp->u_arg[4]);
995a1d541ec56e2fb4716f083fcc814b1dedde63d87Denys Vlasenko			/* Abusing tcp->auxstr as temp storage.
996a1d541ec56e2fb4716f083fcc814b1dedde63d87Denys Vlasenko			 * Will be used and freed on syscall exit.
997a1d541ec56e2fb4716f083fcc814b1dedde63d87Denys Vlasenko			 */
998e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			tcp->auxstr = strdup(str);
999e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		} else {
1000e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			tprintf("%#lx, %ld, ", tcp->u_arg[1], tcp->u_arg[2]);
1001e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			printflags(msg_flags, tcp->u_arg[3], "MSG_???");
100260fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints(", ");
1003e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			print_timespec(tcp, tcp->u_arg[4]);
1004e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		}
1005e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		return 0;
1006e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin	} else {
1007e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		if (verbose(tcp)) {
10085ea97658e78b6ce9fb768ffdd6a4b682c5df8e90Dmitry V. Levin			decode_mmsg(tcp, 0);
1009e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			/* timeout on entrance */
1010e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			tprintf(", %s", tcp->auxstr ? tcp->auxstr : "{...}");
1011e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			free((void *) tcp->auxstr);
1012e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			tcp->auxstr = NULL;
1013e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		}
1014e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		if (syserror(tcp))
1015e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			return 0;
1016e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		if (tcp->u_rval == 0) {
1017e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			tcp->auxstr = "Timeout";
1018e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			return RVAL_STR;
1019e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		}
1020e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		if (!verbose(tcp))
1021e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			return 0;
1022e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		/* timeout on exit */
1023a1d541ec56e2fb4716f083fcc814b1dedde63d87Denys Vlasenko		sprint_timespec(stpcpy(str, "left "), tcp, tcp->u_arg[4]);
1024e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		tcp->auxstr = str;
1025e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		return RVAL_STR;
10260873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	}
10270873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab}
10280873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab
102976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* HAVE_SENDMSG */
103076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
10310ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/shutdown_modes.h"
10329cd385010ec1e0d22be70ff5163db194f1f22735Sebastian Pipping
1033a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(shutdown)
103476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
103576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
1036894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
1037894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
10389cd385010ec1e0d22be70ff5163db194f1f22735Sebastian Pipping		printxval(shutdown_modes, tcp->u_arg[1], "SHUT_???");
103976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
104076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
104176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
104276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
1043a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(getsockname)
104476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
104515114ec215f889b71fd1f9ed2012b8deeb33a55cDmitry V. Levin	return do_sockname(tcp, -1);
104676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
104776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
10484371b10b30ceb369942e93105c038519524ba18eDmitry V. Levinstatic int
10494371b10b30ceb369942e93105c038519524ba18eDmitry V. Levindo_pipe(struct tcb *tcp, int flags_arg)
10504371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin{
105176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (exiting(tcp)) {
105276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp)) {
105376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("%#lx", tcp->u_arg[0]);
10544371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin		} else {
105578ed3f3558942b7c042aeb84ee0f4a2dccf64791Dmitry V. Levin#ifdef HAVE_GETRVAL2
105678ed3f3558942b7c042aeb84ee0f4a2dccf64791Dmitry V. Levin			if (flags_arg < 0) {
105778ed3f3558942b7c042aeb84ee0f4a2dccf64791Dmitry V. Levin				tprintf("[%lu, %lu]", tcp->u_rval, getrval2(tcp));
105878ed3f3558942b7c042aeb84ee0f4a2dccf64791Dmitry V. Levin			} else
105976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
106078ed3f3558942b7c042aeb84ee0f4a2dccf64791Dmitry V. Levin			{
106178ed3f3558942b7c042aeb84ee0f4a2dccf64791Dmitry V. Levin				int fds[2];
106278ed3f3558942b7c042aeb84ee0f4a2dccf64791Dmitry V. Levin
106378ed3f3558942b7c042aeb84ee0f4a2dccf64791Dmitry V. Levin				if (umove(tcp, tcp->u_arg[0], &fds) < 0)
106478ed3f3558942b7c042aeb84ee0f4a2dccf64791Dmitry V. Levin					tprintf("%#lx", tcp->u_arg[0]);
106578ed3f3558942b7c042aeb84ee0f4a2dccf64791Dmitry V. Levin				else
106678ed3f3558942b7c042aeb84ee0f4a2dccf64791Dmitry V. Levin					tprintf("[%u, %u]", fds[0], fds[1]);
106778ed3f3558942b7c042aeb84ee0f4a2dccf64791Dmitry V. Levin			}
10684371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin		}
10694371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin		if (flags_arg >= 0) {
107060fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints(", ");
10714371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin			printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???");
10724371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin		}
10734371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin	}
107476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
107576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
107676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
1077a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(pipe)
10784371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin{
10794371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin	return do_pipe(tcp, -1);
10804371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin}
10814371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin
1082a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(pipe2)
10834371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin{
10844371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin	return do_pipe(tcp, 1);
10854371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin}
10864371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin
1087a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(socketpair)
108876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
108976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int fds[2];
109076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
109176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
109276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printxval(domains, tcp->u_arg[0], "PF_???");
109360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
10941e42f2dbe721f7cb1e4bdfc9103bf358b4a443c1Dmitry V. Levin		tprint_sock_type(tcp->u_arg[1]);
1095033fb910a291a26d714d277c748683e67903f44cDmitry V. Levin		tprintf(", %lu", tcp->u_arg[2]);
109676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
109776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp)) {
10982e2553a534f532a1546ea2b2f3dc3cd2276d020dWichert Akkerman			tprintf(", %#lx", tcp->u_arg[3]);
109976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
110076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
11017e69ed98cdd3c8ee0bba783927bc95b895c60160Denys Vlasenko		if (umoven(tcp, tcp->u_arg[3], sizeof fds, fds) < 0)
110260fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints(", [...]");
110376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else
110476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf(", [%u, %u]", fds[0], fds[1]);
110576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
110676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
110776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
110876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
11096d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#include "xlat/sockoptions.h"
11106d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#include "xlat/sockipoptions.h"
11116d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#include "xlat/sockipv6options.h"
11126d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#include "xlat/sockipxoptions.h"
11136d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#include "xlat/sockrawoptions.h"
11146d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#include "xlat/sockpacketoptions.h"
11156d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#include "xlat/socksctpoptions.h"
11166d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#include "xlat/socktcpoptions.h"
11176d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin
11180509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinstatic void
11190509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinprint_sockopt_fd_level_name(struct tcb *tcp, int fd, int level, int name)
112076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
11210509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	printfd(tcp, fd);
11220509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	tprints(", ");
11230509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	printxval(socketlayers, level, "SOL_??");
11240509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	tprints(", ");
11250509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
11260509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	switch (level) {
11270509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_SOCKET:
11280509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		printxval(sockoptions, name, "SO_???");
11290509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		break;
11300509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_IP:
11310509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		printxval(sockipoptions, name, "IP_???");
11320509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		break;
11330509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_IPV6:
11340509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		printxval(sockipv6options, name, "IPV6_???");
11350509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		break;
11360509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_IPX:
11370509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		printxval(sockipxoptions, name, "IPX_???");
11380509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		break;
11390509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_PACKET:
11400509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		printxval(sockpacketoptions, name, "PACKET_???");
11410509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		break;
11420509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_TCP:
11430509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		printxval(socktcpoptions, name, "TCP_???");
11440509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		break;
11450509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_SCTP:
11460509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		printxval(socksctpoptions, name, "SCTP_???");
11470509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		break;
11480509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_RAW:
11490509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		printxval(sockrawoptions, name, "RAW_???");
11500509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		break;
115176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
11520509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		/* Other SOL_* protocol levels still need work. */
11530509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
11540509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	default:
11550509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		tprintf("%u", name);
11560509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	}
11570509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
11580509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	tprints(", ");
11590509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin}
116093f7fccaa60735509fd75ad22c8a97a8cd52f6bbJohn Hughes
116193f7fccaa60735509fd75ad22c8a97a8cd52f6bbJohn Hughes#ifdef SO_LINGER
11620509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinstatic void
11630509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinprint_linger(struct tcb *tcp, long addr, int len)
11640509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin{
11650509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	struct linger linger;
11660509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
11670509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (len != sizeof(linger) ||
11680509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	    umove(tcp, addr, &linger) < 0) {
11690509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		tprintf("%#lx", addr);
11700509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		return;
11710509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	}
11720509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
11730509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	tprintf("{onoff=%d, linger=%d}",
11740509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		linger.l_onoff,
11750509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		linger.l_linger);
11760509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin}
11770509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#endif /* SO_LINGER */
11780509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
11790ddd8addef9e9b0c7af00f70b97b3e464205ad1dDmitry V. Levin#ifdef SO_PEERCRED
11800509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinstatic void
11810509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinprint_ucred(struct tcb *tcp, long addr, int len)
11820509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin{
11830509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	struct ucred uc;
11840509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
11850509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (len != sizeof(uc) ||
11860509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	    umove(tcp, addr, &uc) < 0) {
11870509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		tprintf("%#lx", addr);
11880509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	} else {
11890509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		tprintf("{pid=%u, uid=%u, gid=%u}",
11900509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			(unsigned) uc.pid,
11910509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			(unsigned) uc.uid,
11920509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			(unsigned) uc.gid);
11930509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	}
11940509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin}
11950509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#endif /* SO_PEERCRED */
11960509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
1197ca75bd6dffc01e4d95e85d3af82d446cd80afbb5Dmitry V. Levin#ifdef PACKET_STATISTICS
11980509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinstatic void
11990509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinprint_tpacket_stats(struct tcb *tcp, long addr, int len)
12000509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin{
12010509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	struct tpacket_stats stats;
120293f7fccaa60735509fd75ad22c8a97a8cd52f6bbJohn Hughes
12030509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (len != sizeof(stats) ||
12040509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	    umove(tcp, addr, &stats) < 0) {
12050509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		tprintf("%#lx", addr);
12060509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	} else {
12070509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		tprintf("{packets=%u, drops=%u}",
12080509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			stats.tp_packets,
12090509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			stats.tp_drops);
121076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
121176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
12120509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#endif /* PACKET_STATISTICS */
121376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
12140509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#ifdef ICMP_FILTER
12156d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# include "xlat/icmpfilterflags.h"
12166d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin
12170509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinstatic void
12180509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinprint_icmp_filter(struct tcb *tcp, long addr, int len)
12197987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman{
12207987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman	struct icmp_filter	filter;
12217987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman
12220509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (len != sizeof(filter) ||
12230509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	    umove(tcp, addr, &filter) < 0) {
12247987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman		tprintf("%#lx", addr);
12257987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman		return;
12267987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman	}
12277987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman
122860fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints("~(");
1229b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath	printflags(icmpfilterflags, ~filter.data, "ICMP_???");
123060fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints(")");
12317987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman}
12327987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman#endif /* ICMP_FILTER */
12337987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman
12340509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinstatic void
12350509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinprint_getsockopt(struct tcb *tcp, int level, int name, long addr, int len)
123676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
12370509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (addr && verbose(tcp))
123838ae88d332acd9f86a30d58158e306d795d98977John Hughes	switch (level) {
1239989ebc91395600c21b4242aee27df9190b2166b3Denys Vlasenko	case SOL_SOCKET:
124038ae88d332acd9f86a30d58158e306d795d98977John Hughes		switch (name) {
12410509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#ifdef SO_LINGER
1242989ebc91395600c21b4242aee27df9190b2166b3Denys Vlasenko		case SO_LINGER:
12430509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			print_linger(tcp, addr, len);
12440509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			goto done;
12450509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#endif
12460509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#ifdef SO_PEERCRED
12470509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		case SO_PEERCRED:
12480509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			print_ucred(tcp, addr, len);
12490509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			goto done;
125038ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
125138ae88d332acd9f86a30d58158e306d795d98977John Hughes		}
125238ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
12530509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
12540509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_PACKET:
12550509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		switch (name) {
12566d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifdef PACKET_STATISTICS
12570509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		case PACKET_STATISTICS:
12580509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			print_tpacket_stats(tcp, addr, len);
12590509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			goto done;
12606d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
12610509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		}
126238ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
12630509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
12640509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_RAW:
12650509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		switch (name) {
12666d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifdef ICMP_FILTER
12670509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		case ICMP_FILTER:
12680509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			print_icmp_filter(tcp, addr, len);
12690509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			goto done;
12706d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
12710509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		}
12724f6ba69d99a8b6933707abdeb0151f98c28172c9Roland McGrath		break;
12730509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	}
12740509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
12750509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	/* default arg printing */
12760509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
12770509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (verbose(tcp)) {
12780509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		if (len == sizeof(int)) {
12790509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			printnum_int(tcp, addr, "%d");
12800509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		} else {
12810509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			printstr(tcp, addr, len);
12820509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		}
12830509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	} else {
12840509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		tprintf("%#lx", addr);
12850509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	}
12860509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levindone:
12870509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	tprintf(", [%d]", len);
12880509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin}
12890509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
1290a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(getsockopt)
12910509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin{
12920509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (entering(tcp)) {
12930509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		print_sockopt_fd_level_name(tcp, tcp->u_arg[0],
12940509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin					    tcp->u_arg[1], tcp->u_arg[2]);
12950509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	} else {
12960509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		int len;
12970509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
12980509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		if (syserror(tcp) || umove(tcp, tcp->u_arg[4], &len) < 0) {
12990509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			tprintf("%#lx, %#lx",
13000509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin				tcp->u_arg[3], tcp->u_arg[4]);
13010509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		} else {
13020509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			print_getsockopt(tcp, tcp->u_arg[1], tcp->u_arg[2],
13030509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin					 tcp->u_arg[3], len);
13040509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		}
13050509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	}
13060509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	return 0;
13070509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin}
13080509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
1309a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin#ifdef MCAST_JOIN_GROUP
1310a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levinstatic void
1311a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levinprint_group_req(struct tcb *tcp, long addr, int len)
1312a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin{
1313a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	struct group_req greq;
1314a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin
1315a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	if (len != sizeof(greq) ||
1316a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	    umove(tcp, addr, &greq) < 0) {
1317a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		tprintf("%#lx", addr);
1318a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		return;
1319a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	}
1320a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin
1321a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	union {
1322a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		struct sockaddr *sa;
1323a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		struct sockaddr_in *sin;
1324a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin#ifdef HAVE_INET_NTOP
1325a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		struct sockaddr_in6 *sin6;
1326a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin#endif
1327a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	} a = { .sa = (struct sockaddr *) &greq.gr_group };
1328a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin#ifdef HAVE_INET_NTOP
1329a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	char str[INET6_ADDRSTRLEN];
1330a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin#endif
1331a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin
1332a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	tprintf("{gr_interface=%u, gr_group={sa_family=", greq.gr_interface);
1333a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	printxval(addrfams, a.sa->sa_family, "AF_???");
1334a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin
1335a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	switch (a.sa->sa_family) {
1336a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	case AF_INET:
1337a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		tprintf(", sin_port=htons(%u), sin_addr=inet_addr(\"%s\")}}",
1338a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin			ntohs(a.sin->sin_port),
1339a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin			inet_ntoa(a.sin->sin_addr));
1340a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		return;
1341a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin#ifdef HAVE_INET_NTOP
1342a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	case AF_INET6:
1343a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		if (!inet_ntop(AF_INET6, &a.sin6->sin6_addr, str, sizeof(str)))
1344a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin			break;
1345a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		tprintf(", sin6_port=htons(%u)"
1346a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin			", inet_pton(AF_INET6, \"%s\", &sin6_addr)}}",
1347a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin			ntohs(a.sin6->sin6_port), str);
1348a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		return;
1349a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin#endif /* HAVE_INET_NTOP */
1350a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	}
1351a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin
1352a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	tprints(", sa_data=");
1353a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	print_quoted_string(a.sa->sa_data, sizeof(a.sa->sa_data), 0);
1354a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	tprintf("}}");
1355a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin
1356a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin}
1357a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin#endif /* MCAST_JOIN_GROUP */
1358a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin
13590509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#ifdef PACKET_RX_RING
13600509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinstatic void
13610509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinprint_tpacket_req(struct tcb *tcp, long addr, int len)
13620509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin{
13630509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	struct tpacket_req req;
13640509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
13650509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (len != sizeof(req) ||
13660509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	    umove(tcp, addr, &req) < 0) {
13670509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		tprintf("%#lx", addr);
13680509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	} else {
13690509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		tprintf("{block_size=%u, block_nr=%u, "
13700509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			"frame_size=%u, frame_nr=%u}",
13710509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			req.tp_block_size,
13720509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			req.tp_block_nr,
13730509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			req.tp_frame_size,
13740509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			req.tp_frame_nr);
13750509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	}
13760509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin}
13770509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#endif /* PACKET_RX_RING */
13780509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
137902f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin#ifdef PACKET_ADD_MEMBERSHIP
138002f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin# include "xlat/packet_mreq_type.h"
138102f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin
138202f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levinstatic void
138302f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levinprint_packet_mreq(struct tcb *tcp, long addr, int len)
138402f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin{
138502f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin	struct packet_mreq mreq;
138602f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin
138702f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin	if (len != sizeof(mreq) ||
138802f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin	    umove(tcp, addr, &mreq) < 0) {
138902f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		tprintf("%#lx", addr);
139002f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin	} else {
139102f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		unsigned int i;
139202f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin
139302f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		tprintf("{mr_ifindex=%u, mr_type=", mreq.mr_ifindex);
139402f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		printxval(packet_mreq_type, mreq.mr_type, "PACKET_MR_???");
139502f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		tprintf(", mr_alen=%u, mr_address=", mreq.mr_alen);
139602f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		if (mreq.mr_alen > ARRAY_SIZE(mreq.mr_address))
139702f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin			mreq.mr_alen = ARRAY_SIZE(mreq.mr_address);
139802f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		for (i = 0; i < mreq.mr_alen; ++i)
139902f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin			tprintf("%02x", mreq.mr_address[i]);
140002f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		tprints("}");
140102f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin	}
140202f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin}
140302f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin#endif /* PACKET_ADD_MEMBERSHIP */
140402f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin
14050509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinstatic void
14060509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinprint_setsockopt(struct tcb *tcp, int level, int name, long addr, int len)
14070509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin{
14080509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (addr && verbose(tcp))
14090509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	switch (level) {
14100509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_SOCKET:
14110509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		switch (name) {
14120509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#ifdef SO_LINGER
14130509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		case SO_LINGER:
14140509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			print_linger(tcp, addr, len);
14150509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			goto done;
14164f6ba69d99a8b6933707abdeb0151f98c28172c9Roland McGrath#endif
14170509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		}
141838ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
14190509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
1420a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	case SOL_IP:
1421a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		switch (name) {
1422a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin#ifdef MCAST_JOIN_GROUP
1423a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		case MCAST_JOIN_GROUP:
1424a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		case MCAST_LEAVE_GROUP:
1425a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin			print_group_req(tcp, addr, len);
1426a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin			goto done;
1427a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin#endif /* MCAST_JOIN_GROUP */
1428a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		}
14293910d0f67caccf421c72a19026d89115000ebefdDmitry V. Levin		break;
1430a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin
1431989ebc91395600c21b4242aee27df9190b2166b3Denys Vlasenko	case SOL_PACKET:
1432ca75bd6dffc01e4d95e85d3af82d446cd80afbb5Dmitry V. Levin		switch (name) {
14336d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifdef PACKET_RX_RING
1434989ebc91395600c21b4242aee27df9190b2166b3Denys Vlasenko		case PACKET_RX_RING:
14356d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# ifdef PACKET_TX_RING
1436989ebc91395600c21b4242aee27df9190b2166b3Denys Vlasenko		case PACKET_TX_RING:
14376d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# endif
14380509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			print_tpacket_req(tcp, addr, len);
14390509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			goto done;
14406d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif /* PACKET_RX_RING */
14416d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifdef PACKET_ADD_MEMBERSHIP
144202f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		case PACKET_ADD_MEMBERSHIP:
144302f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		case PACKET_DROP_MEMBERSHIP:
144402f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin			print_packet_mreq(tcp, addr, len);
144502f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin			goto done;
14466d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif /* PACKET_ADD_MEMBERSHIP */
1447ca75bd6dffc01e4d95e85d3af82d446cd80afbb5Dmitry V. Levin		}
144838ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
14490509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
1450989ebc91395600c21b4242aee27df9190b2166b3Denys Vlasenko	case SOL_RAW:
145138ae88d332acd9f86a30d58158e306d795d98977John Hughes		switch (name) {
14526d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifdef ICMP_FILTER
14530509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		case ICMP_FILTER:
14540509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			print_icmp_filter(tcp, addr, len);
14550509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			goto done;
14566d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
145738ae88d332acd9f86a30d58158e306d795d98977John Hughes		}
145838ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
145938ae88d332acd9f86a30d58158e306d795d98977John Hughes	}
146093f7fccaa60735509fd75ad22c8a97a8cd52f6bbJohn Hughes
146138ae88d332acd9f86a30d58158e306d795d98977John Hughes	/* default arg printing */
146293f7fccaa60735509fd75ad22c8a97a8cd52f6bbJohn Hughes
14630509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (verbose(tcp)) {
14640509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		if (len == sizeof(int)) {
14650509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			printnum_int(tcp, addr, "%d");
14660509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		} else {
14670509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			printstr(tcp, addr, len);
14680509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		}
14690509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	} else {
14700509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		tprintf("%#lx", addr);
147138ae88d332acd9f86a30d58158e306d795d98977John Hughes	}
14720509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levindone:
14730509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	tprintf(", %d", len);
147438ae88d332acd9f86a30d58158e306d795d98977John Hughes}
147538ae88d332acd9f86a30d58158e306d795d98977John Hughes
1476a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(setsockopt)
147738ae88d332acd9f86a30d58158e306d795d98977John Hughes{
147838ae88d332acd9f86a30d58158e306d795d98977John Hughes	if (entering(tcp)) {
14790509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		print_sockopt_fd_level_name(tcp, tcp->u_arg[0],
14800509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin					    tcp->u_arg[1], tcp->u_arg[2]);
14810509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		print_setsockopt(tcp, tcp->u_arg[1], tcp->u_arg[2],
14820509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin				 tcp->u_arg[3], tcp->u_arg[4]);
148376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
148476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
148576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
1486