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
5554646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger#if defined(HAVE_LINUX_IP_VS_H)
5654646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger# include <linux/ip_vs.h>
5754646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger#endif
58f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#if defined(HAVE_LINUX_NETLINK_H)
59a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# include <linux/netlink.h>
60f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#endif
6154646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger#if defined(HAVE_LINUX_NETFILTER_ARP_ARP_TABLES_H)
6254646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger# include <linux/netfilter_arp/arp_tables.h>
6354646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger#endif
6454646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger#if defined(HAVE_LINUX_NETFILTER_BRIDGE_EBTABLES_H)
6554646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger# include <linux/netfilter_bridge/ebtables.h>
6654646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger#endif
6754646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger#if defined(HAVE_LINUX_NETFILTER_IPV4_IP_TABLES_H)
6854646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger# include <linux/netfilter_ipv4/ip_tables.h>
6954646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger#endif
7054646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger#if defined(HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H)
7154646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger# include <linux/netfilter_ipv6/ip6_tables.h>
7254646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger#endif
73f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#if defined(HAVE_LINUX_IF_PACKET_H)
74a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# include <linux/if_packet.h>
75f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#endif
767987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman#if defined(HAVE_LINUX_ICMP_H)
77a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# include <linux/icmp.h>
787987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman#endif
79c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
80c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel# include <bluetooth/bluetooth.h>
81c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel# include <bluetooth/hci.h>
82c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel# include <bluetooth/l2cap.h>
83c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel# include <bluetooth/rfcomm.h>
84c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel# include <bluetooth/sco.h>
85c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#endif
8676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifndef PF_UNSPEC
87a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# define PF_UNSPEC AF_UNSPEC
8876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
8976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
900ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/domains.h"
910ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/addrfams.h"
920ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/socktypes.h"
930ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/sock_type_flags.h"
948a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin#ifndef SOCK_TYPE_MASK
958a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin# define SOCK_TYPE_MASK 0xf
968a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin#endif
976d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin
980ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/socketlayers.h"
996d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin
1000ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/inet_protocols.h"
1012394a3d0e5ee5684a42b36218ada2dcf3b4e705fMasatake YAMATO
1022394a3d0e5ee5684a42b36218ada2dcf3b4e705fMasatake YAMATO#ifdef PF_NETLINK
103d9f7e7a4392a5fb38b3c60825fedddb28f30572fDmitry V. Levin# if !defined NETLINK_SOCK_DIAG && defined NETLINK_INET_DIAG
104d9f7e7a4392a5fb38b3c60825fedddb28f30572fDmitry V. Levin#  define NETLINK_SOCK_DIAG NETLINK_INET_DIAG
105d9f7e7a4392a5fb38b3c60825fedddb28f30572fDmitry V. Levin# endif
106d9f7e7a4392a5fb38b3c60825fedddb28f30572fDmitry V. Levin# include "xlat/netlink_protocols.h"
1072394a3d0e5ee5684a42b36218ada2dcf3b4e705fMasatake YAMATO#endif
1082394a3d0e5ee5684a42b36218ada2dcf3b4e705fMasatake YAMATO
109c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#if defined(HAVE_BLUETOOTH_BLUETOOTH_H)
110c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel# include "xlat/bt_protocols.h"
111c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#endif
112c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel
1130ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/msg_flags.h"
1147987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman
115b0c598ff8d03a57627a5335448a8a60f0950f4f7Wichert Akkerman#if defined(AF_PACKET) /* from e.g. linux/if_packet.h */
1166d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# include "xlat/af_packet_types.h"
1176d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
118b0c598ff8d03a57627a5335448a8a60f0950f4f7Wichert Akkerman
119ae28093c650f8ee4709c1a22ff365201e2fe809aDmitry V. Levinstatic void
120ae28093c650f8ee4709c1a22ff365201e2fe809aDmitry V. Levinprint_ifindex(unsigned int ifindex)
121ae28093c650f8ee4709c1a22ff365201e2fe809aDmitry V. Levin{
122ae28093c650f8ee4709c1a22ff365201e2fe809aDmitry V. Levin#ifdef HAVE_IF_INDEXTONAME
123ae28093c650f8ee4709c1a22ff365201e2fe809aDmitry V. Levin	char buf[IFNAMSIZ + 1];
124ae28093c650f8ee4709c1a22ff365201e2fe809aDmitry V. Levin
125ae28093c650f8ee4709c1a22ff365201e2fe809aDmitry V. Levin	if (if_indextoname(ifindex, buf)) {
126ae28093c650f8ee4709c1a22ff365201e2fe809aDmitry V. Levin		tprints("if_nametoindex(");
127ae28093c650f8ee4709c1a22ff365201e2fe809aDmitry V. Levin		print_quoted_string(buf, sizeof(buf), QUOTE_0_TERMINATED);
128ae28093c650f8ee4709c1a22ff365201e2fe809aDmitry V. Levin		tprints(")");
129ae28093c650f8ee4709c1a22ff365201e2fe809aDmitry V. Levin		return;
130ae28093c650f8ee4709c1a22ff365201e2fe809aDmitry V. Levin	}
131ae28093c650f8ee4709c1a22ff365201e2fe809aDmitry V. Levin#endif
132ae28093c650f8ee4709c1a22ff365201e2fe809aDmitry V. Levin	tprintf("%u", ifindex);
133ae28093c650f8ee4709c1a22ff365201e2fe809aDmitry V. Levin}
134ae28093c650f8ee4709c1a22ff365201e2fe809aDmitry V. Levin
1351019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levintypedef union {
1361019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	char pad[128];
1371019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	struct sockaddr sa;
1381019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	struct sockaddr_in sin;
1391019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	struct sockaddr_un sau;
1409ce1a63eb20b069607c06f9645ac5a17b418a5f3Wichert Akkerman#ifdef HAVE_INET_NTOP
1411019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	struct sockaddr_in6 sa6;
1429ce1a63eb20b069607c06f9645ac5a17b418a5f3Wichert Akkerman#endif
1438470374cba7df0e70653d95c4f336a4082c68d82Denys Vlasenko#if defined(AF_IPX)
1441019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	struct sockaddr_ipx sipx;
145f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#endif
146f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#ifdef AF_PACKET
1471019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	struct sockaddr_ll ll;
14876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
149f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#ifdef AF_NETLINK
1501019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	struct sockaddr_nl nl;
151f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#endif
152c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
1531019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	struct sockaddr_hci hci;
1541019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	struct sockaddr_l2 l2;
1551019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	struct sockaddr_rc rc;
1561019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	struct sockaddr_sco sco;
157c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#endif
1581019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin} sockaddr_buf_t;
159f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman
1601019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levinstatic void
1611019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levinprint_sockaddr(struct tcb *tcp, const sockaddr_buf_t *addr, const int addrlen)
1621019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin{
16360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints("{sa_family=");
1641019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	printxval(addrfams, addr->sa.sa_family, "AF_???");
16560fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints(", ");
166f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman
1671019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	switch (addr->sa.sa_family) {
16876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case AF_UNIX:
169b6c32f4598b84364472bc3febcb80ff3e475def8Dmitry V. Levin		if (addrlen == 2) {
17060fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("NULL");
1711019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin		} else if (addr->sau.sun_path[0]) {
172c86340e171ebbb4b11e986d172e9b27535ae1807Dmitry V. Levin			tprints("sun_path=");
1731019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			print_quoted_string(addr->sau.sun_path,
1741019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin					    sizeof(addr->sau.sun_path) + 1,
175d9177dfc12f82a9238bf71e85d07d41346c5e5e8Dmitry V. Levin					    QUOTE_0_TERMINATED);
176f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		} else {
177c86340e171ebbb4b11e986d172e9b27535ae1807Dmitry V. Levin			tprints("sun_path=@");
1781019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			print_quoted_string(addr->sau.sun_path + 1,
1791019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin					    sizeof(addr->sau.sun_path),
180d9177dfc12f82a9238bf71e85d07d41346c5e5e8Dmitry V. Levin					    QUOTE_0_TERMINATED);
181f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		}
18276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		break;
18376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case AF_INET:
1841fcb1d64ed13836334d100af9412f220efa1bbfaJohn Hughes		tprintf("sin_port=htons(%u), sin_addr=inet_addr(\"%s\")",
1851019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			ntohs(addr->sin.sin_port), inet_ntoa(addr->sin.sin_addr));
18676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		break;
1879ce1a63eb20b069607c06f9645ac5a17b418a5f3Wichert Akkerman#ifdef HAVE_INET_NTOP
1889ce1a63eb20b069607c06f9645ac5a17b418a5f3Wichert Akkerman	case AF_INET6:
1891019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin		{
1901019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			char string_addr[100];
1911019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			inet_ntop(AF_INET6, &addr->sa6.sin6_addr,
1921019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin				  string_addr, sizeof(string_addr));
1931019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			tprintf("sin6_port=htons(%u), inet_pton(AF_INET6"
1941019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin				", \"%s\", &sin6_addr), sin6_flowinfo=%u",
1951019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin				ntohs(addr->sa6.sin6_port), string_addr,
1961019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin				addr->sa6.sin6_flowinfo);
1971019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin# ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
1981019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			tprints(", sin6_scope_id=");
1991019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin#  if defined IN6_IS_ADDR_LINKLOCAL && defined IN6_IS_ADDR_MC_LINKLOCAL
2001019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			if (IN6_IS_ADDR_LINKLOCAL(&addr->sa6.sin6_addr)
2011019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			    || IN6_IS_ADDR_MC_LINKLOCAL(&addr->sa6.sin6_addr))
2021019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin				print_ifindex(addr->sa6.sin6_scope_id);
2031019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			else
2041019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin#  endif
2051019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin				tprintf("%u", addr->sa6.sin6_scope_id);
2061019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin# endif /* HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID */
2071019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin		}
208b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		break;
2099ce1a63eb20b069607c06f9645ac5a17b418a5f3Wichert Akkerman#endif
2108470374cba7df0e70653d95c4f336a4082c68d82Denys Vlasenko#if defined(AF_IPX)
21176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case AF_IPX:
212f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		{
21376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			int i;
2141fcb1d64ed13836334d100af9412f220efa1bbfaJohn Hughes			tprintf("sipx_port=htons(%u), ",
2151019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin					ntohs(addr->sipx.sipx_port));
21676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			/* Yes, I know, this does not look too
21776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			 * strace-ish, but otherwise the IPX
21876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			 * addresses just look monstrous...
21976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			 * Anyways, feel free if you don't like
2206d2b34971b33d379c89c36c5ad1b0c6d5d12c453Roland McGrath			 * this way.. :)
22176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			 */
2221019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			tprintf("%08lx:", (unsigned long)ntohl(addr->sipx.sipx_network));
223b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			for (i = 0; i < IPX_NODE_LEN; i++)
2241019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin				tprintf("%02x", addr->sipx.sipx_node[i]);
2251019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			tprintf("/[%02x]", addr->sipx.sipx_type);
226f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		}
227f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		break;
2288470374cba7df0e70653d95c4f336a4082c68d82Denys Vlasenko#endif /* AF_IPX */
229f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#ifdef AF_PACKET
230f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman	case AF_PACKET:
231f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		{
232f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman			int i;
233b0c598ff8d03a57627a5335448a8a60f0950f4f7Wichert Akkerman			tprintf("proto=%#04x, if%d, pkttype=",
2341019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin					ntohs(addr->ll.sll_protocol),
2351019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin					addr->ll.sll_ifindex);
2361019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			printxval(af_packet_types, addr->ll.sll_pkttype, "PACKET_???");
237b0c598ff8d03a57627a5335448a8a60f0950f4f7Wichert Akkerman			tprintf(", addr(%d)={%d, ",
2381019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin					addr->ll.sll_halen,
2391019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin					addr->ll.sll_hatype);
2401019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			for (i = 0; i < addr->ll.sll_halen; i++)
2411019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin				tprintf("%02x", addr->ll.sll_addr[i]);
24276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
24376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		break;
244f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman
2458470374cba7df0e70653d95c4f336a4082c68d82Denys Vlasenko#endif /* AF_PACKET */
24636ef1bc03e291f98eb5f44ba722a49b87c3cb5e5Roland McGrath#ifdef AF_NETLINK
247f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman	case AF_NETLINK:
2481019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin		tprintf("pid=%d, groups=%08x", addr->nl.nl_pid, addr->nl.nl_groups);
249f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman		break;
250f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman#endif /* AF_NETLINK */
251c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#if defined(AF_BLUETOOTH) && defined(HAVE_BLUETOOTH_BLUETOOTH_H)
252c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel	case AF_BLUETOOTH:
253c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel		tprintf("{sco_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X} or "
254c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			"{rc_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X, rc_channel=%d} or "
255c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			"{l2_psm=htobs(%d), l2_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X, l2_cid=htobs(%d)} or "
256c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel			"{hci_dev=htobs(%d)}",
2571019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			addr->sco.sco_bdaddr.b[0], addr->sco.sco_bdaddr.b[1],
2581019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			addr->sco.sco_bdaddr.b[2], addr->sco.sco_bdaddr.b[3],
2591019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			addr->sco.sco_bdaddr.b[4], addr->sco.sco_bdaddr.b[5],
2601019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			addr->rc.rc_bdaddr.b[0], addr->rc.rc_bdaddr.b[1],
2611019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			addr->rc.rc_bdaddr.b[2], addr->rc.rc_bdaddr.b[3],
2621019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			addr->rc.rc_bdaddr.b[4], addr->rc.rc_bdaddr.b[5],
2631019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			addr->rc.rc_channel,
2641019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			btohs(addr->l2.l2_psm), addr->l2.l2_bdaddr.b[0],
2651019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			addr->l2.l2_bdaddr.b[1], addr->l2.l2_bdaddr.b[2],
2661019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			addr->l2.l2_bdaddr.b[3], addr->l2.l2_bdaddr.b[4],
2671019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			addr->l2.l2_bdaddr.b[5], btohs(addr->l2.l2_cid),
2681019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin			btohs(addr->hci.hci_dev));
269c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel		break;
270c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#endif /* AF_BLUETOOTH && HAVE_BLUETOOTH_BLUETOOTH_H */
27176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	/* AF_AX25 AF_APPLETALK AF_NETROM AF_BRIDGE AF_AAL5
272f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman	AF_X25 AF_ROSE etc. still need to be done */
27376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
27476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	default:
27560fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("sa_data=");
2761019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin		print_quoted_string(addr->sa.sa_data,
2771019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin				    sizeof(addr->sa.sa_data), 0);
27876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		break;
27976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
28060fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints("}");
28176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
28276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
2831019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levinvoid
2841019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levinprintsock(struct tcb *tcp, long addr, int addrlen)
2851019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin{
2861019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	sockaddr_buf_t addrbuf;
2871019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin
2881019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	if (addrlen < 2) {
2891019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin		printaddr(addr);
2901019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin		return;
2911019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	}
2921019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin
2931019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	if (addrlen > (int) sizeof(addrbuf))
2941019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin		addrlen = sizeof(addrbuf);
2951019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin
2961019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	memset(&addrbuf, 0, sizeof(addrbuf));
2971019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	if (umoven_or_printaddr(tcp, addr, addrlen, addrbuf.pad))
2981019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin		return;
2991019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	addrbuf.pad[sizeof(addrbuf.pad) - 1] = '\0';
3001019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin
3011019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	print_sockaddr(tcp, &addrbuf, addrlen);
3021019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin}
3031019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin
304b36d132907088b878fe77c25a7e8a9c85bf379f0Dmitry V. Levin#include "xlat/scmvals.h"
3051f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin#include "xlat/ip_cmsg_types.h"
3065077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath
30705884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
30805884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levinstruct cmsghdr32 {
30905884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin	uint32_t cmsg_len;
31005884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin	int cmsg_level;
31105884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin	int cmsg_type;
31205884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin};
31305884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#endif
31405884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin
31505884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levintypedef union {
316b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	char *ptr;
31705884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin	struct cmsghdr *cmsg;
31805884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
31905884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin	struct cmsghdr32 *cmsg32;
32005884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#endif
32105884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin} union_cmsghdr;
32205884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin
323f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levinstatic void
3241103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levinprint_scm_rights(struct tcb *tcp, const void *cmsg_data,
3251103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin		 const size_t data_len)
3265077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath{
3271103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin	const int *fds = cmsg_data;
3281103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin	const char *end = (const char *) cmsg_data + data_len;
329b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	bool seen = false;
330b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
3311103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin	if (sizeof(*fds) > data_len)
3321103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin		return;
3331103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin
334b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	tprints(", [");
3351103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin	while ((const char *) fds < end) {
336b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		if (seen)
337b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			tprints(", ");
338b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		else
339b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			seen = true;
340b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		printfd(tcp, *fds++);
341b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	}
342f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin	tprints("]");
343b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin}
344b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
345f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levinstatic void
3461103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levinprint_scm_creds(struct tcb *tcp, const void *cmsg_data,
3471103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin		const size_t data_len)
348b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin{
3491103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin	const struct ucred *uc = cmsg_data;
350b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
3511103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin	if (sizeof(*uc) > data_len)
3521103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin		return;
353b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
354f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin	tprintf(", {pid=%u, uid=%u, gid=%u}",
355b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		(unsigned) uc->pid, (unsigned) uc->uid, (unsigned) uc->gid);
356b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin}
357b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
358f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levinstatic void
3591103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levinprint_scm_security(struct tcb *tcp, const void *cmsg_data,
3601103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin		   const size_t data_len)
361b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin{
3621103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin	if (!data_len)
363f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin		return;
364b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
365513e96eb94841734274c0607aae2c9f212411eeeDmitry V. Levin	tprints(", ");
3661103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin	print_quoted_string(cmsg_data, data_len, 0);
367f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin}
368b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
369f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levinstatic void
3701f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levinprint_cmsg_ip_pktinfo(struct tcb *tcp, const void *cmsg_data,
3711f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		      const size_t data_len)
3721f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin{
3731f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	const struct in_pktinfo *info = cmsg_data;
3741f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
3751f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	if (sizeof(*info) > data_len)
3761f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		return;
3771f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
3781f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	tprints(", {ipi_ifindex=");
3791f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	print_ifindex(info->ipi_ifindex);
3801f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	tprintf(", ipi_spec_dst=inet_addr(\"%s\"), ipi_addr=inet_addr(\"%s\")}",
3811f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		inet_ntoa(info->ipi_spec_dst), inet_ntoa(info->ipi_addr));
3821f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin}
3831f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
3841f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levinstatic void
3851f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levinprint_cmsg_ip_ttl(struct tcb *tcp, const void *cmsg_data,
3861f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		  const size_t data_len)
3871f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin{
3881f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	const unsigned int *ttl = cmsg_data;
3891f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
3901f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	if (sizeof(*ttl) > data_len)
3911f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		return;
3921f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
3931f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	tprintf(", {ttl=%u}", *ttl);
3941f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin}
3951f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
3961f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levinstatic void
3971f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levinprint_cmsg_ip_tos(struct tcb *tcp, const void *cmsg_data,
3981f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		  const size_t data_len)
3991f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin{
4001f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	const uint8_t *tos = cmsg_data;
4011f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
4021f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	if (sizeof(*tos) > data_len)
4031f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		return;
4041f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
4051f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	tprintf(", {tos=%x}", *tos);
4061f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin}
4071f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
4081f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levinstatic void
4091f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levinprint_cmsg_ip_checksum(struct tcb *tcp, const void *cmsg_data,
4101f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		       const size_t data_len)
4111f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin{
4121f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	const uint32_t *csum = cmsg_data;
4131f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
4141f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	if (sizeof(*csum) > data_len)
4151f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		return;
4161f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
4171f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	tprintf(", {csum=%u}", *csum);
4181f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin}
4191f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
4201f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levinstatic void
4211f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levinprint_cmsg_ip_opts(struct tcb *tcp, const void *cmsg_data,
4221f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		   const size_t data_len)
4231f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin{
424a17f593e508ccab2e92032ef9ee5518d79379641Dmitry V. Levin	const unsigned char *opts = cmsg_data;
4251f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	size_t i;
4261f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
4271f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	if (!data_len)
4281f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		return;
4291f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
4301f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	tprints(", {opts=0x");
4311f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	for (i = 0; i < data_len; ++i)
4321f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		tprintf("%02x", opts[i]);
4331f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	tprints("}");
4341f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin}
4351f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
4361f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levinstatic void
4371f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levinprint_cmsg_ip_recverr(struct tcb *tcp, const void *cmsg_data,
4381f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		      const size_t data_len)
4391f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin{
4401f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	const struct {
4411f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		uint32_t ee_errno;
4421f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		uint8_t  ee_origin;
4431f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		uint8_t  ee_type;
4441f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		uint8_t  ee_code;
4451f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		uint8_t  ee_pad;
4461f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		uint32_t ee_info;
4471f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		uint32_t ee_data;
4481f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		struct sockaddr_in offender;
4491f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	} *err = cmsg_data;
4501f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
4511f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	if (sizeof(*err) > data_len)
4521f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		return;
4531f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
4541f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	tprintf(", {ee_errno=%u, ee_origin=%u, ee_type=%u, ee_code=%u"
4551f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		", ee_info=%u, ee_data=%u, offender=",
4561f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		err->ee_errno, err->ee_origin, err->ee_type,
4571f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		err->ee_code, err->ee_info, err->ee_data);
4581f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	print_sockaddr(tcp, (const void *) &err->offender,
4591f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		sizeof(err->offender));
4601f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	tprints("}");
4611f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin}
4621f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
4631f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levinstatic void
4641f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levinprint_cmsg_ip_origdstaddr(struct tcb *tcp, const void *cmsg_data,
4651f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			  const size_t data_len)
4661f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin{
4671f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	if (sizeof(struct sockaddr_in) > data_len)
4681f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		return;
4691f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
4701f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	tprints(", ");
4711f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	print_sockaddr(tcp, cmsg_data, data_len);
4721f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin}
4731f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin
4741f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levinstatic void
475f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levinprint_cmsg_type_data(struct tcb *tcp, const int cmsg_level, const int cmsg_type,
4761103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin		     const void *cmsg_data, const size_t data_len)
477f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin{
478f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin	switch (cmsg_level) {
479f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin	case SOL_SOCKET:
480f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin		printxval(scmvals, cmsg_type, "SCM_???");
481f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin		switch (cmsg_type) {
482f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin		case SCM_RIGHTS:
4831103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin			print_scm_rights(tcp, cmsg_data, data_len);
484f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin			break;
485f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin		case SCM_CREDENTIALS:
4861103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin			print_scm_creds(tcp, cmsg_data, data_len);
487f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin			break;
488f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin		case SCM_SECURITY:
4891103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin			print_scm_security(tcp, cmsg_data, data_len);
490f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin			break;
491f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin		}
492f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin		break;
4931f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin	case SOL_IP:
4941f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		printxval(ip_cmsg_types, cmsg_type, "IP_???");
4951f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		switch (cmsg_type) {
4961f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		case IP_PKTINFO:
4971f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			print_cmsg_ip_pktinfo(tcp, cmsg_data, data_len);
4981f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			break;
4991f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		case IP_TTL:
5001f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			print_cmsg_ip_ttl(tcp, cmsg_data, data_len);
5011f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			break;
5021f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		case IP_TOS:
5031f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			print_cmsg_ip_tos(tcp, cmsg_data, data_len);
5041f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			break;
5051f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		case IP_RECVOPTS:
5061f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		case IP_RETOPTS:
5071f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			print_cmsg_ip_opts(tcp, cmsg_data, data_len);
5081f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			break;
5091f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		case IP_RECVERR:
5101f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			print_cmsg_ip_recverr(tcp, cmsg_data, data_len);
5111f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			break;
5121f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		case IP_ORIGDSTADDR:
5131f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			print_cmsg_ip_origdstaddr(tcp, cmsg_data, data_len);
5141f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			break;
5151f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		case IP_CHECKSUM:
5161f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			print_cmsg_ip_checksum(tcp, cmsg_data, data_len);
5171f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			break;
5181f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		case SCM_SECURITY:
5191f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			print_scm_security(tcp, cmsg_data, data_len);
5201f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin			break;
5211f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		}
5221f111cff5a09e7c78fb4daaf6dada0abe22185c9Dmitry V. Levin		break;
523f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin	default:
524f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin		tprintf("%u", cmsg_type);
525f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin	}
526b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin}
527b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
528b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levinstatic void
529b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levinprintcmsghdr(struct tcb *tcp, unsigned long addr, size_t len)
530b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin{
531b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	const size_t cmsg_size =
53205884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
53305884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin		(current_wordsize < sizeof(long)) ? sizeof(struct cmsghdr32) :
53405884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#endif
53505884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin			sizeof(struct cmsghdr);
53605884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin
537b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	char *buf = len < cmsg_size ? NULL : malloc(len);
538b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	if (!buf || umoven(tcp, addr, len, buf) < 0) {
5396c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		tprints(", msg_control=");
5406c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		printaddr(addr);
541b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		free(buf);
5425077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath		return;
5435077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath	}
5445077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath
545b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	union_cmsghdr u = { .ptr = buf };
546b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
547b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	tprints(", [");
548b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	while (len >= cmsg_size) {
549b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		size_t cmsg_len =
55005884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
551b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			(current_wordsize < sizeof(long)) ? u.cmsg32->cmsg_len :
55205884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#endif
553b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin				u.cmsg->cmsg_len;
554b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		int cmsg_level =
55505884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
556b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			(current_wordsize < sizeof(long)) ? u.cmsg32->cmsg_level :
55705884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#endif
558b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin				u.cmsg->cmsg_level;
559b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		int cmsg_type =
56005884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
561b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			(current_wordsize < sizeof(long)) ? u.cmsg32->cmsg_type :
56205884d866c1d108fbc83bb8161051c156aacfde6Dmitry V. Levin#endif
563b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin				u.cmsg->cmsg_type;
564b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
565b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		if (u.ptr != buf)
566b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			tprints(", ");
567b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		tprintf("{cmsg_len=%lu, cmsg_level=", (unsigned long) cmsg_len);
568b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		printxval(socketlayers, cmsg_level, "SOL_???");
569b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		tprints(", cmsg_type=");
570b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
571b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		if (cmsg_len > len)
572b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			cmsg_len = len;
573b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin
574f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin		print_cmsg_type_data(tcp, cmsg_level, cmsg_type,
5751103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin				     (const void *) (u.ptr + cmsg_size),
5761103b4ee8603fb43b73d468d838ff18cbf1c514fDmitry V. Levin				     cmsg_len > cmsg_size ? cmsg_len - cmsg_size: 0);
577f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin		tprints("}");
578f54cb96f7fdca4e1fa1c371e7874d7bba3bfc0efDmitry V. Levin
579b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		if (cmsg_len < cmsg_size) {
580b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			len -= cmsg_size;
581b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			break;
5825077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath		}
583b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		cmsg_len = (cmsg_len + current_wordsize - 1) &
584b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			(size_t) ~(current_wordsize - 1);
585b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		if (cmsg_len >= len) {
586b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			len = 0;
587b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin			break;
5885077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath		}
589b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		u.ptr += cmsg_len;
590b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		len -= cmsg_len;
5915077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath	}
592b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	if (len)
593b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin		tprints(", ...");
594b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	tprints("]");
595b85a7f3b9525a3b4cd84f301b2c7b100348242feDmitry V. Levin	free(buf);
5965077082649babf6dac0cabf5e2dd53dff4d393d0Roland McGrath}
59776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
59876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanstatic void
599e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenkodo_msghdr(struct tcb *tcp, struct msghdr *msg, unsigned long data_size)
6000873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab{
6010873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	tprintf("{msg_name(%d)=", msg->msg_namelen);
6020873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	printsock(tcp, (long)msg->msg_name, msg->msg_namelen);
6030873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab
6040873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	tprintf(", msg_iov(%lu)=", (unsigned long)msg->msg_iovlen);
605e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko	tprint_iov_upto(tcp, (unsigned long)msg->msg_iovlen,
606e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko		   (unsigned long)msg->msg_iov, 1, data_size);
6070873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab
6080873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
6090873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	tprintf(", msg_controllen=%lu", (unsigned long)msg->msg_controllen);
6100873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	if (msg->msg_controllen)
6110873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab		printcmsghdr(tcp, (unsigned long) msg->msg_control,
6120873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab			     msg->msg_controllen);
61360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints(", msg_flags=");
6140873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	printflags(msg_flags, msg->msg_flags, "MSG_???");
6150873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab#else /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */
6160873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	tprintf("msg_accrights=%#lx, msg_accrightslen=%u",
6170873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab		(unsigned long) msg->msg_accrights, msg->msg_accrightslen);
6180873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab#endif /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */
61960fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints("}");
6200873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab}
6210873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab
6223e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenkostruct msghdr32 {
6233e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	uint32_t /* void* */    msg_name;
6243e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	uint32_t /* socklen_t */msg_namelen;
6253e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	uint32_t /* iovec* */   msg_iov;
6263e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	uint32_t /* size_t */   msg_iovlen;
6273e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	uint32_t /* void* */    msg_control;
6283e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	uint32_t /* size_t */   msg_controllen;
6293e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	uint32_t /* int */      msg_flags;
6303e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko};
6313e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenkostruct mmsghdr32 {
6323e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	struct msghdr32         msg_hdr;
6333e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	uint32_t /* unsigned */ msg_len;
6343e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko};
6353e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko
636caf6a438f9d97684c10da8a6453d1e0e151a9613Masatake YAMATO#ifndef HAVE_STRUCT_MMSGHDR
637caf6a438f9d97684c10da8a6453d1e0e151a9613Masatake YAMATOstruct mmsghdr {
638caf6a438f9d97684c10da8a6453d1e0e151a9613Masatake YAMATO	struct msghdr msg_hdr;
639caf6a438f9d97684c10da8a6453d1e0e151a9613Masatake YAMATO	unsigned msg_len;
640caf6a438f9d97684c10da8a6453d1e0e151a9613Masatake YAMATO};
641caf6a438f9d97684c10da8a6453d1e0e151a9613Masatake YAMATO#endif
642caf6a438f9d97684c10da8a6453d1e0e151a9613Masatake YAMATO
643b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
644b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATOstatic void
645b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATOcopy_from_msghdr32(struct msghdr *to_msg, struct msghdr32 *from_msg32)
646b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO{
647b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO	to_msg->msg_name       = (void*)(long)from_msg32->msg_name;
648b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO	to_msg->msg_namelen    =              from_msg32->msg_namelen;
649b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO	to_msg->msg_iov        = (void*)(long)from_msg32->msg_iov;
650b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO	to_msg->msg_iovlen     =              from_msg32->msg_iovlen;
651b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO	to_msg->msg_control    = (void*)(long)from_msg32->msg_control;
652b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO	to_msg->msg_controllen =              from_msg32->msg_controllen;
653b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO	to_msg->msg_flags      =              from_msg32->msg_flags;
654b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO}
655b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO#endif
656b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO
65702f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATOstatic bool
65802f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATOextractmsghdr(struct tcb *tcp, long addr, struct msghdr *msg)
65976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
6603e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
6613e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	if (current_wordsize == 4) {
6623e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko		struct msghdr32 msg32;
6633e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko
66402f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO		if (umove(tcp, addr, &msg32) < 0)
66502f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO			return false;
666b248543be91457a6c0567a4b057ff0acc361efc2Masatake YAMATO		copy_from_msghdr32(msg, &msg32);
6673e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko	} else
6683e759d4293076b9358a25bb61d50d3e6fff5b0e2Denys Vlasenko#endif
66902f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO	if (umove(tcp, addr, msg) < 0)
67002f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO		return false;
67102f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO	return true;
67202f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO}
67302f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO
674a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATOstatic bool
675a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATOextractmmsghdr(struct tcb *tcp, long addr, unsigned int idx, struct mmsghdr *mmsg)
676a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO{
677a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
678a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	if (current_wordsize == 4) {
679a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		struct mmsghdr32 mmsg32;
680a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO
681a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		addr += sizeof(struct mmsghdr32) * idx;
682a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		if (umove(tcp, addr, &mmsg32) < 0)
683a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO			return false;
684a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO
685a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		copy_from_msghdr32(&mmsg->msg_hdr, &mmsg32.msg_hdr);
686a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		mmsg->msg_len = mmsg32.msg_len;
687a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	} else
688a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO#endif
689a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	{
690a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		addr += sizeof(*mmsg) * idx;
691a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		if (umove(tcp, addr, mmsg) < 0)
692a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO			return false;
693a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	}
694a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	return true;
695a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO}
696a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO
69702f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATOstatic void
69802f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATOprintmsghdr(struct tcb *tcp, long addr, unsigned long data_size)
69902f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO{
70002f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO	struct msghdr msg;
70102f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO
70200244b94bbfc3edd2ca17c83e879154b6f6708d4Dmitry V. Levin	if (verbose(tcp) && extractmsghdr(tcp, addr, &msg))
70302f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO		do_msghdr(tcp, &msg, data_size);
70402f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO	else
7056c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		printaddr(addr);
70602f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO}
70702f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO
70802f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATOvoid
70902f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATOdumpiov_in_msghdr(struct tcb *tcp, long addr)
71002f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO{
71102f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO	struct msghdr msg;
71202f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO
71302f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO	if (extractmsghdr(tcp, addr, &msg))
71402f9f6b386741a52f58e1b31ad4e7fff60781ef8Masatake YAMATO		dumpiov(tcp, msg.msg_iovlen, (long)msg.msg_iov);
7150873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab}
716f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman
7170873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwabstatic void
7185ea97658e78b6ce9fb768ffdd6a4b682c5df8e90Dmitry V. Levinprintmmsghdr(struct tcb *tcp, long addr, unsigned int idx, unsigned long msg_len)
7190873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab{
720caf6a438f9d97684c10da8a6453d1e0e151a9613Masatake YAMATO	struct mmsghdr mmsg;
721f5eeabb156641482abd504fb98b039e1aae4ae87Wichert Akkerman
722a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	if (extractmmsghdr(tcp, addr, idx, &mmsg)) {
723a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		tprints("{");
724a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		do_msghdr(tcp, &mmsg.msg_hdr, msg_len ? msg_len : mmsg.msg_len);
725a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		tprintf(", %u}", mmsg.msg_len);
7260873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	}
727a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	else
7286c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		printaddr(addr);
72976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
73076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
7317af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levinstatic void
7325ea97658e78b6ce9fb768ffdd6a4b682c5df8e90Dmitry V. Levindecode_mmsg(struct tcb *tcp, unsigned long msg_len)
7337af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin{
7347af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	/* mmsgvec */
7357af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	if (syserror(tcp)) {
7366c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		printaddr(tcp->u_arg[1]);
7377af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	} else {
7387af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		unsigned int len = tcp->u_rval;
7397af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		unsigned int i;
7407af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin
7417af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		tprints("{");
7427af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		for (i = 0; i < len; ++i) {
7437af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin			if (i)
7447af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin				tprints(", ");
7455ea97658e78b6ce9fb768ffdd6a4b682c5df8e90Dmitry V. Levin			printmmsghdr(tcp, tcp->u_arg[1], i, msg_len);
7467af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		}
7477af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		tprints("}");
7487af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	}
7497af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	/* vlen */
7507af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	tprintf(", %u, ", (unsigned int) tcp->u_arg[2]);
7517af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	/* flags */
7527af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	printflags(msg_flags, tcp->u_arg[3], "MSG_???");
7537af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin}
7547af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin
755a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATOvoid
756a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATOdumpiov_in_mmsghdr(struct tcb *tcp, long addr)
757a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO{
758a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	unsigned int len = tcp->u_rval;
759a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	unsigned int i;
760a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	struct mmsghdr mmsg;
761a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO
762a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	for (i = 0; i < len; ++i) {
763a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		if (extractmmsghdr(tcp, addr, i, &mmsg)) {
764a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO			tprintf(" = %lu buffers in vector %u\n",
765a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO				(unsigned long)mmsg.msg_hdr.msg_iovlen, i);
766a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO			dumpiov(tcp, mmsg.msg_hdr.msg_iovlen,
767a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO				(long)mmsg.msg_hdr.msg_iov);
768a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO		}
769a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO	}
770a807dceca5ccfaf283aedaca3d998f83db8fe1faMasatake YAMATO}
77176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
7728a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin/*
7738a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin * low bits of the socket type define real socket type,
7748a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin * other bits are socket type flags.
7758a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin */
7768a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levinstatic void
7771e42f2dbe721f7cb1e4bdfc9103bf358b4a443c1Dmitry V. Levintprint_sock_type(int flags)
7788a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin{
7798a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin	const char *str = xlookup(socktypes, flags & SOCK_TYPE_MASK);
7808a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin
7817b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko	if (str) {
7825940e6593911dcace424c668a1c0934c71fccb9eDenys Vlasenko		tprints(str);
7838a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin		flags &= ~SOCK_TYPE_MASK;
7848a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin		if (!flags)
7858a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin			return;
78660fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("|");
7878a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin	}
7888a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin	printflags(sock_type_flags, flags, "SOCK_???");
7898a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin}
7908a550d729d53f963452d10990cd56d1132cb1602Dmitry V. Levin
791a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(socket)
79276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
793219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	printxval(domains, tcp->u_arg[0], "PF_???");
794219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	tprints(", ");
795219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	tprint_sock_type(tcp->u_arg[1]);
796219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	tprints(", ");
797219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	switch (tcp->u_arg[0]) {
798219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	case PF_INET:
7998758e544d502e54202079b0521ae0a234d644a4aRoland McGrath#ifdef PF_INET6
800219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	case PF_INET6:
8018758e544d502e54202079b0521ae0a234d644a4aRoland McGrath#endif
802219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin		printxval(inet_protocols, tcp->u_arg[2], "IPPROTO_???");
803219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin		break;
80476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef PF_IPX
805219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	case PF_IPX:
806219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin		/* BTW: I don't believe this.. */
807219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin		tprints("[");
808219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin		printxval(domains, tcp->u_arg[2], "PF_???");
809219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin		tprints("]");
810219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin		break;
81176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* PF_IPX */
8122394a3d0e5ee5684a42b36218ada2dcf3b4e705fMasatake YAMATO#ifdef PF_NETLINK
813219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	case PF_NETLINK:
814219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin		printxval(netlink_protocols, tcp->u_arg[2], "NETLINK_???");
815219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin		break;
8162394a3d0e5ee5684a42b36218ada2dcf3b4e705fMasatake YAMATO#endif
817c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#if defined(PF_BLUETOOTH) && defined(HAVE_BLUETOOTH_BLUETOOTH_H)
818219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	case PF_BLUETOOTH:
819219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin		printxval(bt_protocols, tcp->u_arg[2], "BTPROTO_???");
820219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin		break;
821c400a1c70ebebde368481c01e85d68e7fd118be6Lubomir Rintel#endif
822219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	default:
823219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin		tprintf("%lu", tcp->u_arg[2]);
824219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin		break;
82576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
826219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin
8273d463be47e84896366a86d156cbf1466f69a9811Dmitry V. Levin	return RVAL_DECODED | RVAL_FD;
82876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
82976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
830a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(bind)
83176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
832219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	printfd(tcp, tcp->u_arg[0]);
833219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	tprints(", ");
834219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	printsock(tcp, tcp->u_arg[1], tcp->u_arg[2]);
835219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	tprintf(", %lu", tcp->u_arg[2]);
836219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin
837219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	return RVAL_DECODED;
83876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
83976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
840a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(listen)
84176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
842219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	printfd(tcp, tcp->u_arg[0]);
843219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	tprints(", ");
844219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	tprintf("%lu", tcp->u_arg[1]);
845219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin
846219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	return RVAL_DECODED;
84776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
84876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
849705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzinistatic int
85015114ec215f889b71fd1f9ed2012b8deeb33a55cDmitry V. Levindo_sockname(struct tcb *tcp, int flags_arg)
85176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
85276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
853894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
854894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
855705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini		return 0;
856705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini	}
8576c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin
8586c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin	int len;
8596c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin	if (!tcp->u_arg[2] || !verbose(tcp) || syserror(tcp) ||
8606c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin	    umove(tcp, tcp->u_arg[2], &len) < 0) {
8616c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		printaddr(tcp->u_arg[1]);
86260fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
8636c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		printaddr(tcp->u_arg[2]);
8646c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin	} else {
8656c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		printsock(tcp, tcp->u_arg[1], len);
8666c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		tprintf(", [%d]", len);
86776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
8686c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin
869705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini	if (flags_arg >= 0) {
87060fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
871705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini		printflags(sock_type_flags, tcp->u_arg[flags_arg],
872705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini			   "SOCK_???");
873705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini	}
87476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
87576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
87676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
877a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(accept)
878705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini{
87915114ec215f889b71fd1f9ed2012b8deeb33a55cDmitry V. Levin	do_sockname(tcp, -1);
88015114ec215f889b71fd1f9ed2012b8deeb33a55cDmitry V. Levin	return RVAL_FD;
881705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini}
882705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini
883a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(accept4)
884705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini{
88515114ec215f889b71fd1f9ed2012b8deeb33a55cDmitry V. Levin	do_sockname(tcp, 3);
88615114ec215f889b71fd1f9ed2012b8deeb33a55cDmitry V. Levin	return RVAL_FD;
887705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini}
888705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9cPaolo Bonzini
889a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(send)
89076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
891219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	printfd(tcp, tcp->u_arg[0]);
892219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	tprints(", ");
893219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
894219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	tprintf(", %lu, ", tcp->u_arg[2]);
895219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	/* flags */
896219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	printflags(msg_flags, tcp->u_arg[3], "MSG_???");
897219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin
898219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	return RVAL_DECODED;
89976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
90076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
901a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(sendto)
90276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
903219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	printfd(tcp, tcp->u_arg[0]);
904219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	tprints(", ");
905219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
906219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	tprintf(", %lu, ", tcp->u_arg[2]);
907219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	/* flags */
908219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	printflags(msg_flags, tcp->u_arg[3], "MSG_???");
909219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	/* to address */
910219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	tprints(", ");
911219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]);
912219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	/* to length */
913219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	tprintf(", %lu", tcp->u_arg[5]);
914219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin
915219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	return RVAL_DECODED;
91676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
91776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
918a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(sendmsg)
91976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
920219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	printfd(tcp, tcp->u_arg[0]);
921219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	tprints(", ");
922219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	printmsghdr(tcp, tcp->u_arg[1], (unsigned long) -1L);
923219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	/* flags */
924219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	tprints(", ");
925219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	printflags(msg_flags, tcp->u_arg[2], "MSG_???");
926219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin
927219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	return RVAL_DECODED;
92876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
92976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
930a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(sendmmsg)
9317af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin{
9327af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	if (entering(tcp)) {
9337af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		/* sockfd */
934894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
935894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
9367af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		if (!verbose(tcp)) {
9377af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin			tprintf("%#lx, %u, ",
9387af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin				tcp->u_arg[1], (unsigned int) tcp->u_arg[2]);
9397af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin			printflags(msg_flags, tcp->u_arg[3], "MSG_???");
9407af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		}
9417af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	} else {
9427af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin		if (verbose(tcp))
9435ea97658e78b6ce9fb768ffdd6a4b682c5df8e90Dmitry V. Levin			decode_mmsg(tcp, (unsigned long) -1L);
9447af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	}
9457af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin	return 0;
9467af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin}
9477af9f35001af19e2844b3e9fb3c672ee696be17bDmitry V. Levin
948a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(recv)
94976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
95076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
951894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
952894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
95376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
95476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp))
9556c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin			printaddr(tcp->u_arg[1]);
95676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else
95776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printstr(tcp, tcp->u_arg[1], tcp->u_rval);
95876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
95976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", %lu, ", tcp->u_arg[2]);
960b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(msg_flags, tcp->u_arg[3], "MSG_???");
96176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
96276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
96376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
96476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
965a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(recvfrom)
96676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
96776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int fromlen;
96876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
96976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
970894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
971894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
97276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
973383386de73799a7c977e729c1e104ba6d6b3630cDenys Vlasenko		/* buf */
97476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp)) {
97552dc1506abc7372c4beebbd185d09501f52c6283Dmitry V. Levin			printaddr(tcp->u_arg[1]);
976383386de73799a7c977e729c1e104ba6d6b3630cDenys Vlasenko		} else {
977383386de73799a7c977e729c1e104ba6d6b3630cDenys Vlasenko			printstr(tcp, tcp->u_arg[1], tcp->u_rval);
97876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
97976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* len */
98076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", %lu, ", tcp->u_arg[2]);
98176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* flags */
982b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(msg_flags, tcp->u_arg[3], "MSG_???");
9836c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		tprints(", ");
98452dc1506abc7372c4beebbd185d09501f52c6283Dmitry V. Levin		if (syserror(tcp) || !tcp->u_arg[4] || !tcp->u_arg[5] ||
9856c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		    umove(tcp, tcp->u_arg[5], &fromlen) < 0) {
986383386de73799a7c977e729c1e104ba6d6b3630cDenys Vlasenko			/* from address, len */
9876c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin			printaddr(tcp->u_arg[4]);
9886c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin			tprints(", ");
9896c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin			printaddr(tcp->u_arg[5]);
99076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
99176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
992383386de73799a7c977e729c1e104ba6d6b3630cDenys Vlasenko		/* from address */
993383386de73799a7c977e729c1e104ba6d6b3630cDenys Vlasenko		printsock(tcp, tcp->u_arg[4], fromlen);
99476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* from length */
99576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", [%u]", fromlen);
99676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
99776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
99876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
99976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
1000a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(recvmsg)
100176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
100276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
1003894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
1004894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
100576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
100600244b94bbfc3edd2ca17c83e879154b6f6708d4Dmitry V. Levin		if (syserror(tcp))
10076c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin			printaddr(tcp->u_arg[1]);
100876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else
1009e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko			printmsghdr(tcp, tcp->u_arg[1], tcp->u_rval);
101076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* flags */
101160fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
1012b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(msg_flags, tcp->u_arg[2], "MSG_???");
101376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
101476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
101576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
101676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
1017a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(recvmmsg)
10180873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab{
10192950de36314b5ea88a3741e24f948113358f7ce2Dmitry V. Levin	static char str[sizeof("left") + TIMESPEC_TEXT_BUFSIZE];
1020e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin
1021a1d541ec56e2fb4716f083fcc814b1dedde63d87Denys Vlasenko	if (entering(tcp)) {
1022894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		printfd(tcp, tcp->u_arg[0]);
1023894c7e3858ede412e37a1752c716bed7f30a9605Philippe Ombredanne		tprints(", ");
1024e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		if (verbose(tcp)) {
1025a1d541ec56e2fb4716f083fcc814b1dedde63d87Denys Vlasenko			/* Abusing tcp->auxstr as temp storage.
10262950de36314b5ea88a3741e24f948113358f7ce2Dmitry V. Levin			 * Will be used and cleared on syscall exit.
1027a1d541ec56e2fb4716f083fcc814b1dedde63d87Denys Vlasenko			 */
10282950de36314b5ea88a3741e24f948113358f7ce2Dmitry V. Levin			tcp->auxstr = sprint_timespec(tcp, tcp->u_arg[4]);
1029e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		} else {
1030e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			tprintf("%#lx, %ld, ", tcp->u_arg[1], tcp->u_arg[2]);
1031e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			printflags(msg_flags, tcp->u_arg[3], "MSG_???");
103260fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints(", ");
1033e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			print_timespec(tcp, tcp->u_arg[4]);
1034e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		}
1035e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		return 0;
1036e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin	} else {
1037e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		if (verbose(tcp)) {
10385ea97658e78b6ce9fb768ffdd6a4b682c5df8e90Dmitry V. Levin			decode_mmsg(tcp, 0);
10392950de36314b5ea88a3741e24f948113358f7ce2Dmitry V. Levin			tprints(", ");
1040e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			/* timeout on entrance */
10412950de36314b5ea88a3741e24f948113358f7ce2Dmitry V. Levin			tprints(tcp->auxstr);
1042e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			tcp->auxstr = NULL;
1043e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		}
1044e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		if (syserror(tcp))
1045e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			return 0;
1046e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		if (tcp->u_rval == 0) {
1047e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			tcp->auxstr = "Timeout";
1048e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			return RVAL_STR;
1049e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		}
1050e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		if (!verbose(tcp))
1051e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin			return 0;
1052e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		/* timeout on exit */
10532950de36314b5ea88a3741e24f948113358f7ce2Dmitry V. Levin		snprintf(str, sizeof(str), "left %s",
10542950de36314b5ea88a3741e24f948113358f7ce2Dmitry V. Levin			 sprint_timespec(tcp, tcp->u_arg[4]));
1055e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		tcp->auxstr = str;
1056e6591031475ace4ac54bb9995f21dd86fa857b1bDmitry V. Levin		return RVAL_STR;
10570873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab	}
10580873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab}
10590873f29af4c1b2357e4f13338731665dd1ee2893Andreas Schwab
10600ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/shutdown_modes.h"
10619cd385010ec1e0d22be70ff5163db194f1f22735Sebastian Pipping
1062a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(shutdown)
106376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
1064219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	printfd(tcp, tcp->u_arg[0]);
1065219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	tprints(", ");
1066219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	printxval(shutdown_modes, tcp->u_arg[1], "SHUT_???");
1067219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin
1068219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	return RVAL_DECODED;
106976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
107076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
1071a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(getsockname)
107276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
107315114ec215f889b71fd1f9ed2012b8deeb33a55cDmitry V. Levin	return do_sockname(tcp, -1);
107476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
107576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
10762a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levinstatic void
10772a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levinprintpair_fd(struct tcb *tcp, const int i0, const int i1)
10782a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin{
10792a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin	tprints("[");
10802a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin	printfd(tcp, i0);
10812a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin	tprints(", ");
10822a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin	printfd(tcp, i1);
10832a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin	tprints("]");
10842a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin}
10852a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin
10862a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levinstatic void
10872a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levindecode_pair_fd(struct tcb *tcp, const long addr)
10882a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin{
10892a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin	int pair[2];
10902a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin
10912a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin	if (umove_or_printaddr(tcp, addr, &pair))
10922a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin		return;
10932a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin
10942a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin	printpair_fd(tcp, pair[0], pair[1]);
10952a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin}
10962a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin
10974371b10b30ceb369942e93105c038519524ba18eDmitry V. Levinstatic int
10984371b10b30ceb369942e93105c038519524ba18eDmitry V. Levindo_pipe(struct tcb *tcp, int flags_arg)
10994371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin{
110076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (exiting(tcp)) {
110176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp)) {
11026c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin			printaddr(tcp->u_arg[0]);
11034371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin		} else {
110478ed3f3558942b7c042aeb84ee0f4a2dccf64791Dmitry V. Levin#ifdef HAVE_GETRVAL2
11052a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin			if (flags_arg < 0) {
11062a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin				printpair_fd(tcp, tcp->u_rval, getrval2(tcp));
11072a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin			} else
110876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
11092a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin				decode_pair_fd(tcp, tcp->u_arg[0]);
11104371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin		}
11114371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin		if (flags_arg >= 0) {
111260fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints(", ");
11134371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin			printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???");
11144371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin		}
11154371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin	}
111676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
111776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
111876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
1119a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(pipe)
11204371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin{
11214371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin	return do_pipe(tcp, -1);
11224371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin}
11234371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin
1124a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(pipe2)
11254371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin{
11264371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin	return do_pipe(tcp, 1);
11274371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin}
11284371b10b30ceb369942e93105c038519524ba18eDmitry V. Levin
1129a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(socketpair)
113076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
113176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
113276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printxval(domains, tcp->u_arg[0], "PF_???");
113360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
11341e42f2dbe721f7cb1e4bdfc9103bf358b4a443c1Dmitry V. Levin		tprint_sock_type(tcp->u_arg[1]);
1135033fb910a291a26d714d277c748683e67903f44cDmitry V. Levin		tprintf(", %lu", tcp->u_arg[2]);
113676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
1137b679508f6ef838a390d807c1bb4696b096543475Dmitry V. Levin		tprints(", ");
11382a4f0521fc34f853c1bd41e5176d01162c161bbfDmitry V. Levin		decode_pair_fd(tcp, tcp->u_arg[3]);
113976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
114076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
114176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
114276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
11436d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#include "xlat/sockoptions.h"
11446d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#include "xlat/sockipoptions.h"
114554646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger#include "xlat/getsockipoptions.h"
114654646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger#include "xlat/setsockipoptions.h"
11476d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#include "xlat/sockipv6options.h"
114854646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger#include "xlat/getsockipv6options.h"
114954646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger#include "xlat/setsockipv6options.h"
11506d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#include "xlat/sockipxoptions.h"
11516d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#include "xlat/sockrawoptions.h"
11526d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#include "xlat/sockpacketoptions.h"
11536d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#include "xlat/socksctpoptions.h"
11546d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#include "xlat/socktcpoptions.h"
11556d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin
11560509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinstatic void
115754646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysingerprint_sockopt_fd_level_name(struct tcb *tcp, int fd, int level, int name, bool is_getsockopt)
115876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
11590509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	printfd(tcp, fd);
11600509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	tprints(", ");
11610509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	printxval(socketlayers, level, "SOL_??");
11620509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	tprints(", ");
11630509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
11640509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	switch (level) {
11650509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_SOCKET:
11660509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		printxval(sockoptions, name, "SO_???");
11670509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		break;
11680509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_IP:
116954646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger		printxvals(name, "IP_???", sockipoptions,
117054646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger			is_getsockopt ? getsockipoptions : setsockipoptions, NULL);
11710509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		break;
11720509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_IPV6:
117354646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger		printxvals(name, "IPV6_???", sockipv6options,
117454646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger			is_getsockopt ? getsockipv6options : setsockipv6options, NULL);
11750509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		break;
11760509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_IPX:
11770509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		printxval(sockipxoptions, name, "IPX_???");
11780509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		break;
11790509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_PACKET:
11800509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		printxval(sockpacketoptions, name, "PACKET_???");
11810509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		break;
11820509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_TCP:
11830509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		printxval(socktcpoptions, name, "TCP_???");
11840509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		break;
11850509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_SCTP:
11860509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		printxval(socksctpoptions, name, "SCTP_???");
11870509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		break;
11880509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_RAW:
11890509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		printxval(sockrawoptions, name, "RAW_???");
11900509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		break;
119176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
11920509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		/* Other SOL_* protocol levels still need work. */
11930509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
11940509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	default:
11950509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		tprintf("%u", name);
11960509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	}
11970509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
11980509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	tprints(", ");
11990509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin}
120093f7fccaa60735509fd75ad22c8a97a8cd52f6bbJohn Hughes
120193f7fccaa60735509fd75ad22c8a97a8cd52f6bbJohn Hughes#ifdef SO_LINGER
12020509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinstatic void
12030509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinprint_linger(struct tcb *tcp, long addr, int len)
12040509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin{
12050509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	struct linger linger;
12060509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
12070509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (len != sizeof(linger) ||
12080509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	    umove(tcp, addr, &linger) < 0) {
12096c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		printaddr(addr);
12100509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		return;
12110509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	}
12120509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
12130509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	tprintf("{onoff=%d, linger=%d}",
12140509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		linger.l_onoff,
12150509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		linger.l_linger);
12160509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin}
12170509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#endif /* SO_LINGER */
12180509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
12190ddd8addef9e9b0c7af00f70b97b3e464205ad1dDmitry V. Levin#ifdef SO_PEERCRED
12200509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinstatic void
12210509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinprint_ucred(struct tcb *tcp, long addr, int len)
12220509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin{
12230509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	struct ucred uc;
12240509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
12250509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (len != sizeof(uc) ||
12260509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	    umove(tcp, addr, &uc) < 0) {
12276c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		printaddr(addr);
12280509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	} else {
12290509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		tprintf("{pid=%u, uid=%u, gid=%u}",
12300509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			(unsigned) uc.pid,
12310509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			(unsigned) uc.uid,
12320509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			(unsigned) uc.gid);
12330509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	}
12340509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin}
12350509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#endif /* SO_PEERCRED */
12360509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
1237ca75bd6dffc01e4d95e85d3af82d446cd80afbb5Dmitry V. Levin#ifdef PACKET_STATISTICS
12380509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinstatic void
12390509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinprint_tpacket_stats(struct tcb *tcp, long addr, int len)
12400509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin{
12410509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	struct tpacket_stats stats;
124293f7fccaa60735509fd75ad22c8a97a8cd52f6bbJohn Hughes
12430509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (len != sizeof(stats) ||
12440509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	    umove(tcp, addr, &stats) < 0) {
12456c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		printaddr(addr);
12460509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	} else {
12470509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		tprintf("{packets=%u, drops=%u}",
12480509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			stats.tp_packets,
12490509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			stats.tp_drops);
125076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
125176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
12520509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#endif /* PACKET_STATISTICS */
125376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
12540509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#ifdef ICMP_FILTER
12556d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# include "xlat/icmpfilterflags.h"
12566d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin
12570509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinstatic void
12580509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinprint_icmp_filter(struct tcb *tcp, long addr, int len)
12597987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman{
12607987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman	struct icmp_filter	filter;
12617987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman
12620509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (len != sizeof(filter) ||
12630509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	    umove(tcp, addr, &filter) < 0) {
12646c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		printaddr(addr);
12657987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman		return;
12667987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman	}
12677987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman
126860fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints("~(");
1269b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath	printflags(icmpfilterflags, ~filter.data, "ICMP_???");
127060fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints(")");
12717987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman}
12727987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman#endif /* ICMP_FILTER */
12737987cdf192632516d6ba493b0a9943f5a3a7c362Wichert Akkerman
12740509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinstatic void
12750509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinprint_getsockopt(struct tcb *tcp, int level, int name, long addr, int len)
127676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
12770509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (addr && verbose(tcp))
127838ae88d332acd9f86a30d58158e306d795d98977John Hughes	switch (level) {
1279989ebc91395600c21b4242aee27df9190b2166b3Denys Vlasenko	case SOL_SOCKET:
128038ae88d332acd9f86a30d58158e306d795d98977John Hughes		switch (name) {
12810509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#ifdef SO_LINGER
1282989ebc91395600c21b4242aee27df9190b2166b3Denys Vlasenko		case SO_LINGER:
12830509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			print_linger(tcp, addr, len);
12840509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			goto done;
12850509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#endif
12860509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#ifdef SO_PEERCRED
12870509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		case SO_PEERCRED:
12880509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			print_ucred(tcp, addr, len);
12890509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			goto done;
129038ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
129138ae88d332acd9f86a30d58158e306d795d98977John Hughes		}
129238ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
12930509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
12940509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_PACKET:
12950509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		switch (name) {
12966d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifdef PACKET_STATISTICS
12970509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		case PACKET_STATISTICS:
12980509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			print_tpacket_stats(tcp, addr, len);
12990509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			goto done;
13006d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
13010509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		}
130238ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
13030509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
13040509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_RAW:
13050509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		switch (name) {
13066d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifdef ICMP_FILTER
13070509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		case ICMP_FILTER:
13080509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			print_icmp_filter(tcp, addr, len);
13090509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			goto done;
13106d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
13110509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		}
13124f6ba69d99a8b6933707abdeb0151f98c28172c9Roland McGrath		break;
13130509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	}
13140509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
13150509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	/* default arg printing */
13160509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
13170509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (verbose(tcp)) {
13180509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		if (len == sizeof(int)) {
13190509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			printnum_int(tcp, addr, "%d");
13200509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		} else {
13210509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			printstr(tcp, addr, len);
13220509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		}
13230509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	} else {
13246c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		printaddr(addr);
13250509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	}
13260509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levindone:
13270509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	tprintf(", [%d]", len);
13280509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin}
13290509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
1330a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(getsockopt)
13310509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin{
13320509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (entering(tcp)) {
13330509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		print_sockopt_fd_level_name(tcp, tcp->u_arg[0],
133454646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger					    tcp->u_arg[1], tcp->u_arg[2], true);
13350509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	} else {
13360509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		int len;
13370509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
13380509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		if (syserror(tcp) || umove(tcp, tcp->u_arg[4], &len) < 0) {
13390509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			tprintf("%#lx, %#lx",
13400509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin				tcp->u_arg[3], tcp->u_arg[4]);
13410509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		} else {
13420509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			print_getsockopt(tcp, tcp->u_arg[1], tcp->u_arg[2],
13430509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin					 tcp->u_arg[3], len);
13440509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		}
13450509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	}
13460509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	return 0;
13470509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin}
13480509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
13497bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin#ifdef IP_ADD_MEMBERSHIP
13507bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levinstatic void
13517bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levinprint_mreq(struct tcb *tcp, long addr, unsigned int len)
13527bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin{
13537bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	struct ip_mreq mreq;
13547bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin
13557bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	if (len < sizeof(mreq)) {
13567bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin		printstr(tcp, addr, len);
13577bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin		return;
13587bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	}
13596c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin	if (umove_or_printaddr(tcp, addr, &mreq))
13607bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin		return;
13616c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin
13627bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	tprints("{imr_multiaddr=inet_addr(");
13637bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	print_quoted_string(inet_ntoa(mreq.imr_multiaddr),
13647bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin			    16, QUOTE_0_TERMINATED);
13657bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	tprints("), imr_interface=inet_addr(");
13667bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	print_quoted_string(inet_ntoa(mreq.imr_interface),
13677bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin			    16, QUOTE_0_TERMINATED);
13687bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	tprints(")}");
13697bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin}
13707bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin#endif /* IP_ADD_MEMBERSHIP */
13717bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin
13727bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin#ifdef IPV6_ADD_MEMBERSHIP
13737bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levinstatic void
13747bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levinprint_mreq6(struct tcb *tcp, long addr, unsigned int len)
13757bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin{
13767bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	struct ipv6_mreq mreq;
13777bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin
13787bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	if (len < sizeof(mreq))
13797bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin		goto fail;
13807bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin
13816c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin	if (umove_or_printaddr(tcp, addr, &mreq))
13827bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin		return;
13837bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin
13847bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin#ifdef HAVE_INET_NTOP
13857bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	const struct in6_addr *in6 = &mreq.ipv6mr_multiaddr;
13867bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	char address[INET6_ADDRSTRLEN];
13877bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin
13887bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	if (!inet_ntop(AF_INET6, in6, address, sizeof(address)))
13897bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin		goto fail;
13907bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin
13917bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	tprints("{ipv6mr_multiaddr=inet_pton(");
13927bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	print_quoted_string(address, sizeof(address), QUOTE_0_TERMINATED);
13937bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	tprints("), ipv6mr_interface=");
13947bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	print_ifindex(mreq.ipv6mr_interface);
13957bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	tprints("}");
13967bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	return;
13977bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin#endif /* HAVE_INET_NTOP */
13987bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin
13997bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levinfail:
14007bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	printstr(tcp, addr, len);
14017bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin}
14027bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin#endif /* IPV6_ADD_MEMBERSHIP */
14037bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin
1404a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin#ifdef MCAST_JOIN_GROUP
1405a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levinstatic void
1406a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levinprint_group_req(struct tcb *tcp, long addr, int len)
1407a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin{
1408a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	struct group_req greq;
1409a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin
1410a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	if (len != sizeof(greq) ||
1411a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	    umove(tcp, addr, &greq) < 0) {
14126c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		printaddr(addr);
1413a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		return;
1414a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	}
1415a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin
14161019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	tprintf("{gr_interface=%u, gr_group=", greq.gr_interface);
14171019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	print_sockaddr(tcp, (const void *) &greq.gr_group,
14181019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin		       sizeof(greq.gr_group));
14191019f002c11a075abbbc195b62617775d5c5e0d0Dmitry V. Levin	tprintf("}");
1420a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin
1421a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin}
1422a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin#endif /* MCAST_JOIN_GROUP */
1423a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin
14240509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#ifdef PACKET_RX_RING
14250509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinstatic void
14260509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinprint_tpacket_req(struct tcb *tcp, long addr, int len)
14270509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin{
14280509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	struct tpacket_req req;
14290509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
14300509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (len != sizeof(req) ||
14310509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	    umove(tcp, addr, &req) < 0) {
14326c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		printaddr(addr);
14330509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	} else {
14340509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		tprintf("{block_size=%u, block_nr=%u, "
14350509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			"frame_size=%u, frame_nr=%u}",
14360509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			req.tp_block_size,
14370509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			req.tp_block_nr,
14380509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			req.tp_frame_size,
14390509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			req.tp_frame_nr);
14400509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	}
14410509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin}
14420509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#endif /* PACKET_RX_RING */
14430509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
144402f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin#ifdef PACKET_ADD_MEMBERSHIP
144502f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin# include "xlat/packet_mreq_type.h"
144602f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin
144702f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levinstatic void
144802f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levinprint_packet_mreq(struct tcb *tcp, long addr, int len)
144902f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin{
145002f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin	struct packet_mreq mreq;
145102f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin
145202f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin	if (len != sizeof(mreq) ||
145302f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin	    umove(tcp, addr, &mreq) < 0) {
14546c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		printaddr(addr);
145502f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin	} else {
145602f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		unsigned int i;
145702f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin
145802f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		tprintf("{mr_ifindex=%u, mr_type=", mreq.mr_ifindex);
145902f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		printxval(packet_mreq_type, mreq.mr_type, "PACKET_MR_???");
146002f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		tprintf(", mr_alen=%u, mr_address=", mreq.mr_alen);
146102f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		if (mreq.mr_alen > ARRAY_SIZE(mreq.mr_address))
146202f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin			mreq.mr_alen = ARRAY_SIZE(mreq.mr_address);
146302f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		for (i = 0; i < mreq.mr_alen; ++i)
146402f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin			tprintf("%02x", mreq.mr_address[i]);
146502f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		tprints("}");
146602f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin	}
146702f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin}
146802f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin#endif /* PACKET_ADD_MEMBERSHIP */
146902f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin
14700509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinstatic void
14710509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levinprint_setsockopt(struct tcb *tcp, int level, int name, long addr, int len)
14720509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin{
14730509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (addr && verbose(tcp))
14740509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	switch (level) {
14750509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	case SOL_SOCKET:
14760509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		switch (name) {
14770509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin#ifdef SO_LINGER
14780509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		case SO_LINGER:
14790509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			print_linger(tcp, addr, len);
14800509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			goto done;
14814f6ba69d99a8b6933707abdeb0151f98c28172c9Roland McGrath#endif
14820509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		}
148338ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
14840509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
1485a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin	case SOL_IP:
1486a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		switch (name) {
14877bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin#ifdef IP_ADD_MEMBERSHIP
14887bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin		case IP_ADD_MEMBERSHIP:
14897bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin		case IP_DROP_MEMBERSHIP:
14907bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin			print_mreq(tcp, addr, len);
14917bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin			goto done;
14927bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin#endif /* IP_ADD_MEMBERSHIP */
1493a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin#ifdef MCAST_JOIN_GROUP
1494a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		case MCAST_JOIN_GROUP:
1495a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		case MCAST_LEAVE_GROUP:
1496a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin			print_group_req(tcp, addr, len);
1497a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin			goto done;
1498a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin#endif /* MCAST_JOIN_GROUP */
1499a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin		}
15003910d0f67caccf421c72a19026d89115000ebefdDmitry V. Levin		break;
15017bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin
15027bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin	case SOL_IPV6:
15037bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin		switch (name) {
15047bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin#ifdef IPV6_ADD_MEMBERSHIP
15057bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin		case IPV6_ADD_MEMBERSHIP:
15067bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin		case IPV6_DROP_MEMBERSHIP:
15077bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin# ifdef IPV6_JOIN_ANYCAST
15087bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin		case IPV6_JOIN_ANYCAST:
15097bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin# endif
15107bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin# ifdef IPV6_LEAVE_ANYCAST
15117bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin		case IPV6_LEAVE_ANYCAST:
15127bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin# endif
15137bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin			print_mreq6(tcp, addr, len);
15147bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin			goto done;
15157bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin#endif /* IPV6_ADD_MEMBERSHIP */
15167bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin		}
15177bee462a645a69e042c7262317f40c77d1516d95Dmitry V. Levin		break;
1518a0a4909988f9a5db1427dbf7a5ef4efbfb3e8125Dmitry V. Levin
1519989ebc91395600c21b4242aee27df9190b2166b3Denys Vlasenko	case SOL_PACKET:
1520ca75bd6dffc01e4d95e85d3af82d446cd80afbb5Dmitry V. Levin		switch (name) {
15216d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifdef PACKET_RX_RING
1522989ebc91395600c21b4242aee27df9190b2166b3Denys Vlasenko		case PACKET_RX_RING:
15236d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# ifdef PACKET_TX_RING
1524989ebc91395600c21b4242aee27df9190b2166b3Denys Vlasenko		case PACKET_TX_RING:
15256d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin# endif
15260509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			print_tpacket_req(tcp, addr, len);
15270509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			goto done;
15286d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif /* PACKET_RX_RING */
15296d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifdef PACKET_ADD_MEMBERSHIP
153002f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		case PACKET_ADD_MEMBERSHIP:
153102f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin		case PACKET_DROP_MEMBERSHIP:
153202f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin			print_packet_mreq(tcp, addr, len);
153302f2f091d58023912ad8814c960cf6c8bc3d0574Dmitry V. Levin			goto done;
15346d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif /* PACKET_ADD_MEMBERSHIP */
1535ca75bd6dffc01e4d95e85d3af82d446cd80afbb5Dmitry V. Levin		}
153638ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
15370509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin
1538989ebc91395600c21b4242aee27df9190b2166b3Denys Vlasenko	case SOL_RAW:
153938ae88d332acd9f86a30d58158e306d795d98977John Hughes		switch (name) {
15406d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#ifdef ICMP_FILTER
15410509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		case ICMP_FILTER:
15420509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			print_icmp_filter(tcp, addr, len);
15430509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			goto done;
15446d31c7a6a974472cf32579dbd61554b45a5fbd0eDmitry V. Levin#endif
154538ae88d332acd9f86a30d58158e306d795d98977John Hughes		}
154638ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
154738ae88d332acd9f86a30d58158e306d795d98977John Hughes	}
154893f7fccaa60735509fd75ad22c8a97a8cd52f6bbJohn Hughes
154938ae88d332acd9f86a30d58158e306d795d98977John Hughes	/* default arg printing */
155093f7fccaa60735509fd75ad22c8a97a8cd52f6bbJohn Hughes
15510509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	if (verbose(tcp)) {
15520509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		if (len == sizeof(int)) {
15530509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			printnum_int(tcp, addr, "%d");
15540509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		} else {
15550509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin			printstr(tcp, addr, len);
15560509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin		}
15570509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	} else {
15586c277da20558fcae086c7a7a26cd63f4e553a84dDmitry V. Levin		printaddr(addr);
155938ae88d332acd9f86a30d58158e306d795d98977John Hughes	}
15600509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levindone:
15610509c8ed6db16c10d26801e6be8acc923eba2a32Dmitry V. Levin	tprintf(", %d", len);
156238ae88d332acd9f86a30d58158e306d795d98977John Hughes}
156338ae88d332acd9f86a30d58158e306d795d98977John Hughes
1564a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(setsockopt)
156538ae88d332acd9f86a30d58158e306d795d98977John Hughes{
1566219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	print_sockopt_fd_level_name(tcp, tcp->u_arg[0],
156754646b8e057443f0b76afe9a231eae63afbf5d5aMike Frysinger				    tcp->u_arg[1], tcp->u_arg[2], false);
1568219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	print_setsockopt(tcp, tcp->u_arg[1], tcp->u_arg[2],
1569219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin			 tcp->u_arg[3], tcp->u_arg[4]);
1570219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin
1571219b3a79b48f86168564773711d5954ae70fdf39Dmitry V. Levin	return RVAL_DECODED;
157276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
1573