1999-02-19 03:21:36 +03:00
/*
* Copyright ( c ) 1991 , 1992 Paul Kranenburg < pk @ cs . few . eur . nl >
* Copyright ( c ) 1993 Branko Lankester < branko @ hacktic . nl >
* Copyright ( c ) 1993 , 1994 , 1995 , 1996 Rick Sladkey < jrs @ world . std . com >
2000-07-05 20:05:39 +04:00
* Copyright ( c ) 1996 - 2000 Wichert Akkerman < wichert @ cistron . nl >
1999-02-19 03:21:36 +03:00
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ` ` AS IS ' ' AND ANY EXPRESS OR
* IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED .
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
* NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
# include "defs.h"
# include <sys/stat.h>
# include <sys/socket.h>
2014-11-21 23:46:16 +03:00
# include <sys/uio.h>
1999-02-19 03:21:36 +03:00
# include <sys/un.h>
# include <netinet/in.h>
2001-02-16 22:59:55 +03:00
# ifdef HAVE_NETINET_TCP_H
2012-03-16 15:02:22 +04:00
# include <netinet / tcp.h>
2000-09-02 01:03:06 +04:00
# endif
2001-02-16 22:59:55 +03:00
# ifdef HAVE_NETINET_UDP_H
2012-03-16 15:02:22 +04:00
# include <netinet / udp.h>
2001-02-16 22:59:55 +03:00
# endif
2011-01-14 13:08:12 +03:00
# ifdef HAVE_NETINET_SCTP_H
2012-03-16 15:02:22 +04:00
# include <netinet / sctp.h>
2011-01-14 13:08:12 +03:00
# endif
1999-02-19 03:21:36 +03:00
# include <arpa/inet.h>
2001-02-16 23:29:03 +03:00
# include <net/if.h>
1999-02-19 03:21:36 +03:00
# include <asm/types.h>
2013-02-08 21:49:06 +04:00
# if defined(__GLIBC__)
2012-03-16 15:02:22 +04:00
# include <netipx / ipx.h>
1999-02-19 03:21:36 +03:00
# else
2012-03-16 15:02:22 +04:00
# include <linux / ipx.h>
1999-02-19 03:21:36 +03:00
# endif
decode extend getsockopt/setsockopt options
Currently the code assumes the set of valid options between getsockopt
and setsockopt are exactly the same and thus maintains one list. The
kernel unfortunately does not do this -- it allows for different opts
between the get and set functions. See the {g,s}et_opt{min,max} fields
in the various netfilter subcores.
To support this, extend the printxval function to take multiple sets of
xlats as varargs. Then we add the new get/set lists, and pass them down
in the net code when decoding things.
A simple example is iptables; before:
getsockopt(4, SOL_IP, 0x40 /* IP_??? */, ...) = 0
getsockopt(4, SOL_IP, 0x41 /* IP_??? */, ...) = 0
after:
getsockopt(4, SOL_IP, IPT_SO_GET_INFO, ...) = 0
getsockopt(4, SOL_IP, IPT_SO_GET_ENTRIES, ...) = 0
If these were setsockopt calls, then 0x40 & 0x41 would be
IPT_SO_SET_REPLACE & IPT_SO_SET_ADD_COUNTERS.
* configure.ac: Check for netfilter headers.
* defs.h (printxvals): New prototype.
(printxval): Change to a define.
* net.c: Include netfilter headers and new sockopts headers.
(print_sockopt_fd_level_name): Add a is_getsockopt argument. Change SOL_IP
and SOL_IPV6 decoding to use printxvals, and use is_getsockopt to pass more
xlats down.
(getsockopt): Call print_sockopt_fd_level_name with is_getsockopt as true.
(setsockopt): Call print_sockopt_fd_level_name with is_getsockopt as false.
* util.c (printxval): Rename to ...
(printxvals): ... this. Rewrite to be varargs based.
* xlat/getsockipoptions.in: New xlat list.
* xlat/getsockipv6options.in, xlat/setsockipoptions.in,
xlat/setsockipv6options.in: Likewise.
2015-08-19 20:29:27 +03:00
# if defined(HAVE_LINUX_IP_VS_H)
# include <linux / ip_vs.h>
# endif
2016-06-14 16:53:47 +03:00
# include <linux/netlink.h>
decode extend getsockopt/setsockopt options
Currently the code assumes the set of valid options between getsockopt
and setsockopt are exactly the same and thus maintains one list. The
kernel unfortunately does not do this -- it allows for different opts
between the get and set functions. See the {g,s}et_opt{min,max} fields
in the various netfilter subcores.
To support this, extend the printxval function to take multiple sets of
xlats as varargs. Then we add the new get/set lists, and pass them down
in the net code when decoding things.
A simple example is iptables; before:
getsockopt(4, SOL_IP, 0x40 /* IP_??? */, ...) = 0
getsockopt(4, SOL_IP, 0x41 /* IP_??? */, ...) = 0
after:
getsockopt(4, SOL_IP, IPT_SO_GET_INFO, ...) = 0
getsockopt(4, SOL_IP, IPT_SO_GET_ENTRIES, ...) = 0
If these were setsockopt calls, then 0x40 & 0x41 would be
IPT_SO_SET_REPLACE & IPT_SO_SET_ADD_COUNTERS.
* configure.ac: Check for netfilter headers.
* defs.h (printxvals): New prototype.
(printxval): Change to a define.
* net.c: Include netfilter headers and new sockopts headers.
(print_sockopt_fd_level_name): Add a is_getsockopt argument. Change SOL_IP
and SOL_IPV6 decoding to use printxvals, and use is_getsockopt to pass more
xlats down.
(getsockopt): Call print_sockopt_fd_level_name with is_getsockopt as true.
(setsockopt): Call print_sockopt_fd_level_name with is_getsockopt as false.
* util.c (printxval): Rename to ...
(printxvals): ... this. Rewrite to be varargs based.
* xlat/getsockipoptions.in: New xlat list.
* xlat/getsockipv6options.in, xlat/setsockipoptions.in,
xlat/setsockipv6options.in: Likewise.
2015-08-19 20:29:27 +03:00
# if defined(HAVE_LINUX_NETFILTER_ARP_ARP_TABLES_H)
# include <linux / netfilter_arp / arp_tables.h>
# endif
# if defined(HAVE_LINUX_NETFILTER_BRIDGE_EBTABLES_H)
# include <linux / netfilter_bridge / ebtables.h>
# endif
# if defined(HAVE_LINUX_NETFILTER_IPV4_IP_TABLES_H)
# include <linux / netfilter_ipv4 / ip_tables.h>
# endif
# if defined(HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H)
# include <linux / netfilter_ipv6 / ip6_tables.h>
# endif
2016-06-16 00:35:48 +03:00
# include <linux/if_packet.h>
2016-06-16 00:27:41 +03:00
# include <linux/icmp.h>
2014-10-03 13:40:28 +04:00
# ifdef HAVE_BLUETOOTH_BLUETOOTH_H
# include <bluetooth / bluetooth.h>
# include <bluetooth / hci.h>
# include <bluetooth / l2cap.h>
# include <bluetooth / rfcomm.h>
# include <bluetooth / sco.h>
# endif
1999-02-19 03:21:36 +03:00
2014-04-26 03:30:54 +04:00
# include "xlat/addrfams.h"
# include "xlat/socktypes.h"
# include "xlat/sock_type_flags.h"
2008-11-10 20:21:23 +03:00
# ifndef SOCK_TYPE_MASK
# define SOCK_TYPE_MASK 0xf
# endif
2015-01-29 07:42:37 +03:00
2014-04-26 03:30:54 +04:00
# include "xlat/socketlayers.h"
2015-01-29 07:42:37 +03:00
2014-04-26 03:30:54 +04:00
# include "xlat/inet_protocols.h"
2014-03-11 18:37:37 +04:00
2016-06-14 16:53:47 +03:00
# if !defined NETLINK_SOCK_DIAG && defined NETLINK_INET_DIAG
# define NETLINK_SOCK_DIAG NETLINK_INET_DIAG
2014-03-11 18:37:37 +04:00
# endif
2016-06-14 16:53:47 +03:00
# include "xlat/netlink_protocols.h"
2014-03-11 18:37:37 +04:00
2014-10-03 13:40:28 +04:00
# if defined(HAVE_BLUETOOTH_BLUETOOTH_H)
# include "xlat / bt_protocols.h"
# endif
2014-04-26 03:30:54 +04:00
# include "xlat/msg_flags.h"
2000-07-05 20:05:39 +04:00
2016-06-16 00:42:30 +03:00
# include "xlat/af_packet_types.h"
2002-04-01 16:48:06 +04:00
2015-06-05 23:13:21 +03:00
static void
print_ifindex ( unsigned int ifindex )
{
# ifdef HAVE_IF_INDEXTONAME
char buf [ IFNAMSIZ + 1 ] ;
if ( if_indextoname ( ifindex , buf ) ) {
tprints ( " if_nametoindex( " ) ;
print_quoted_string ( buf , sizeof ( buf ) , QUOTE_0_TERMINATED ) ;
tprints ( " ) " ) ;
return ;
}
# endif
tprintf ( " %u " , ifindex ) ;
}
2015-11-21 05:38:59 +03:00
typedef union {
char pad [ 128 ] ;
struct sockaddr sa ;
struct sockaddr_in sin ;
struct sockaddr_un sau ;
1999-08-30 03:15:07 +04:00
# ifdef HAVE_INET_NTOP
2015-11-21 05:38:59 +03:00
struct sockaddr_in6 sa6 ;
1999-08-30 03:15:07 +04:00
# endif
2012-02-25 05:38:52 +04:00
# if defined(AF_IPX)
2015-11-21 05:38:59 +03:00
struct sockaddr_ipx sipx ;
1999-11-18 20:09:47 +03:00
# endif
2015-11-21 05:38:59 +03:00
struct sockaddr_ll ll ;
struct sockaddr_nl nl ;
2014-10-03 13:40:28 +04:00
# ifdef HAVE_BLUETOOTH_BLUETOOTH_H
2015-11-21 05:38:59 +03:00
struct sockaddr_hci hci ;
struct sockaddr_l2 l2 ;
struct sockaddr_rc rc ;
struct sockaddr_sco sco ;
1999-11-18 20:09:47 +03:00
# endif
2015-11-21 05:38:59 +03:00
} sockaddr_buf_t ;
1999-11-18 20:09:47 +03:00
2015-11-21 05:38:59 +03:00
static void
print_sockaddr ( struct tcb * tcp , const sockaddr_buf_t * addr , const int addrlen )
{
2011-09-01 12:00:28 +04:00
tprints ( " {sa_family= " ) ;
2015-11-21 05:38:59 +03:00
printxval ( addrfams , addr - > sa . sa_family , " AF_??? " ) ;
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
1999-11-18 20:09:47 +03:00
2015-11-21 05:38:59 +03:00
switch ( addr - > sa . sa_family ) {
1999-02-19 03:21:36 +03:00
case AF_UNIX :
2007-10-09 03:31:19 +04:00
if ( addrlen = = 2 ) {
2011-09-01 12:00:28 +04:00
tprints ( " NULL " ) ;
2015-11-21 05:38:59 +03:00
} else if ( addr - > sau . sun_path [ 0 ] ) {
2012-02-22 04:23:52 +04:00
tprints ( " sun_path= " ) ;
2015-11-21 05:38:59 +03:00
print_quoted_string ( addr - > sau . sun_path ,
sizeof ( addr - > sau . sun_path ) + 1 ,
2015-01-29 10:34:40 +03:00
QUOTE_0_TERMINATED ) ;
1999-11-18 20:09:47 +03:00
} else {
2012-02-22 04:23:52 +04:00
tprints ( " sun_path=@ " ) ;
2015-11-21 05:38:59 +03:00
print_quoted_string ( addr - > sau . sun_path + 1 ,
sizeof ( addr - > sau . sun_path ) ,
2015-01-29 10:34:40 +03:00
QUOTE_0_TERMINATED ) ;
1999-11-18 20:09:47 +03:00
}
1999-02-19 03:21:36 +03:00
break ;
case AF_INET :
2001-09-18 19:56:53 +04:00
tprintf ( " sin_port=htons(%u), sin_addr=inet_addr( \" %s \" ) " ,
2015-11-21 05:38:59 +03:00
ntohs ( addr - > sin . sin_port ) , inet_ntoa ( addr - > sin . sin_addr ) ) ;
1999-02-19 03:21:36 +03:00
break ;
1999-08-30 03:15:07 +04:00
# ifdef HAVE_INET_NTOP
case AF_INET6 :
2015-11-21 05:38:59 +03:00
{
char string_addr [ 100 ] ;
inet_ntop ( AF_INET6 , & addr - > sa6 . sin6_addr ,
string_addr , sizeof ( string_addr ) ) ;
tprintf ( " sin6_port=htons(%u), inet_pton(AF_INET6 "
" , \" %s \" , &sin6_addr), sin6_flowinfo=%u " ,
ntohs ( addr - > sa6 . sin6_port ) , string_addr ,
addr - > sa6 . sin6_flowinfo ) ;
# ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
tprints ( " , sin6_scope_id= " ) ;
# if defined IN6_IS_ADDR_LINKLOCAL && defined IN6_IS_ADDR_MC_LINKLOCAL
if ( IN6_IS_ADDR_LINKLOCAL ( & addr - > sa6 . sin6_addr )
| | IN6_IS_ADDR_MC_LINKLOCAL ( & addr - > sa6 . sin6_addr ) )
print_ifindex ( addr - > sa6 . sin6_scope_id ) ;
else
# endif
tprintf ( " %u " , addr - > sa6 . sin6_scope_id ) ;
# endif /* HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID */
}
2011-06-07 14:13:24 +04:00
break ;
1999-08-30 03:15:07 +04:00
# endif
2012-02-25 05:38:52 +04:00
# if defined(AF_IPX)
1999-02-19 03:21:36 +03:00
case AF_IPX :
1999-11-18 20:09:47 +03:00
{
1999-02-19 03:21:36 +03:00
int i ;
2001-09-18 19:56:53 +04:00
tprintf ( " sipx_port=htons(%u), " ,
2015-11-21 05:38:59 +03:00
ntohs ( addr - > sipx . sipx_port ) ) ;
1999-02-19 03:21:36 +03:00
/* Yes, I know, this does not look too
* strace - ish , but otherwise the IPX
* addresses just look monstrous . . .
* Anyways , feel free if you don ' t like
2002-12-30 03:51:30 +03:00
* this way . . : )
1999-02-19 03:21:36 +03:00
*/
2015-11-21 05:38:59 +03:00
tprintf ( " %08lx: " , ( unsigned long ) ntohl ( addr - > sipx . sipx_network ) ) ;
2011-06-07 14:13:24 +04:00
for ( i = 0 ; i < IPX_NODE_LEN ; i + + )
2015-11-21 05:38:59 +03:00
tprintf ( " %02x " , addr - > sipx . sipx_node [ i ] ) ;
tprintf ( " /[%02x] " , addr - > sipx . sipx_type ) ;
1999-11-18 20:09:47 +03:00
}
break ;
2012-02-25 05:38:52 +04:00
# endif /* AF_IPX */
1999-11-18 20:09:47 +03:00
case AF_PACKET :
{
int i ;
2002-04-01 16:48:06 +04:00
tprintf ( " proto=%#04x, if%d, pkttype= " ,
2015-11-21 05:38:59 +03:00
ntohs ( addr - > ll . sll_protocol ) ,
addr - > ll . sll_ifindex ) ;
printxval ( af_packet_types , addr - > ll . sll_pkttype , " PACKET_??? " ) ;
2002-04-01 16:48:06 +04:00
tprintf ( " , addr(%d)={%d, " ,
2015-11-21 05:38:59 +03:00
addr - > ll . sll_halen ,
addr - > ll . sll_hatype ) ;
for ( i = 0 ; i < addr - > ll . sll_halen ; i + + )
tprintf ( " %02x " , addr - > ll . sll_addr [ i ] ) ;
1999-02-19 03:21:36 +03:00
}
break ;
1999-11-18 20:09:47 +03:00
case AF_NETLINK :
2015-11-21 05:38:59 +03:00
tprintf ( " pid=%d, groups=%08x " , addr - > nl . nl_pid , addr - > nl . nl_groups ) ;
1999-11-18 20:09:47 +03:00
break ;
2014-10-03 13:40:28 +04:00
# if defined(AF_BLUETOOTH) && defined(HAVE_BLUETOOTH_BLUETOOTH_H)
case AF_BLUETOOTH :
tprintf ( " {sco_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X} or "
" {rc_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X, rc_channel=%d} or "
" {l2_psm=htobs(%d), l2_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X, l2_cid=htobs(%d)} or "
" {hci_dev=htobs(%d)} " ,
2015-11-21 05:38:59 +03:00
addr - > sco . sco_bdaddr . b [ 0 ] , addr - > sco . sco_bdaddr . b [ 1 ] ,
addr - > sco . sco_bdaddr . b [ 2 ] , addr - > sco . sco_bdaddr . b [ 3 ] ,
addr - > sco . sco_bdaddr . b [ 4 ] , addr - > sco . sco_bdaddr . b [ 5 ] ,
addr - > rc . rc_bdaddr . b [ 0 ] , addr - > rc . rc_bdaddr . b [ 1 ] ,
addr - > rc . rc_bdaddr . b [ 2 ] , addr - > rc . rc_bdaddr . b [ 3 ] ,
addr - > rc . rc_bdaddr . b [ 4 ] , addr - > rc . rc_bdaddr . b [ 5 ] ,
addr - > rc . rc_channel ,
btohs ( addr - > l2 . l2_psm ) , addr - > l2 . l2_bdaddr . b [ 0 ] ,
addr - > l2 . l2_bdaddr . b [ 1 ] , addr - > l2 . l2_bdaddr . b [ 2 ] ,
addr - > l2 . l2_bdaddr . b [ 3 ] , addr - > l2 . l2_bdaddr . b [ 4 ] ,
addr - > l2 . l2_bdaddr . b [ 5 ] , btohs ( addr - > l2 . l2_cid ) ,
btohs ( addr - > hci . hci_dev ) ) ;
2014-10-03 13:40:28 +04:00
break ;
# endif /* AF_BLUETOOTH && HAVE_BLUETOOTH_BLUETOOTH_H */
1999-02-19 03:21:36 +03:00
/* AF_AX25 AF_APPLETALK AF_NETROM AF_BRIDGE AF_AAL5
1999-11-18 20:09:47 +03:00
AF_X25 AF_ROSE etc . still need to be done */
1999-02-19 03:21:36 +03:00
default :
2011-09-01 12:00:28 +04:00
tprints ( " sa_data= " ) ;
2015-11-21 05:38:59 +03:00
print_quoted_string ( addr - > sa . sa_data ,
sizeof ( addr - > sa . sa_data ) , 0 ) ;
1999-02-19 03:21:36 +03:00
break ;
}
2011-09-01 12:00:28 +04:00
tprints ( " } " ) ;
1999-02-19 03:21:36 +03:00
}
2015-11-21 05:38:59 +03:00
void
printsock ( struct tcb * tcp , long addr , int addrlen )
{
sockaddr_buf_t addrbuf ;
if ( addrlen < 2 ) {
printaddr ( addr ) ;
return ;
}
if ( addrlen > ( int ) sizeof ( addrbuf ) )
addrlen = sizeof ( addrbuf ) ;
memset ( & addrbuf , 0 , sizeof ( addrbuf ) ) ;
if ( umoven_or_printaddr ( tcp , addr , addrlen , addrbuf . pad ) )
return ;
addrbuf . pad [ sizeof ( addrbuf . pad ) - 1 ] = ' \0 ' ;
print_sockaddr ( tcp , & addrbuf , addrlen ) ;
}
2015-11-19 02:18:17 +03:00
# include "xlat/scmvals.h"
Implement IPPROTO_IP control messages decoding
* net.c: Include "xlat/ip_cmsg_types.h".
(print_cmsg_ip_pktinfo, print_cmsg_ip_ttl, print_cmsg_ip_tos,
print_cmsg_ip_opts, print_cmsg_ip_recverr, print_cmsg_ip_checksum,
print_cmsg_ip_origdstaddr): New functions.
(print_cmsg_type_data): Add generic SOL_IP level decoding.
Use these functions for decoding of IP_PKTINFO, IP_TTL, IP_TOS,
IP_RECVOPTS, IP_RETOPTS, IP_RECVERR, IP_ORIGDSTADDR, IP_CHECKSUM,
and SCM_SECURITY type messages.
* xlat/ip_cmsg_types.in: New file.
* xlat/sockipoptions.in: Move IP_RETOPTS before IP_RECVRETOPTS.
* tests/inet-cmsg.c: New file.
* tests/inet-cmsg.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add inet-cmsg.
(TESTS): Add inet-cmsg.test.
* tests/.gitignore: Add inet-cmsg.
Suggested-by: Orion Poplawski <orion@cora.nwra.com>
2015-11-21 03:03:54 +03:00
# include "xlat/ip_cmsg_types.h"
2004-10-07 02:11:51 +04:00
2015-01-24 04:08:57 +03:00
# if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
struct cmsghdr32 {
uint32_t cmsg_len ;
int cmsg_level ;
int cmsg_type ;
} ;
# endif
typedef union {
2015-01-24 18:20:31 +03:00
char * ptr ;
2015-01-24 04:08:57 +03:00
struct cmsghdr * cmsg ;
# if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
struct cmsghdr32 * cmsg32 ;
# endif
} union_cmsghdr ;
2015-11-19 03:29:19 +03:00
static void
2015-11-21 06:59:09 +03:00
print_scm_rights ( struct tcb * tcp , const void * cmsg_data ,
const size_t data_len )
2004-10-07 02:11:51 +04:00
{
2015-11-21 06:59:09 +03:00
const int * fds = cmsg_data ;
const char * end = ( const char * ) cmsg_data + data_len ;
2015-01-24 18:20:31 +03:00
bool seen = false ;
2015-11-21 06:59:09 +03:00
if ( sizeof ( * fds ) > data_len )
return ;
2015-01-24 18:20:31 +03:00
tprints ( " , [ " ) ;
2015-11-21 06:59:09 +03:00
while ( ( const char * ) fds < end ) {
2015-01-24 18:20:31 +03:00
if ( seen )
tprints ( " , " ) ;
else
seen = true ;
printfd ( tcp , * fds + + ) ;
}
2015-11-19 03:29:19 +03:00
tprints ( " ] " ) ;
2015-01-24 18:20:31 +03:00
}
2015-11-19 03:29:19 +03:00
static void
2015-11-21 06:59:09 +03:00
print_scm_creds ( struct tcb * tcp , const void * cmsg_data ,
const size_t data_len )
2015-01-24 18:20:31 +03:00
{
2015-11-21 06:59:09 +03:00
const struct ucred * uc = cmsg_data ;
2015-01-24 18:20:31 +03:00
2015-11-21 06:59:09 +03:00
if ( sizeof ( * uc ) > data_len )
return ;
2015-01-24 18:20:31 +03:00
2015-11-19 03:29:19 +03:00
tprintf ( " , {pid=%u, uid=%u, gid=%u} " ,
2015-01-24 18:20:31 +03:00
( unsigned ) uc - > pid , ( unsigned ) uc - > uid , ( unsigned ) uc - > gid ) ;
}
2015-11-19 03:29:19 +03:00
static void
2015-11-21 06:59:09 +03:00
print_scm_security ( struct tcb * tcp , const void * cmsg_data ,
const size_t data_len )
2015-01-24 18:20:31 +03:00
{
2015-11-21 06:59:09 +03:00
if ( ! data_len )
2015-11-19 03:29:19 +03:00
return ;
2015-01-24 18:20:31 +03:00
2015-01-26 04:17:08 +03:00
tprints ( " , " ) ;
2015-11-21 06:59:09 +03:00
print_quoted_string ( cmsg_data , data_len , 0 ) ;
2015-11-19 03:29:19 +03:00
}
2015-01-24 18:20:31 +03:00
Implement IPPROTO_IP control messages decoding
* net.c: Include "xlat/ip_cmsg_types.h".
(print_cmsg_ip_pktinfo, print_cmsg_ip_ttl, print_cmsg_ip_tos,
print_cmsg_ip_opts, print_cmsg_ip_recverr, print_cmsg_ip_checksum,
print_cmsg_ip_origdstaddr): New functions.
(print_cmsg_type_data): Add generic SOL_IP level decoding.
Use these functions for decoding of IP_PKTINFO, IP_TTL, IP_TOS,
IP_RECVOPTS, IP_RETOPTS, IP_RECVERR, IP_ORIGDSTADDR, IP_CHECKSUM,
and SCM_SECURITY type messages.
* xlat/ip_cmsg_types.in: New file.
* xlat/sockipoptions.in: Move IP_RETOPTS before IP_RECVRETOPTS.
* tests/inet-cmsg.c: New file.
* tests/inet-cmsg.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add inet-cmsg.
(TESTS): Add inet-cmsg.test.
* tests/.gitignore: Add inet-cmsg.
Suggested-by: Orion Poplawski <orion@cora.nwra.com>
2015-11-21 03:03:54 +03:00
static void
print_cmsg_ip_pktinfo ( struct tcb * tcp , const void * cmsg_data ,
const size_t data_len )
{
const struct in_pktinfo * info = cmsg_data ;
if ( sizeof ( * info ) > data_len )
return ;
tprints ( " , {ipi_ifindex= " ) ;
print_ifindex ( info - > ipi_ifindex ) ;
tprintf ( " , ipi_spec_dst=inet_addr( \" %s \" ), ipi_addr=inet_addr( \" %s \" )} " ,
inet_ntoa ( info - > ipi_spec_dst ) , inet_ntoa ( info - > ipi_addr ) ) ;
}
static void
print_cmsg_ip_ttl ( struct tcb * tcp , const void * cmsg_data ,
const size_t data_len )
{
const unsigned int * ttl = cmsg_data ;
if ( sizeof ( * ttl ) > data_len )
return ;
tprintf ( " , {ttl=%u} " , * ttl ) ;
}
static void
print_cmsg_ip_tos ( struct tcb * tcp , const void * cmsg_data ,
const size_t data_len )
{
const uint8_t * tos = cmsg_data ;
if ( sizeof ( * tos ) > data_len )
return ;
tprintf ( " , {tos=%x} " , * tos ) ;
}
static void
print_cmsg_ip_checksum ( struct tcb * tcp , const void * cmsg_data ,
const size_t data_len )
{
const uint32_t * csum = cmsg_data ;
if ( sizeof ( * csum ) > data_len )
return ;
tprintf ( " , {csum=%u} " , * csum ) ;
}
static void
print_cmsg_ip_opts ( struct tcb * tcp , const void * cmsg_data ,
const size_t data_len )
{
2015-11-23 02:07:52 +03:00
const unsigned char * opts = cmsg_data ;
Implement IPPROTO_IP control messages decoding
* net.c: Include "xlat/ip_cmsg_types.h".
(print_cmsg_ip_pktinfo, print_cmsg_ip_ttl, print_cmsg_ip_tos,
print_cmsg_ip_opts, print_cmsg_ip_recverr, print_cmsg_ip_checksum,
print_cmsg_ip_origdstaddr): New functions.
(print_cmsg_type_data): Add generic SOL_IP level decoding.
Use these functions for decoding of IP_PKTINFO, IP_TTL, IP_TOS,
IP_RECVOPTS, IP_RETOPTS, IP_RECVERR, IP_ORIGDSTADDR, IP_CHECKSUM,
and SCM_SECURITY type messages.
* xlat/ip_cmsg_types.in: New file.
* xlat/sockipoptions.in: Move IP_RETOPTS before IP_RECVRETOPTS.
* tests/inet-cmsg.c: New file.
* tests/inet-cmsg.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add inet-cmsg.
(TESTS): Add inet-cmsg.test.
* tests/.gitignore: Add inet-cmsg.
Suggested-by: Orion Poplawski <orion@cora.nwra.com>
2015-11-21 03:03:54 +03:00
size_t i ;
if ( ! data_len )
return ;
tprints ( " , {opts=0x " ) ;
for ( i = 0 ; i < data_len ; + + i )
tprintf ( " %02x " , opts [ i ] ) ;
tprints ( " } " ) ;
}
static void
print_cmsg_ip_recverr ( struct tcb * tcp , const void * cmsg_data ,
const size_t data_len )
{
const struct {
uint32_t ee_errno ;
uint8_t ee_origin ;
uint8_t ee_type ;
uint8_t ee_code ;
uint8_t ee_pad ;
uint32_t ee_info ;
uint32_t ee_data ;
struct sockaddr_in offender ;
} * err = cmsg_data ;
if ( sizeof ( * err ) > data_len )
return ;
tprintf ( " , {ee_errno=%u, ee_origin=%u, ee_type=%u, ee_code=%u "
" , ee_info=%u, ee_data=%u, offender= " ,
err - > ee_errno , err - > ee_origin , err - > ee_type ,
err - > ee_code , err - > ee_info , err - > ee_data ) ;
print_sockaddr ( tcp , ( const void * ) & err - > offender ,
sizeof ( err - > offender ) ) ;
tprints ( " } " ) ;
}
static void
print_cmsg_ip_origdstaddr ( struct tcb * tcp , const void * cmsg_data ,
const size_t data_len )
{
if ( sizeof ( struct sockaddr_in ) > data_len )
return ;
tprints ( " , " ) ;
print_sockaddr ( tcp , cmsg_data , data_len ) ;
}
2015-11-19 03:29:19 +03:00
static void
print_cmsg_type_data ( struct tcb * tcp , const int cmsg_level , const int cmsg_type ,
2015-11-21 06:59:09 +03:00
const void * cmsg_data , const size_t data_len )
2015-11-19 03:29:19 +03:00
{
switch ( cmsg_level ) {
case SOL_SOCKET :
printxval ( scmvals , cmsg_type , " SCM_??? " ) ;
switch ( cmsg_type ) {
case SCM_RIGHTS :
2015-11-21 06:59:09 +03:00
print_scm_rights ( tcp , cmsg_data , data_len ) ;
2015-11-19 03:29:19 +03:00
break ;
case SCM_CREDENTIALS :
2015-11-21 06:59:09 +03:00
print_scm_creds ( tcp , cmsg_data , data_len ) ;
2015-11-19 03:29:19 +03:00
break ;
case SCM_SECURITY :
2015-11-21 06:59:09 +03:00
print_scm_security ( tcp , cmsg_data , data_len ) ;
2015-11-19 03:29:19 +03:00
break ;
}
break ;
Implement IPPROTO_IP control messages decoding
* net.c: Include "xlat/ip_cmsg_types.h".
(print_cmsg_ip_pktinfo, print_cmsg_ip_ttl, print_cmsg_ip_tos,
print_cmsg_ip_opts, print_cmsg_ip_recverr, print_cmsg_ip_checksum,
print_cmsg_ip_origdstaddr): New functions.
(print_cmsg_type_data): Add generic SOL_IP level decoding.
Use these functions for decoding of IP_PKTINFO, IP_TTL, IP_TOS,
IP_RECVOPTS, IP_RETOPTS, IP_RECVERR, IP_ORIGDSTADDR, IP_CHECKSUM,
and SCM_SECURITY type messages.
* xlat/ip_cmsg_types.in: New file.
* xlat/sockipoptions.in: Move IP_RETOPTS before IP_RECVRETOPTS.
* tests/inet-cmsg.c: New file.
* tests/inet-cmsg.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add inet-cmsg.
(TESTS): Add inet-cmsg.test.
* tests/.gitignore: Add inet-cmsg.
Suggested-by: Orion Poplawski <orion@cora.nwra.com>
2015-11-21 03:03:54 +03:00
case SOL_IP :
printxval ( ip_cmsg_types , cmsg_type , " IP_??? " ) ;
switch ( cmsg_type ) {
case IP_PKTINFO :
print_cmsg_ip_pktinfo ( tcp , cmsg_data , data_len ) ;
break ;
case IP_TTL :
print_cmsg_ip_ttl ( tcp , cmsg_data , data_len ) ;
break ;
case IP_TOS :
print_cmsg_ip_tos ( tcp , cmsg_data , data_len ) ;
break ;
case IP_RECVOPTS :
case IP_RETOPTS :
print_cmsg_ip_opts ( tcp , cmsg_data , data_len ) ;
break ;
case IP_RECVERR :
print_cmsg_ip_recverr ( tcp , cmsg_data , data_len ) ;
break ;
case IP_ORIGDSTADDR :
print_cmsg_ip_origdstaddr ( tcp , cmsg_data , data_len ) ;
break ;
case IP_CHECKSUM :
print_cmsg_ip_checksum ( tcp , cmsg_data , data_len ) ;
break ;
case SCM_SECURITY :
print_scm_security ( tcp , cmsg_data , data_len ) ;
break ;
}
break ;
2015-11-19 03:29:19 +03:00
default :
tprintf ( " %u " , cmsg_type ) ;
}
2015-01-24 18:20:31 +03:00
}
static void
printcmsghdr ( struct tcb * tcp , unsigned long addr , size_t len )
{
const size_t cmsg_size =
2015-01-24 04:08:57 +03:00
# if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
( current_wordsize < sizeof ( long ) ) ? sizeof ( struct cmsghdr32 ) :
# endif
sizeof ( struct cmsghdr ) ;
2015-01-24 18:20:31 +03:00
char * buf = len < cmsg_size ? NULL : malloc ( len ) ;
if ( ! buf | | umoven ( tcp , addr , len , buf ) < 0 ) {
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
tprints ( " , msg_control= " ) ;
printaddr ( addr ) ;
2015-01-24 18:20:31 +03:00
free ( buf ) ;
2004-10-07 02:11:51 +04:00
return ;
}
2015-01-24 18:20:31 +03:00
union_cmsghdr u = { . ptr = buf } ;
tprints ( " , [ " ) ;
while ( len > = cmsg_size ) {
size_t cmsg_len =
2015-01-24 04:08:57 +03:00
# if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
2015-01-24 18:20:31 +03:00
( current_wordsize < sizeof ( long ) ) ? u . cmsg32 - > cmsg_len :
2015-01-24 04:08:57 +03:00
# endif
2015-01-24 18:20:31 +03:00
u . cmsg - > cmsg_len ;
int cmsg_level =
2015-01-24 04:08:57 +03:00
# if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
2015-01-24 18:20:31 +03:00
( current_wordsize < sizeof ( long ) ) ? u . cmsg32 - > cmsg_level :
2015-01-24 04:08:57 +03:00
# endif
2015-01-24 18:20:31 +03:00
u . cmsg - > cmsg_level ;
int cmsg_type =
2015-01-24 04:08:57 +03:00
# if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
2015-01-24 18:20:31 +03:00
( current_wordsize < sizeof ( long ) ) ? u . cmsg32 - > cmsg_type :
2015-01-24 04:08:57 +03:00
# endif
2015-01-24 18:20:31 +03:00
u . cmsg - > cmsg_type ;
if ( u . ptr ! = buf )
tprints ( " , " ) ;
tprintf ( " {cmsg_len=%lu, cmsg_level= " , ( unsigned long ) cmsg_len ) ;
printxval ( socketlayers , cmsg_level , " SOL_??? " ) ;
tprints ( " , cmsg_type= " ) ;
if ( cmsg_len > len )
cmsg_len = len ;
2015-11-19 03:29:19 +03:00
print_cmsg_type_data ( tcp , cmsg_level , cmsg_type ,
2015-11-21 06:59:09 +03:00
( const void * ) ( u . ptr + cmsg_size ) ,
cmsg_len > cmsg_size ? cmsg_len - cmsg_size : 0 ) ;
2015-11-19 03:29:19 +03:00
tprints ( " } " ) ;
2015-01-24 18:20:31 +03:00
if ( cmsg_len < cmsg_size ) {
len - = cmsg_size ;
break ;
2004-10-07 02:11:51 +04:00
}
2015-01-24 18:20:31 +03:00
cmsg_len = ( cmsg_len + current_wordsize - 1 ) &
( size_t ) ~ ( current_wordsize - 1 ) ;
if ( cmsg_len > = len ) {
len = 0 ;
break ;
2004-10-07 02:11:51 +04:00
}
2015-01-24 18:20:31 +03:00
u . ptr + = cmsg_len ;
len - = cmsg_len ;
2004-10-07 02:11:51 +04:00
}
2015-01-24 18:20:31 +03:00
if ( len )
tprints ( " , ... " ) ;
tprints ( " ] " ) ;
free ( buf ) ;
2004-10-07 02:11:51 +04:00
}
1999-02-19 03:21:36 +03:00
2010-02-12 23:39:12 +03:00
static void
2012-04-28 16:26:18 +04:00
do_msghdr ( struct tcb * tcp , struct msghdr * msg , unsigned long data_size )
2010-02-12 23:39:12 +03:00
{
tprintf ( " {msg_name(%d)= " , msg - > msg_namelen ) ;
printsock ( tcp , ( long ) msg - > msg_name , msg - > msg_namelen ) ;
tprintf ( " , msg_iov(%lu)= " , ( unsigned long ) msg - > msg_iovlen ) ;
2012-04-28 16:26:18 +04:00
tprint_iov_upto ( tcp , ( unsigned long ) msg - > msg_iovlen ,
( unsigned long ) msg - > msg_iov , 1 , data_size ) ;
2010-02-12 23:39:12 +03:00
# ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
tprintf ( " , msg_controllen=%lu " , ( unsigned long ) msg - > msg_controllen ) ;
if ( msg - > msg_controllen )
printcmsghdr ( tcp , ( unsigned long ) msg - > msg_control ,
msg - > msg_controllen ) ;
2011-09-01 12:00:28 +04:00
tprints ( " , msg_flags= " ) ;
2010-02-12 23:39:12 +03:00
printflags ( msg_flags , msg - > msg_flags , " MSG_??? " ) ;
# else /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */
tprintf ( " msg_accrights=%#lx, msg_accrightslen=%u " ,
( unsigned long ) msg - > msg_accrights , msg - > msg_accrightslen ) ;
# endif /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */
2011-09-01 12:00:28 +04:00
tprints ( " } " ) ;
2010-02-12 23:39:12 +03:00
}
2013-02-12 14:57:48 +04:00
struct msghdr32 {
uint32_t /* void* */ msg_name ;
uint32_t /* socklen_t */ msg_namelen ;
uint32_t /* iovec* */ msg_iov ;
uint32_t /* size_t */ msg_iovlen ;
uint32_t /* void* */ msg_control ;
uint32_t /* size_t */ msg_controllen ;
uint32_t /* int */ msg_flags ;
} ;
struct mmsghdr32 {
struct msghdr32 msg_hdr ;
uint32_t /* unsigned */ msg_len ;
} ;
2014-11-06 19:23:25 +03:00
# ifndef HAVE_STRUCT_MMSGHDR
struct mmsghdr {
struct msghdr msg_hdr ;
unsigned msg_len ;
} ;
# endif
2014-11-06 19:23:24 +03:00
# if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
static void
copy_from_msghdr32 ( struct msghdr * to_msg , struct msghdr32 * from_msg32 )
{
to_msg - > msg_name = ( void * ) ( long ) from_msg32 - > msg_name ;
to_msg - > msg_namelen = from_msg32 - > msg_namelen ;
to_msg - > msg_iov = ( void * ) ( long ) from_msg32 - > msg_iov ;
to_msg - > msg_iovlen = from_msg32 - > msg_iovlen ;
to_msg - > msg_control = ( void * ) ( long ) from_msg32 - > msg_control ;
to_msg - > msg_controllen = from_msg32 - > msg_controllen ;
to_msg - > msg_flags = from_msg32 - > msg_flags ;
}
# endif
2014-10-15 17:11:43 +04:00
static bool
extractmsghdr ( struct tcb * tcp , long addr , struct msghdr * msg )
1999-02-19 03:21:36 +03:00
{
2013-02-12 14:57:48 +04:00
# if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
if ( current_wordsize = = 4 ) {
struct msghdr32 msg32 ;
2014-10-15 17:11:43 +04:00
if ( umove ( tcp , addr , & msg32 ) < 0 )
return false ;
2014-11-06 19:23:24 +03:00
copy_from_msghdr32 ( msg , & msg32 ) ;
2013-02-12 14:57:48 +04:00
} else
# endif
2014-10-15 17:11:43 +04:00
if ( umove ( tcp , addr , msg ) < 0 )
return false ;
return true ;
}
2014-11-06 19:23:26 +03:00
static bool
extractmmsghdr ( struct tcb * tcp , long addr , unsigned int idx , struct mmsghdr * mmsg )
{
# if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
if ( current_wordsize = = 4 ) {
struct mmsghdr32 mmsg32 ;
addr + = sizeof ( struct mmsghdr32 ) * idx ;
if ( umove ( tcp , addr , & mmsg32 ) < 0 )
return false ;
copy_from_msghdr32 ( & mmsg - > msg_hdr , & mmsg32 . msg_hdr ) ;
mmsg - > msg_len = mmsg32 . msg_len ;
} else
# endif
{
addr + = sizeof ( * mmsg ) * idx ;
if ( umove ( tcp , addr , mmsg ) < 0 )
return false ;
}
return true ;
}
2014-10-15 17:11:43 +04:00
static void
printmsghdr ( struct tcb * tcp , long addr , unsigned long data_size )
{
struct msghdr msg ;
2015-01-28 04:52:25 +03:00
if ( verbose ( tcp ) & & extractmsghdr ( tcp , addr , & msg ) )
2014-10-15 17:11:43 +04:00
do_msghdr ( tcp , & msg , data_size ) ;
else
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
printaddr ( addr ) ;
2014-10-15 17:11:43 +04:00
}
void
2016-01-20 06:26:37 +03:00
dumpiov_in_msghdr ( struct tcb * tcp , long addr , unsigned long data_size )
2014-10-15 17:11:43 +04:00
{
struct msghdr msg ;
if ( extractmsghdr ( tcp , addr , & msg ) )
2016-01-20 06:26:37 +03:00
dumpiov_upto ( tcp , msg . msg_iovlen , ( long ) msg . msg_iov , data_size ) ;
2010-02-12 23:39:12 +03:00
}
1999-11-18 20:09:47 +03:00
2010-02-12 23:39:12 +03:00
static void
2012-05-02 00:41:40 +04:00
printmmsghdr ( struct tcb * tcp , long addr , unsigned int idx , unsigned long msg_len )
2010-02-12 23:39:12 +03:00
{
2014-11-06 19:23:25 +03:00
struct mmsghdr mmsg ;
1999-11-18 20:09:47 +03:00
2014-11-06 19:23:26 +03:00
if ( extractmmsghdr ( tcp , addr , idx , & mmsg ) ) {
tprints ( " { " ) ;
do_msghdr ( tcp , & mmsg . msg_hdr , msg_len ? msg_len : mmsg . msg_len ) ;
tprintf ( " , %u} " , mmsg . msg_len ) ;
2010-02-12 23:39:12 +03:00
}
2014-11-06 19:23:26 +03:00
else
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
printaddr ( addr ) ;
1999-02-19 03:21:36 +03:00
}
2012-03-12 03:59:29 +04:00
static void
2012-05-02 00:41:40 +04:00
decode_mmsg ( struct tcb * tcp , unsigned long msg_len )
2012-03-12 03:59:29 +04:00
{
/* mmsgvec */
if ( syserror ( tcp ) ) {
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
printaddr ( tcp - > u_arg [ 1 ] ) ;
2012-03-12 03:59:29 +04:00
} else {
unsigned int len = tcp - > u_rval ;
unsigned int i ;
tprints ( " { " ) ;
for ( i = 0 ; i < len ; + + i ) {
if ( i )
tprints ( " , " ) ;
2012-05-02 00:41:40 +04:00
printmmsghdr ( tcp , tcp - > u_arg [ 1 ] , i , msg_len ) ;
2012-03-12 03:59:29 +04:00
}
tprints ( " } " ) ;
}
/* vlen */
tprintf ( " , %u, " , ( unsigned int ) tcp - > u_arg [ 2 ] ) ;
/* flags */
printflags ( msg_flags , tcp - > u_arg [ 3 ] , " MSG_??? " ) ;
}
2014-11-06 19:23:26 +03:00
void
dumpiov_in_mmsghdr ( struct tcb * tcp , long addr )
{
unsigned int len = tcp - > u_rval ;
unsigned int i ;
struct mmsghdr mmsg ;
for ( i = 0 ; i < len ; + + i ) {
if ( extractmmsghdr ( tcp , addr , i , & mmsg ) ) {
tprintf ( " = %lu buffers in vector %u \n " ,
( unsigned long ) mmsg . msg_hdr . msg_iovlen , i ) ;
2016-01-20 07:56:25 +03:00
dumpiov_upto ( tcp , mmsg . msg_hdr . msg_iovlen ,
( long ) mmsg . msg_hdr . msg_iov , mmsg . msg_len ) ;
2014-11-06 19:23:26 +03:00
}
}
}
1999-02-19 03:21:36 +03:00
2008-11-10 20:21:23 +03:00
/*
* low bits of the socket type define real socket type ,
* other bits are socket type flags .
*/
static void
2016-05-15 00:46:05 +03:00
tprint_sock_type ( unsigned int flags )
2008-11-10 20:21:23 +03:00
{
const char * str = xlookup ( socktypes , flags & SOCK_TYPE_MASK ) ;
2011-06-22 16:32:43 +04:00
if ( str ) {
2011-09-01 11:55:05 +04:00
tprints ( str ) ;
2008-11-10 20:21:23 +03:00
flags & = ~ SOCK_TYPE_MASK ;
if ( ! flags )
return ;
2011-09-01 12:00:28 +04:00
tprints ( " | " ) ;
2008-11-10 20:21:23 +03:00
}
printflags ( sock_type_flags , flags , " SOCK_??? " ) ;
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( socket )
1999-02-19 03:21:36 +03:00
{
2016-04-04 04:35:28 +03:00
printxval ( addrfams , tcp - > u_arg [ 0 ] , " AF_??? " ) ;
2015-07-20 01:52:47 +03:00
tprints ( " , " ) ;
tprint_sock_type ( tcp - > u_arg [ 1 ] ) ;
tprints ( " , " ) ;
switch ( tcp - > u_arg [ 0 ] ) {
2016-04-04 04:35:28 +03:00
case AF_INET :
case AF_INET6 :
2015-07-20 01:52:47 +03:00
printxval ( inet_protocols , tcp - > u_arg [ 2 ] , " IPPROTO_??? " ) ;
break ;
2016-04-04 04:35:28 +03:00
# ifdef AF_IPX
case AF_IPX :
2015-07-20 01:52:47 +03:00
/* BTW: I don't believe this.. */
tprints ( " [ " ) ;
2016-04-04 04:35:28 +03:00
printxval ( addrfams , tcp - > u_arg [ 2 ] , " AF_??? " ) ;
2015-07-20 01:52:47 +03:00
tprints ( " ] " ) ;
break ;
2016-04-04 04:35:28 +03:00
# endif /* AF_IPX */
case AF_NETLINK :
2015-07-20 01:52:47 +03:00
printxval ( netlink_protocols , tcp - > u_arg [ 2 ] , " NETLINK_??? " ) ;
break ;
2016-04-04 04:35:28 +03:00
# if defined(AF_BLUETOOTH) && defined(HAVE_BLUETOOTH_BLUETOOTH_H)
case AF_BLUETOOTH :
2015-07-20 01:52:47 +03:00
printxval ( bt_protocols , tcp - > u_arg [ 2 ] , " BTPROTO_??? " ) ;
break ;
2014-03-11 18:37:37 +04:00
# endif
2015-07-20 01:52:47 +03:00
default :
tprintf ( " %lu " , tcp - > u_arg [ 2 ] ) ;
break ;
1999-02-19 03:21:36 +03:00
}
2015-07-20 01:52:47 +03:00
2015-08-02 04:41:26 +03:00
return RVAL_DECODED | RVAL_FD ;
1999-02-19 03:21:36 +03:00
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( bind )
1999-02-19 03:21:36 +03:00
{
2015-07-20 01:52:47 +03:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
tprints ( " , " ) ;
printsock ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
tprintf ( " , %lu " , tcp - > u_arg [ 2 ] ) ;
return RVAL_DECODED ;
1999-02-19 03:21:36 +03:00
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( listen )
1999-02-19 03:21:36 +03:00
{
2015-07-20 01:52:47 +03:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
tprints ( " , " ) ;
tprintf ( " %lu " , tcp - > u_arg [ 1 ] ) ;
return RVAL_DECODED ;
1999-02-19 03:21:36 +03:00
}
2009-08-14 14:34:05 +04:00
static int
2014-08-06 20:46:13 +04:00
do_sockname ( struct tcb * tcp , int flags_arg )
1999-02-19 03:21:36 +03:00
{
if ( entering ( tcp ) ) {
Add decoding of sockets descriptor 'paths' for network calls
* net.c (sys_bind, sys_listen, do_accept, sys_send, sys_sendto,
sys_sendmsg, sys_sendmmsg, sys_recv, sys_recvfrom, sys_recvmsg,
sys_recvmmsg, sys_shutdown, sys_getsockopt, sys_setsockopt): Decode
socket descriptor arguments using printfd.
* pathtrace.c (pathtrace_match): Also check TRACE_NETWORK syscalls
that take socket descriptor arguments.
* tests/net-fd.test: New test for socket descriptor arguments decoding.
* tests/Makefile.am (TESTS): Add net-fd.test.
(net-fd.log): New dependency on net.log.
Signed-off-by: Philippe Ombredanne <pombredanne@nexb.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2014-02-01 21:57:45 +04:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
tprints ( " , " ) ;
2009-08-14 14:34:05 +04:00
return 0 ;
}
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
int len ;
if ( ! tcp - > u_arg [ 2 ] | | ! verbose ( tcp ) | | syserror ( tcp ) | |
umove ( tcp , tcp - > u_arg [ 2 ] , & len ) < 0 ) {
printaddr ( tcp - > u_arg [ 1 ] ) ;
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
printaddr ( tcp - > u_arg [ 2 ] ) ;
} else {
printsock ( tcp , tcp - > u_arg [ 1 ] , len ) ;
tprintf ( " , [%d] " , len ) ;
1999-02-19 03:21:36 +03:00
}
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
2009-08-14 14:34:05 +04:00
if ( flags_arg > = 0 ) {
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
2009-08-14 14:34:05 +04:00
printflags ( sock_type_flags , tcp - > u_arg [ flags_arg ] ,
" SOCK_??? " ) ;
}
1999-02-19 03:21:36 +03:00
return 0 ;
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( accept )
2009-08-14 14:34:05 +04:00
{
2014-08-06 20:46:13 +04:00
do_sockname ( tcp , - 1 ) ;
return RVAL_FD ;
2009-08-14 14:34:05 +04:00
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( accept4 )
2009-08-14 14:34:05 +04:00
{
2014-08-06 20:46:13 +04:00
do_sockname ( tcp , 3 ) ;
return RVAL_FD ;
2009-08-14 14:34:05 +04:00
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( send )
1999-02-19 03:21:36 +03:00
{
2015-07-20 01:52:47 +03:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
tprints ( " , " ) ;
printstr ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
tprintf ( " , %lu, " , tcp - > u_arg [ 2 ] ) ;
/* flags */
printflags ( msg_flags , tcp - > u_arg [ 3 ] , " MSG_??? " ) ;
return RVAL_DECODED ;
1999-02-19 03:21:36 +03:00
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( sendto )
1999-02-19 03:21:36 +03:00
{
2015-07-20 01:52:47 +03:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
tprints ( " , " ) ;
printstr ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
tprintf ( " , %lu, " , tcp - > u_arg [ 2 ] ) ;
/* flags */
printflags ( msg_flags , tcp - > u_arg [ 3 ] , " MSG_??? " ) ;
/* to address */
tprints ( " , " ) ;
printsock ( tcp , tcp - > u_arg [ 4 ] , tcp - > u_arg [ 5 ] ) ;
/* to length */
tprintf ( " , %lu " , tcp - > u_arg [ 5 ] ) ;
return RVAL_DECODED ;
1999-02-19 03:21:36 +03:00
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( sendmsg )
1999-02-19 03:21:36 +03:00
{
2015-07-20 01:52:47 +03:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
tprints ( " , " ) ;
printmsghdr ( tcp , tcp - > u_arg [ 1 ] , ( unsigned long ) - 1L ) ;
/* flags */
tprints ( " , " ) ;
printflags ( msg_flags , tcp - > u_arg [ 2 ] , " MSG_??? " ) ;
return RVAL_DECODED ;
1999-02-19 03:21:36 +03:00
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( sendmmsg )
2012-03-12 03:59:29 +04:00
{
if ( entering ( tcp ) ) {
/* sockfd */
Add decoding of sockets descriptor 'paths' for network calls
* net.c (sys_bind, sys_listen, do_accept, sys_send, sys_sendto,
sys_sendmsg, sys_sendmmsg, sys_recv, sys_recvfrom, sys_recvmsg,
sys_recvmmsg, sys_shutdown, sys_getsockopt, sys_setsockopt): Decode
socket descriptor arguments using printfd.
* pathtrace.c (pathtrace_match): Also check TRACE_NETWORK syscalls
that take socket descriptor arguments.
* tests/net-fd.test: New test for socket descriptor arguments decoding.
* tests/Makefile.am (TESTS): Add net-fd.test.
(net-fd.log): New dependency on net.log.
Signed-off-by: Philippe Ombredanne <pombredanne@nexb.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2014-02-01 21:57:45 +04:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
tprints ( " , " ) ;
2012-03-12 03:59:29 +04:00
if ( ! verbose ( tcp ) ) {
2016-06-11 04:28:21 +03:00
printaddr ( tcp - > u_arg [ 1 ] ) ;
tprintf ( " , %u, " , ( unsigned int ) tcp - > u_arg [ 2 ] ) ;
2012-03-12 03:59:29 +04:00
printflags ( msg_flags , tcp - > u_arg [ 3 ] , " MSG_??? " ) ;
}
} else {
if ( verbose ( tcp ) )
2012-05-02 00:41:40 +04:00
decode_mmsg ( tcp , ( unsigned long ) - 1L ) ;
2012-03-12 03:59:29 +04:00
}
return 0 ;
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( recv )
1999-02-19 03:21:36 +03:00
{
if ( entering ( tcp ) ) {
Add decoding of sockets descriptor 'paths' for network calls
* net.c (sys_bind, sys_listen, do_accept, sys_send, sys_sendto,
sys_sendmsg, sys_sendmmsg, sys_recv, sys_recvfrom, sys_recvmsg,
sys_recvmmsg, sys_shutdown, sys_getsockopt, sys_setsockopt): Decode
socket descriptor arguments using printfd.
* pathtrace.c (pathtrace_match): Also check TRACE_NETWORK syscalls
that take socket descriptor arguments.
* tests/net-fd.test: New test for socket descriptor arguments decoding.
* tests/Makefile.am (TESTS): Add net-fd.test.
(net-fd.log): New dependency on net.log.
Signed-off-by: Philippe Ombredanne <pombredanne@nexb.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2014-02-01 21:57:45 +04:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
tprints ( " , " ) ;
1999-02-19 03:21:36 +03:00
} else {
if ( syserror ( tcp ) )
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
printaddr ( tcp - > u_arg [ 1 ] ) ;
1999-02-19 03:21:36 +03:00
else
printstr ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_rval ) ;
tprintf ( " , %lu, " , tcp - > u_arg [ 2 ] ) ;
2005-05-31 Dmitry V. Levin <ldv@altlinux.org>
* util.c (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument, "const char *", with similar
meaning to the third argument of printxval().
* defs.h (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument.
* bjm.c (sys_query_module) [LINUX]: Pass third argument to
printflags().
* desc.c (sys_fcntl): Likewise.
(sys_flock) [LOCK_SH]: Likewise.
(print_epoll_event) [HAVE_SYS_EPOLL_H]: Likewise.
* file.c (sys_open): Likewise.
(solaris_open) [LINUXSPARC]: Likewise.
(sys_access): Likewise.
(sys_chflags, sys_fchflags) [FREEBSD]: Likewise.
(realprintstat) [HAVE_LONG_LONG_OFF_T &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(printstat64) [HAVE_STAT64 &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(sys_setxattr, sys_fsetxattr): Likewise.
* ipc.c (sys_msgget, sys_msgsnd, sys_msgrcv, sys_semget,
sys_shmget, sys_shmat) [LINUX || SUNOS4 || FREEBSD]: Likewise.
(sys_mq_open) [LINUX]: Likewise.
(printmqattr) [HAVE_MQUEUE_H]: Likewise.
* mem.c (print_mmap) [!HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mmap64) [_LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mprotect): Likewise.
(sys_mremap, sys_madvise, sys_mlockall) [LINUX]: Likewise.
(sys_msync) [MS_ASYNC]: Likewise.
(sys_mctl) [MC_SYNC]: Likewise.
(sys_remap_file_pages, sys_mbind, sys_get_mempolicy) [LINUX]:
Likewise.
* net.c (printmsghdr) [HAVE_STRUCT_MSGHDR_MSG_CONTROL]: Likewise.
(sys_send, sys_sendto): Likewise.
(sys_sendmsg) [HAVE_SENDMSG]: Likewise.
(sys_recv, sys_recvfrom): Likewise.
(sys_recvmsg) [HAVE_SENDMSG]: Likewise.
(printicmpfilter) [ICMP_FILTER]: Likewise.
* proc.c (proc_ioctl) [SVR4 && !HAVE_MP_PROCFS || FREEBSD]: Likewise.
* process.c (sys_clone) [LINUX]: Likewise.
(printwaitn): Likewise.
(sys_waitid) [SVR4 || LINUX]: Likewise.
* signal.c (sys_sigvec) [SUNOS4 || FREEBSD]: Likewise.
(sys_sigaction): Likewise.
(printcontext) [SVR4]: Likewise.
(print_stack_t) [LINUX) || FREEBSD]: Likewise.
(sys_rt_sigaction) [LINUX]: Likewise.
* sock.c (sock_ioctl) [LINUX]: Likewise.
* stream.c (sys_putmsg, sys_getmsg): Likewise.
(sys_putpmsg) [SYS_putpmsg]: Likewise.
(sys_getpmsg) [SYS_getpmsg]: Likewise.
(sys_poll): Likewise.
(print_transport_message) [TI_BIND]: Likewise.
(stream_ioctl): Likewise.
* system.c (sys_mount, sys_reboot): Likewise.
(sys_cacheflush) [LINUX && M68K]: Likewise.
(sys_capget, sys_capset) [SYS_capget]: Likewise.
* term.c (term_ioctl) [TIOCMGET]: Likewise.
* time.c (sys_clock_nanosleep, sys_timer_settime) [LINUX]:
Likewise.
Fixes RH#159310.
2005-06-01 23:02:36 +04:00
printflags ( msg_flags , tcp - > u_arg [ 3 ] , " MSG_??? " ) ;
1999-02-19 03:21:36 +03:00
}
return 0 ;
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( recvfrom )
1999-02-19 03:21:36 +03:00
{
int fromlen ;
if ( entering ( tcp ) ) {
Add decoding of sockets descriptor 'paths' for network calls
* net.c (sys_bind, sys_listen, do_accept, sys_send, sys_sendto,
sys_sendmsg, sys_sendmmsg, sys_recv, sys_recvfrom, sys_recvmsg,
sys_recvmmsg, sys_shutdown, sys_getsockopt, sys_setsockopt): Decode
socket descriptor arguments using printfd.
* pathtrace.c (pathtrace_match): Also check TRACE_NETWORK syscalls
that take socket descriptor arguments.
* tests/net-fd.test: New test for socket descriptor arguments decoding.
* tests/Makefile.am (TESTS): Add net-fd.test.
(net-fd.log): New dependency on net.log.
Signed-off-by: Philippe Ombredanne <pombredanne@nexb.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2014-02-01 21:57:45 +04:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
tprints ( " , " ) ;
1999-02-19 03:21:36 +03:00
} else {
net.c: recvfrom fixes
This change fixes these three problems (before/after is shown):
On interrupted syscall, flags are not decoded:
-recvfrom(3, 0x7fff0a41e306, 10, 2, 0, 0) = ? ERESTARTSYS
+recvfrom(3, 0x7fff0a41e306, 10, MSG_PEEK, 0, 0) = ? ERESTARTSYS
If peer address is unavalable (example: anon sockets from socketpair()),
kernel returns socklen of 0, but we ignore that and show bogus sockaddr data:
-recvfrom(3, "123456789\0", 10, MSG_PEEK, {sa_family=0x7777 /* AF_??? */, sa_data="wwwwwwwwwwwwww"}, [0]) = 10
+recvfrom(3, "123456789\0", 10, MSG_PEEK, 0x7ffde6edf760, [0]) = 10
SYS_FUNC(recvfrom) passes address of fromlen, not fromlen, to printsock():
- printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]);
+ printsock(tcp, tcp->u_arg[4], fromlen);
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-07-30 14:29:20 +03:00
/* buf */
1999-02-19 03:21:36 +03:00
if ( syserror ( tcp ) ) {
2015-07-30 16:53:42 +03:00
printaddr ( tcp - > u_arg [ 1 ] ) ;
net.c: recvfrom fixes
This change fixes these three problems (before/after is shown):
On interrupted syscall, flags are not decoded:
-recvfrom(3, 0x7fff0a41e306, 10, 2, 0, 0) = ? ERESTARTSYS
+recvfrom(3, 0x7fff0a41e306, 10, MSG_PEEK, 0, 0) = ? ERESTARTSYS
If peer address is unavalable (example: anon sockets from socketpair()),
kernel returns socklen of 0, but we ignore that and show bogus sockaddr data:
-recvfrom(3, "123456789\0", 10, MSG_PEEK, {sa_family=0x7777 /* AF_??? */, sa_data="wwwwwwwwwwwwww"}, [0]) = 10
+recvfrom(3, "123456789\0", 10, MSG_PEEK, 0x7ffde6edf760, [0]) = 10
SYS_FUNC(recvfrom) passes address of fromlen, not fromlen, to printsock():
- printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]);
+ printsock(tcp, tcp->u_arg[4], fromlen);
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-07-30 14:29:20 +03:00
} else {
printstr ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_rval ) ;
1999-02-19 03:21:36 +03:00
}
/* len */
tprintf ( " , %lu, " , tcp - > u_arg [ 2 ] ) ;
/* flags */
2005-05-31 Dmitry V. Levin <ldv@altlinux.org>
* util.c (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument, "const char *", with similar
meaning to the third argument of printxval().
* defs.h (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument.
* bjm.c (sys_query_module) [LINUX]: Pass third argument to
printflags().
* desc.c (sys_fcntl): Likewise.
(sys_flock) [LOCK_SH]: Likewise.
(print_epoll_event) [HAVE_SYS_EPOLL_H]: Likewise.
* file.c (sys_open): Likewise.
(solaris_open) [LINUXSPARC]: Likewise.
(sys_access): Likewise.
(sys_chflags, sys_fchflags) [FREEBSD]: Likewise.
(realprintstat) [HAVE_LONG_LONG_OFF_T &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(printstat64) [HAVE_STAT64 &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(sys_setxattr, sys_fsetxattr): Likewise.
* ipc.c (sys_msgget, sys_msgsnd, sys_msgrcv, sys_semget,
sys_shmget, sys_shmat) [LINUX || SUNOS4 || FREEBSD]: Likewise.
(sys_mq_open) [LINUX]: Likewise.
(printmqattr) [HAVE_MQUEUE_H]: Likewise.
* mem.c (print_mmap) [!HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mmap64) [_LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mprotect): Likewise.
(sys_mremap, sys_madvise, sys_mlockall) [LINUX]: Likewise.
(sys_msync) [MS_ASYNC]: Likewise.
(sys_mctl) [MC_SYNC]: Likewise.
(sys_remap_file_pages, sys_mbind, sys_get_mempolicy) [LINUX]:
Likewise.
* net.c (printmsghdr) [HAVE_STRUCT_MSGHDR_MSG_CONTROL]: Likewise.
(sys_send, sys_sendto): Likewise.
(sys_sendmsg) [HAVE_SENDMSG]: Likewise.
(sys_recv, sys_recvfrom): Likewise.
(sys_recvmsg) [HAVE_SENDMSG]: Likewise.
(printicmpfilter) [ICMP_FILTER]: Likewise.
* proc.c (proc_ioctl) [SVR4 && !HAVE_MP_PROCFS || FREEBSD]: Likewise.
* process.c (sys_clone) [LINUX]: Likewise.
(printwaitn): Likewise.
(sys_waitid) [SVR4 || LINUX]: Likewise.
* signal.c (sys_sigvec) [SUNOS4 || FREEBSD]: Likewise.
(sys_sigaction): Likewise.
(printcontext) [SVR4]: Likewise.
(print_stack_t) [LINUX) || FREEBSD]: Likewise.
(sys_rt_sigaction) [LINUX]: Likewise.
* sock.c (sock_ioctl) [LINUX]: Likewise.
* stream.c (sys_putmsg, sys_getmsg): Likewise.
(sys_putpmsg) [SYS_putpmsg]: Likewise.
(sys_getpmsg) [SYS_getpmsg]: Likewise.
(sys_poll): Likewise.
(print_transport_message) [TI_BIND]: Likewise.
(stream_ioctl): Likewise.
* system.c (sys_mount, sys_reboot): Likewise.
(sys_cacheflush) [LINUX && M68K]: Likewise.
(sys_capget, sys_capset) [SYS_capget]: Likewise.
* term.c (term_ioctl) [TIOCMGET]: Likewise.
* time.c (sys_clock_nanosleep, sys_timer_settime) [LINUX]:
Likewise.
Fixes RH#159310.
2005-06-01 23:02:36 +04:00
printflags ( msg_flags , tcp - > u_arg [ 3 ] , " MSG_??? " ) ;
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
tprints ( " , " ) ;
2015-07-30 16:53:42 +03:00
if ( syserror ( tcp ) | | ! tcp - > u_arg [ 4 ] | | ! tcp - > u_arg [ 5 ] | |
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
umove ( tcp , tcp - > u_arg [ 5 ] , & fromlen ) < 0 ) {
net.c: recvfrom fixes
This change fixes these three problems (before/after is shown):
On interrupted syscall, flags are not decoded:
-recvfrom(3, 0x7fff0a41e306, 10, 2, 0, 0) = ? ERESTARTSYS
+recvfrom(3, 0x7fff0a41e306, 10, MSG_PEEK, 0, 0) = ? ERESTARTSYS
If peer address is unavalable (example: anon sockets from socketpair()),
kernel returns socklen of 0, but we ignore that and show bogus sockaddr data:
-recvfrom(3, "123456789\0", 10, MSG_PEEK, {sa_family=0x7777 /* AF_??? */, sa_data="wwwwwwwwwwwwww"}, [0]) = 10
+recvfrom(3, "123456789\0", 10, MSG_PEEK, 0x7ffde6edf760, [0]) = 10
SYS_FUNC(recvfrom) passes address of fromlen, not fromlen, to printsock():
- printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]);
+ printsock(tcp, tcp->u_arg[4], fromlen);
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-07-30 14:29:20 +03:00
/* from address, len */
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
printaddr ( tcp - > u_arg [ 4 ] ) ;
tprints ( " , " ) ;
printaddr ( tcp - > u_arg [ 5 ] ) ;
1999-02-19 03:21:36 +03:00
return 0 ;
}
net.c: recvfrom fixes
This change fixes these three problems (before/after is shown):
On interrupted syscall, flags are not decoded:
-recvfrom(3, 0x7fff0a41e306, 10, 2, 0, 0) = ? ERESTARTSYS
+recvfrom(3, 0x7fff0a41e306, 10, MSG_PEEK, 0, 0) = ? ERESTARTSYS
If peer address is unavalable (example: anon sockets from socketpair()),
kernel returns socklen of 0, but we ignore that and show bogus sockaddr data:
-recvfrom(3, "123456789\0", 10, MSG_PEEK, {sa_family=0x7777 /* AF_??? */, sa_data="wwwwwwwwwwwwww"}, [0]) = 10
+recvfrom(3, "123456789\0", 10, MSG_PEEK, 0x7ffde6edf760, [0]) = 10
SYS_FUNC(recvfrom) passes address of fromlen, not fromlen, to printsock():
- printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]);
+ printsock(tcp, tcp->u_arg[4], fromlen);
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-07-30 14:29:20 +03:00
/* from address */
printsock ( tcp , tcp - > u_arg [ 4 ] , fromlen ) ;
1999-02-19 03:21:36 +03:00
/* from length */
tprintf ( " , [%u] " , fromlen ) ;
}
return 0 ;
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( recvmsg )
1999-02-19 03:21:36 +03:00
{
if ( entering ( tcp ) ) {
Add decoding of sockets descriptor 'paths' for network calls
* net.c (sys_bind, sys_listen, do_accept, sys_send, sys_sendto,
sys_sendmsg, sys_sendmmsg, sys_recv, sys_recvfrom, sys_recvmsg,
sys_recvmmsg, sys_shutdown, sys_getsockopt, sys_setsockopt): Decode
socket descriptor arguments using printfd.
* pathtrace.c (pathtrace_match): Also check TRACE_NETWORK syscalls
that take socket descriptor arguments.
* tests/net-fd.test: New test for socket descriptor arguments decoding.
* tests/Makefile.am (TESTS): Add net-fd.test.
(net-fd.log): New dependency on net.log.
Signed-off-by: Philippe Ombredanne <pombredanne@nexb.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2014-02-01 21:57:45 +04:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
tprints ( " , " ) ;
1999-02-19 03:21:36 +03:00
} else {
2015-01-28 04:52:25 +03:00
if ( syserror ( tcp ) )
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
printaddr ( tcp - > u_arg [ 1 ] ) ;
1999-02-19 03:21:36 +03:00
else
2012-04-28 16:26:18 +04:00
printmsghdr ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_rval ) ;
1999-02-19 03:21:36 +03:00
/* flags */
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
2005-05-31 Dmitry V. Levin <ldv@altlinux.org>
* util.c (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument, "const char *", with similar
meaning to the third argument of printxval().
* defs.h (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument.
* bjm.c (sys_query_module) [LINUX]: Pass third argument to
printflags().
* desc.c (sys_fcntl): Likewise.
(sys_flock) [LOCK_SH]: Likewise.
(print_epoll_event) [HAVE_SYS_EPOLL_H]: Likewise.
* file.c (sys_open): Likewise.
(solaris_open) [LINUXSPARC]: Likewise.
(sys_access): Likewise.
(sys_chflags, sys_fchflags) [FREEBSD]: Likewise.
(realprintstat) [HAVE_LONG_LONG_OFF_T &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(printstat64) [HAVE_STAT64 &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(sys_setxattr, sys_fsetxattr): Likewise.
* ipc.c (sys_msgget, sys_msgsnd, sys_msgrcv, sys_semget,
sys_shmget, sys_shmat) [LINUX || SUNOS4 || FREEBSD]: Likewise.
(sys_mq_open) [LINUX]: Likewise.
(printmqattr) [HAVE_MQUEUE_H]: Likewise.
* mem.c (print_mmap) [!HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mmap64) [_LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mprotect): Likewise.
(sys_mremap, sys_madvise, sys_mlockall) [LINUX]: Likewise.
(sys_msync) [MS_ASYNC]: Likewise.
(sys_mctl) [MC_SYNC]: Likewise.
(sys_remap_file_pages, sys_mbind, sys_get_mempolicy) [LINUX]:
Likewise.
* net.c (printmsghdr) [HAVE_STRUCT_MSGHDR_MSG_CONTROL]: Likewise.
(sys_send, sys_sendto): Likewise.
(sys_sendmsg) [HAVE_SENDMSG]: Likewise.
(sys_recv, sys_recvfrom): Likewise.
(sys_recvmsg) [HAVE_SENDMSG]: Likewise.
(printicmpfilter) [ICMP_FILTER]: Likewise.
* proc.c (proc_ioctl) [SVR4 && !HAVE_MP_PROCFS || FREEBSD]: Likewise.
* process.c (sys_clone) [LINUX]: Likewise.
(printwaitn): Likewise.
(sys_waitid) [SVR4 || LINUX]: Likewise.
* signal.c (sys_sigvec) [SUNOS4 || FREEBSD]: Likewise.
(sys_sigaction): Likewise.
(printcontext) [SVR4]: Likewise.
(print_stack_t) [LINUX) || FREEBSD]: Likewise.
(sys_rt_sigaction) [LINUX]: Likewise.
* sock.c (sock_ioctl) [LINUX]: Likewise.
* stream.c (sys_putmsg, sys_getmsg): Likewise.
(sys_putpmsg) [SYS_putpmsg]: Likewise.
(sys_getpmsg) [SYS_getpmsg]: Likewise.
(sys_poll): Likewise.
(print_transport_message) [TI_BIND]: Likewise.
(stream_ioctl): Likewise.
* system.c (sys_mount, sys_reboot): Likewise.
(sys_cacheflush) [LINUX && M68K]: Likewise.
(sys_capget, sys_capset) [SYS_capget]: Likewise.
* term.c (term_ioctl) [TIOCMGET]: Likewise.
* time.c (sys_clock_nanosleep, sys_timer_settime) [LINUX]:
Likewise.
Fixes RH#159310.
2005-06-01 23:02:36 +04:00
printflags ( msg_flags , tcp - > u_arg [ 2 ] , " MSG_??? " ) ;
1999-02-19 03:21:36 +03:00
}
return 0 ;
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( recvmmsg )
2010-02-12 23:39:12 +03:00
{
2015-09-18 20:44:16 +03:00
static char str [ sizeof ( " left " ) + TIMESPEC_TEXT_BUFSIZE ] ;
2010-03-29 20:45:48 +04:00
2012-01-20 14:04:04 +04:00
if ( entering ( tcp ) ) {
Add decoding of sockets descriptor 'paths' for network calls
* net.c (sys_bind, sys_listen, do_accept, sys_send, sys_sendto,
sys_sendmsg, sys_sendmmsg, sys_recv, sys_recvfrom, sys_recvmsg,
sys_recvmmsg, sys_shutdown, sys_getsockopt, sys_setsockopt): Decode
socket descriptor arguments using printfd.
* pathtrace.c (pathtrace_match): Also check TRACE_NETWORK syscalls
that take socket descriptor arguments.
* tests/net-fd.test: New test for socket descriptor arguments decoding.
* tests/Makefile.am (TESTS): Add net-fd.test.
(net-fd.log): New dependency on net.log.
Signed-off-by: Philippe Ombredanne <pombredanne@nexb.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2014-02-01 21:57:45 +04:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
tprints ( " , " ) ;
2010-03-29 20:45:48 +04:00
if ( verbose ( tcp ) ) {
2012-01-20 14:04:04 +04:00
/* Abusing tcp->auxstr as temp storage.
2015-09-18 20:44:16 +03:00
* Will be used and cleared on syscall exit .
2012-01-20 14:04:04 +04:00
*/
2015-09-18 20:44:16 +03:00
tcp - > auxstr = sprint_timespec ( tcp , tcp - > u_arg [ 4 ] ) ;
2010-03-29 20:45:48 +04:00
} else {
2016-06-11 04:28:21 +03:00
printaddr ( tcp - > u_arg [ 1 ] ) ;
tprintf ( " , %u, " , ( unsigned int ) tcp - > u_arg [ 2 ] ) ;
2010-03-29 20:45:48 +04:00
printflags ( msg_flags , tcp - > u_arg [ 3 ] , " MSG_??? " ) ;
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
2010-03-29 20:45:48 +04:00
print_timespec ( tcp , tcp - > u_arg [ 4 ] ) ;
}
return 0 ;
} else {
if ( verbose ( tcp ) ) {
2012-05-02 00:41:40 +04:00
decode_mmsg ( tcp , 0 ) ;
2015-09-18 20:44:16 +03:00
tprints ( " , " ) ;
2010-03-29 20:45:48 +04:00
/* timeout on entrance */
2015-09-18 20:44:16 +03:00
tprints ( tcp - > auxstr ) ;
2010-03-29 20:45:48 +04:00
tcp - > auxstr = NULL ;
}
if ( syserror ( tcp ) )
return 0 ;
if ( tcp - > u_rval = = 0 ) {
tcp - > auxstr = " Timeout " ;
return RVAL_STR ;
}
if ( ! verbose ( tcp ) )
return 0 ;
/* timeout on exit */
2015-09-18 20:44:16 +03:00
snprintf ( str , sizeof ( str ) , " left %s " ,
sprint_timespec ( tcp , tcp - > u_arg [ 4 ] ) ) ;
2010-03-29 20:45:48 +04:00
tcp - > auxstr = str ;
return RVAL_STR ;
2010-02-12 23:39:12 +03:00
}
}
2014-04-26 03:30:54 +04:00
# include "xlat/shutdown_modes.h"
2011-03-03 03:12:25 +03:00
2015-04-07 04:36:50 +03:00
SYS_FUNC ( shutdown )
1999-02-19 03:21:36 +03:00
{
2015-07-20 01:52:47 +03:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
tprints ( " , " ) ;
printxval ( shutdown_modes , tcp - > u_arg [ 1 ] , " SHUT_??? " ) ;
return RVAL_DECODED ;
1999-02-19 03:21:36 +03:00
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( getsockname )
1999-02-19 03:21:36 +03:00
{
2014-08-06 20:46:13 +04:00
return do_sockname ( tcp , - 1 ) ;
1999-02-19 03:21:36 +03:00
}
2015-08-02 04:54:48 +03:00
static void
printpair_fd ( struct tcb * tcp , const int i0 , const int i1 )
{
tprints ( " [ " ) ;
printfd ( tcp , i0 ) ;
tprints ( " , " ) ;
printfd ( tcp , i1 ) ;
tprints ( " ] " ) ;
}
static void
decode_pair_fd ( struct tcb * tcp , const long addr )
{
int pair [ 2 ] ;
if ( umove_or_printaddr ( tcp , addr , & pair ) )
return ;
printpair_fd ( tcp , pair [ 0 ] , pair [ 1 ] ) ;
}
2008-10-23 Dmitry V. Levin <ldv@altlinux.org>
Implement parsers for new linux syscalls.
* desc.c (do_dup2, [LINUX] sys_dup3): New functions.
(sys_dup2): Use do_dup2.
[LINUX] (sys_epoll_create1): New function.
[LINUX] (do_eventfd, sys_eventfd2): New functions.
[LINUX] (sys_eventfd): Use do_eventfd.
* net.c (do_pipe, [LINUX] sys_pipe2): New functions.
(sys_pipe): Use do_pipe.
* signal.c [LINUX] (do_signalfd, sys_signalfd4): New functions.
[LINUX] (sys_signalfd): Use do_signalfd.
* linux/syscall.h: Declare new sys_* functions.
* linux/syscallent.h: Hook up signalfd4, eventfd2, epoll_create1,
dup3, pipe2, inotify_init1.
* linux/x86_64/syscallent.h: Hook up paccept, signalfd4, eventfd2,
epoll_create1, dup3, pipe2, inotify_init1.
2008-11-11 01:53:02 +03:00
static int
do_pipe ( struct tcb * tcp , int flags_arg )
{
1999-02-19 03:21:36 +03:00
if ( exiting ( tcp ) ) {
2016-02-12 19:37:31 +03:00
decode_pair_fd ( tcp , tcp - > u_arg [ 0 ] ) ;
2008-10-23 Dmitry V. Levin <ldv@altlinux.org>
Implement parsers for new linux syscalls.
* desc.c (do_dup2, [LINUX] sys_dup3): New functions.
(sys_dup2): Use do_dup2.
[LINUX] (sys_epoll_create1): New function.
[LINUX] (do_eventfd, sys_eventfd2): New functions.
[LINUX] (sys_eventfd): Use do_eventfd.
* net.c (do_pipe, [LINUX] sys_pipe2): New functions.
(sys_pipe): Use do_pipe.
* signal.c [LINUX] (do_signalfd, sys_signalfd4): New functions.
[LINUX] (sys_signalfd): Use do_signalfd.
* linux/syscall.h: Declare new sys_* functions.
* linux/syscallent.h: Hook up signalfd4, eventfd2, epoll_create1,
dup3, pipe2, inotify_init1.
* linux/x86_64/syscallent.h: Hook up paccept, signalfd4, eventfd2,
epoll_create1, dup3, pipe2, inotify_init1.
2008-11-11 01:53:02 +03:00
if ( flags_arg > = 0 ) {
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
2008-10-23 Dmitry V. Levin <ldv@altlinux.org>
Implement parsers for new linux syscalls.
* desc.c (do_dup2, [LINUX] sys_dup3): New functions.
(sys_dup2): Use do_dup2.
[LINUX] (sys_epoll_create1): New function.
[LINUX] (do_eventfd, sys_eventfd2): New functions.
[LINUX] (sys_eventfd): Use do_eventfd.
* net.c (do_pipe, [LINUX] sys_pipe2): New functions.
(sys_pipe): Use do_pipe.
* signal.c [LINUX] (do_signalfd, sys_signalfd4): New functions.
[LINUX] (sys_signalfd): Use do_signalfd.
* linux/syscall.h: Declare new sys_* functions.
* linux/syscallent.h: Hook up signalfd4, eventfd2, epoll_create1,
dup3, pipe2, inotify_init1.
* linux/x86_64/syscallent.h: Hook up paccept, signalfd4, eventfd2,
epoll_create1, dup3, pipe2, inotify_init1.
2008-11-11 01:53:02 +03:00
printflags ( open_mode_flags , tcp - > u_arg [ flags_arg ] , " O_??? " ) ;
}
}
1999-02-19 03:21:36 +03:00
return 0 ;
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( pipe )
2008-10-23 Dmitry V. Levin <ldv@altlinux.org>
Implement parsers for new linux syscalls.
* desc.c (do_dup2, [LINUX] sys_dup3): New functions.
(sys_dup2): Use do_dup2.
[LINUX] (sys_epoll_create1): New function.
[LINUX] (do_eventfd, sys_eventfd2): New functions.
[LINUX] (sys_eventfd): Use do_eventfd.
* net.c (do_pipe, [LINUX] sys_pipe2): New functions.
(sys_pipe): Use do_pipe.
* signal.c [LINUX] (do_signalfd, sys_signalfd4): New functions.
[LINUX] (sys_signalfd): Use do_signalfd.
* linux/syscall.h: Declare new sys_* functions.
* linux/syscallent.h: Hook up signalfd4, eventfd2, epoll_create1,
dup3, pipe2, inotify_init1.
* linux/x86_64/syscallent.h: Hook up paccept, signalfd4, eventfd2,
epoll_create1, dup3, pipe2, inotify_init1.
2008-11-11 01:53:02 +03:00
{
2016-02-12 19:37:31 +03:00
# ifdef HAVE_GETRVAL2
if ( exiting ( tcp ) & & ! syserror ( tcp ) )
printpair_fd ( tcp , tcp - > u_rval , getrval2 ( tcp ) ) ;
return 0 ;
# else
2008-10-23 Dmitry V. Levin <ldv@altlinux.org>
Implement parsers for new linux syscalls.
* desc.c (do_dup2, [LINUX] sys_dup3): New functions.
(sys_dup2): Use do_dup2.
[LINUX] (sys_epoll_create1): New function.
[LINUX] (do_eventfd, sys_eventfd2): New functions.
[LINUX] (sys_eventfd): Use do_eventfd.
* net.c (do_pipe, [LINUX] sys_pipe2): New functions.
(sys_pipe): Use do_pipe.
* signal.c [LINUX] (do_signalfd, sys_signalfd4): New functions.
[LINUX] (sys_signalfd): Use do_signalfd.
* linux/syscall.h: Declare new sys_* functions.
* linux/syscallent.h: Hook up signalfd4, eventfd2, epoll_create1,
dup3, pipe2, inotify_init1.
* linux/x86_64/syscallent.h: Hook up paccept, signalfd4, eventfd2,
epoll_create1, dup3, pipe2, inotify_init1.
2008-11-11 01:53:02 +03:00
return do_pipe ( tcp , - 1 ) ;
2016-02-12 19:37:31 +03:00
# endif
2008-10-23 Dmitry V. Levin <ldv@altlinux.org>
Implement parsers for new linux syscalls.
* desc.c (do_dup2, [LINUX] sys_dup3): New functions.
(sys_dup2): Use do_dup2.
[LINUX] (sys_epoll_create1): New function.
[LINUX] (do_eventfd, sys_eventfd2): New functions.
[LINUX] (sys_eventfd): Use do_eventfd.
* net.c (do_pipe, [LINUX] sys_pipe2): New functions.
(sys_pipe): Use do_pipe.
* signal.c [LINUX] (do_signalfd, sys_signalfd4): New functions.
[LINUX] (sys_signalfd): Use do_signalfd.
* linux/syscall.h: Declare new sys_* functions.
* linux/syscallent.h: Hook up signalfd4, eventfd2, epoll_create1,
dup3, pipe2, inotify_init1.
* linux/x86_64/syscallent.h: Hook up paccept, signalfd4, eventfd2,
epoll_create1, dup3, pipe2, inotify_init1.
2008-11-11 01:53:02 +03:00
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( pipe2 )
2008-10-23 Dmitry V. Levin <ldv@altlinux.org>
Implement parsers for new linux syscalls.
* desc.c (do_dup2, [LINUX] sys_dup3): New functions.
(sys_dup2): Use do_dup2.
[LINUX] (sys_epoll_create1): New function.
[LINUX] (do_eventfd, sys_eventfd2): New functions.
[LINUX] (sys_eventfd): Use do_eventfd.
* net.c (do_pipe, [LINUX] sys_pipe2): New functions.
(sys_pipe): Use do_pipe.
* signal.c [LINUX] (do_signalfd, sys_signalfd4): New functions.
[LINUX] (sys_signalfd): Use do_signalfd.
* linux/syscall.h: Declare new sys_* functions.
* linux/syscallent.h: Hook up signalfd4, eventfd2, epoll_create1,
dup3, pipe2, inotify_init1.
* linux/x86_64/syscallent.h: Hook up paccept, signalfd4, eventfd2,
epoll_create1, dup3, pipe2, inotify_init1.
2008-11-11 01:53:02 +03:00
{
return do_pipe ( tcp , 1 ) ;
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( socketpair )
1999-02-19 03:21:36 +03:00
{
if ( entering ( tcp ) ) {
2016-04-04 04:35:28 +03:00
printxval ( addrfams , tcp - > u_arg [ 0 ] , " AF_??? " ) ;
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
2014-09-10 21:48:28 +04:00
tprint_sock_type ( tcp - > u_arg [ 1 ] ) ;
2014-03-12 02:50:39 +04:00
tprintf ( " , %lu " , tcp - > u_arg [ 2 ] ) ;
1999-02-19 03:21:36 +03:00
} else {
2015-07-07 01:33:39 +03:00
tprints ( " , " ) ;
2015-08-02 04:54:48 +03:00
decode_pair_fd ( tcp , tcp - > u_arg [ 3 ] ) ;
1999-02-19 03:21:36 +03:00
}
return 0 ;
}
2015-01-29 07:42:37 +03:00
# include "xlat/sockoptions.h"
# include "xlat/sockipoptions.h"
decode extend getsockopt/setsockopt options
Currently the code assumes the set of valid options between getsockopt
and setsockopt are exactly the same and thus maintains one list. The
kernel unfortunately does not do this -- it allows for different opts
between the get and set functions. See the {g,s}et_opt{min,max} fields
in the various netfilter subcores.
To support this, extend the printxval function to take multiple sets of
xlats as varargs. Then we add the new get/set lists, and pass them down
in the net code when decoding things.
A simple example is iptables; before:
getsockopt(4, SOL_IP, 0x40 /* IP_??? */, ...) = 0
getsockopt(4, SOL_IP, 0x41 /* IP_??? */, ...) = 0
after:
getsockopt(4, SOL_IP, IPT_SO_GET_INFO, ...) = 0
getsockopt(4, SOL_IP, IPT_SO_GET_ENTRIES, ...) = 0
If these were setsockopt calls, then 0x40 & 0x41 would be
IPT_SO_SET_REPLACE & IPT_SO_SET_ADD_COUNTERS.
* configure.ac: Check for netfilter headers.
* defs.h (printxvals): New prototype.
(printxval): Change to a define.
* net.c: Include netfilter headers and new sockopts headers.
(print_sockopt_fd_level_name): Add a is_getsockopt argument. Change SOL_IP
and SOL_IPV6 decoding to use printxvals, and use is_getsockopt to pass more
xlats down.
(getsockopt): Call print_sockopt_fd_level_name with is_getsockopt as true.
(setsockopt): Call print_sockopt_fd_level_name with is_getsockopt as false.
* util.c (printxval): Rename to ...
(printxvals): ... this. Rewrite to be varargs based.
* xlat/getsockipoptions.in: New xlat list.
* xlat/getsockipv6options.in, xlat/setsockipoptions.in,
xlat/setsockipv6options.in: Likewise.
2015-08-19 20:29:27 +03:00
# include "xlat/getsockipoptions.h"
# include "xlat/setsockipoptions.h"
2015-01-29 07:42:37 +03:00
# include "xlat/sockipv6options.h"
decode extend getsockopt/setsockopt options
Currently the code assumes the set of valid options between getsockopt
and setsockopt are exactly the same and thus maintains one list. The
kernel unfortunately does not do this -- it allows for different opts
between the get and set functions. See the {g,s}et_opt{min,max} fields
in the various netfilter subcores.
To support this, extend the printxval function to take multiple sets of
xlats as varargs. Then we add the new get/set lists, and pass them down
in the net code when decoding things.
A simple example is iptables; before:
getsockopt(4, SOL_IP, 0x40 /* IP_??? */, ...) = 0
getsockopt(4, SOL_IP, 0x41 /* IP_??? */, ...) = 0
after:
getsockopt(4, SOL_IP, IPT_SO_GET_INFO, ...) = 0
getsockopt(4, SOL_IP, IPT_SO_GET_ENTRIES, ...) = 0
If these were setsockopt calls, then 0x40 & 0x41 would be
IPT_SO_SET_REPLACE & IPT_SO_SET_ADD_COUNTERS.
* configure.ac: Check for netfilter headers.
* defs.h (printxvals): New prototype.
(printxval): Change to a define.
* net.c: Include netfilter headers and new sockopts headers.
(print_sockopt_fd_level_name): Add a is_getsockopt argument. Change SOL_IP
and SOL_IPV6 decoding to use printxvals, and use is_getsockopt to pass more
xlats down.
(getsockopt): Call print_sockopt_fd_level_name with is_getsockopt as true.
(setsockopt): Call print_sockopt_fd_level_name with is_getsockopt as false.
* util.c (printxval): Rename to ...
(printxvals): ... this. Rewrite to be varargs based.
* xlat/getsockipoptions.in: New xlat list.
* xlat/getsockipv6options.in, xlat/setsockipoptions.in,
xlat/setsockipv6options.in: Likewise.
2015-08-19 20:29:27 +03:00
# include "xlat/getsockipv6options.h"
# include "xlat/setsockipv6options.h"
2015-01-29 07:42:37 +03:00
# include "xlat/sockipxoptions.h"
# include "xlat/sockrawoptions.h"
# include "xlat/sockpacketoptions.h"
# include "xlat/socksctpoptions.h"
# include "xlat/socktcpoptions.h"
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
static void
2016-04-01 04:03:20 +03:00
print_sockopt_fd_level_name ( struct tcb * tcp , int fd , unsigned int level ,
unsigned int name , bool is_getsockopt )
1999-02-19 03:21:36 +03:00
{
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
printfd ( tcp , fd ) ;
tprints ( " , " ) ;
printxval ( socketlayers , level , " SOL_?? " ) ;
tprints ( " , " ) ;
switch ( level ) {
case SOL_SOCKET :
printxval ( sockoptions , name , " SO_??? " ) ;
break ;
case SOL_IP :
decode extend getsockopt/setsockopt options
Currently the code assumes the set of valid options between getsockopt
and setsockopt are exactly the same and thus maintains one list. The
kernel unfortunately does not do this -- it allows for different opts
between the get and set functions. See the {g,s}et_opt{min,max} fields
in the various netfilter subcores.
To support this, extend the printxval function to take multiple sets of
xlats as varargs. Then we add the new get/set lists, and pass them down
in the net code when decoding things.
A simple example is iptables; before:
getsockopt(4, SOL_IP, 0x40 /* IP_??? */, ...) = 0
getsockopt(4, SOL_IP, 0x41 /* IP_??? */, ...) = 0
after:
getsockopt(4, SOL_IP, IPT_SO_GET_INFO, ...) = 0
getsockopt(4, SOL_IP, IPT_SO_GET_ENTRIES, ...) = 0
If these were setsockopt calls, then 0x40 & 0x41 would be
IPT_SO_SET_REPLACE & IPT_SO_SET_ADD_COUNTERS.
* configure.ac: Check for netfilter headers.
* defs.h (printxvals): New prototype.
(printxval): Change to a define.
* net.c: Include netfilter headers and new sockopts headers.
(print_sockopt_fd_level_name): Add a is_getsockopt argument. Change SOL_IP
and SOL_IPV6 decoding to use printxvals, and use is_getsockopt to pass more
xlats down.
(getsockopt): Call print_sockopt_fd_level_name with is_getsockopt as true.
(setsockopt): Call print_sockopt_fd_level_name with is_getsockopt as false.
* util.c (printxval): Rename to ...
(printxvals): ... this. Rewrite to be varargs based.
* xlat/getsockipoptions.in: New xlat list.
* xlat/getsockipv6options.in, xlat/setsockipoptions.in,
xlat/setsockipv6options.in: Likewise.
2015-08-19 20:29:27 +03:00
printxvals ( name , " IP_??? " , sockipoptions ,
is_getsockopt ? getsockipoptions : setsockipoptions , NULL ) ;
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
break ;
case SOL_IPV6 :
decode extend getsockopt/setsockopt options
Currently the code assumes the set of valid options between getsockopt
and setsockopt are exactly the same and thus maintains one list. The
kernel unfortunately does not do this -- it allows for different opts
between the get and set functions. See the {g,s}et_opt{min,max} fields
in the various netfilter subcores.
To support this, extend the printxval function to take multiple sets of
xlats as varargs. Then we add the new get/set lists, and pass them down
in the net code when decoding things.
A simple example is iptables; before:
getsockopt(4, SOL_IP, 0x40 /* IP_??? */, ...) = 0
getsockopt(4, SOL_IP, 0x41 /* IP_??? */, ...) = 0
after:
getsockopt(4, SOL_IP, IPT_SO_GET_INFO, ...) = 0
getsockopt(4, SOL_IP, IPT_SO_GET_ENTRIES, ...) = 0
If these were setsockopt calls, then 0x40 & 0x41 would be
IPT_SO_SET_REPLACE & IPT_SO_SET_ADD_COUNTERS.
* configure.ac: Check for netfilter headers.
* defs.h (printxvals): New prototype.
(printxval): Change to a define.
* net.c: Include netfilter headers and new sockopts headers.
(print_sockopt_fd_level_name): Add a is_getsockopt argument. Change SOL_IP
and SOL_IPV6 decoding to use printxvals, and use is_getsockopt to pass more
xlats down.
(getsockopt): Call print_sockopt_fd_level_name with is_getsockopt as true.
(setsockopt): Call print_sockopt_fd_level_name with is_getsockopt as false.
* util.c (printxval): Rename to ...
(printxvals): ... this. Rewrite to be varargs based.
* xlat/getsockipoptions.in: New xlat list.
* xlat/getsockipv6options.in, xlat/setsockipoptions.in,
xlat/setsockipv6options.in: Likewise.
2015-08-19 20:29:27 +03:00
printxvals ( name , " IPV6_??? " , sockipv6options ,
is_getsockopt ? getsockipv6options : setsockipv6options , NULL ) ;
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
break ;
case SOL_IPX :
printxval ( sockipxoptions , name , " IPX_??? " ) ;
break ;
case SOL_PACKET :
printxval ( sockpacketoptions , name , " PACKET_??? " ) ;
break ;
case SOL_TCP :
printxval ( socktcpoptions , name , " TCP_??? " ) ;
break ;
case SOL_SCTP :
printxval ( socksctpoptions , name , " SCTP_??? " ) ;
break ;
case SOL_RAW :
printxval ( sockrawoptions , name , " RAW_??? " ) ;
break ;
1999-02-19 03:21:36 +03:00
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
/* Other SOL_* protocol levels still need work. */
default :
tprintf ( " %u " , name ) ;
}
tprints ( " , " ) ;
}
2002-05-22 19:46:49 +04:00
# ifdef SO_LINGER
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
static void
print_linger ( struct tcb * tcp , long addr , int len )
{
struct linger linger ;
if ( len ! = sizeof ( linger ) | |
umove ( tcp , addr , & linger ) < 0 ) {
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
printaddr ( addr ) ;
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
return ;
}
tprintf ( " {onoff=%d, linger=%d} " ,
linger . l_onoff ,
linger . l_linger ) ;
}
# endif /* SO_LINGER */
2010-12-03 19:54:53 +03:00
# ifdef SO_PEERCRED
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
static void
print_ucred ( struct tcb * tcp , long addr , int len )
{
struct ucred uc ;
if ( len ! = sizeof ( uc ) | |
umove ( tcp , addr , & uc ) < 0 ) {
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
printaddr ( addr ) ;
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
} else {
tprintf ( " {pid=%u, uid=%u, gid=%u} " ,
( unsigned ) uc . pid ,
( unsigned ) uc . uid ,
( unsigned ) uc . gid ) ;
}
}
# endif /* SO_PEERCRED */
2009-11-13 15:51:04 +03:00
# ifdef PACKET_STATISTICS
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
static void
print_tpacket_stats ( struct tcb * tcp , long addr , int len )
{
struct tpacket_stats stats ;
2002-05-22 19:46:49 +04:00
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
if ( len ! = sizeof ( stats ) | |
umove ( tcp , addr , & stats ) < 0 ) {
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
printaddr ( addr ) ;
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
} else {
tprintf ( " {packets=%u, drops=%u} " ,
stats . tp_packets ,
stats . tp_drops ) ;
1999-02-19 03:21:36 +03:00
}
}
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
# endif /* PACKET_STATISTICS */
1999-02-19 03:21:36 +03:00
2016-06-16 00:29:07 +03:00
# include "xlat/icmpfilterflags.h"
2015-01-29 07:42:37 +03:00
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
static void
2016-05-06 03:06:15 +03:00
print_icmp_filter ( struct tcb * tcp , const long addr , int len )
2000-07-05 20:05:39 +04:00
{
2016-05-06 03:06:15 +03:00
struct icmp_filter filter = { } ;
2000-07-05 20:05:39 +04:00
2016-05-06 03:06:15 +03:00
if ( len > ( int ) sizeof ( filter ) )
len = sizeof ( filter ) ;
else if ( len < = 0 ) {
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
printaddr ( addr ) ;
2000-07-05 20:05:39 +04:00
return ;
}
2016-05-06 03:06:15 +03:00
if ( umoven_or_printaddr ( tcp , addr , len , & filter ) )
return ;
2011-09-01 12:00:28 +04:00
tprints ( " ~( " ) ;
2005-05-31 Dmitry V. Levin <ldv@altlinux.org>
* util.c (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument, "const char *", with similar
meaning to the third argument of printxval().
* defs.h (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument.
* bjm.c (sys_query_module) [LINUX]: Pass third argument to
printflags().
* desc.c (sys_fcntl): Likewise.
(sys_flock) [LOCK_SH]: Likewise.
(print_epoll_event) [HAVE_SYS_EPOLL_H]: Likewise.
* file.c (sys_open): Likewise.
(solaris_open) [LINUXSPARC]: Likewise.
(sys_access): Likewise.
(sys_chflags, sys_fchflags) [FREEBSD]: Likewise.
(realprintstat) [HAVE_LONG_LONG_OFF_T &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(printstat64) [HAVE_STAT64 &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(sys_setxattr, sys_fsetxattr): Likewise.
* ipc.c (sys_msgget, sys_msgsnd, sys_msgrcv, sys_semget,
sys_shmget, sys_shmat) [LINUX || SUNOS4 || FREEBSD]: Likewise.
(sys_mq_open) [LINUX]: Likewise.
(printmqattr) [HAVE_MQUEUE_H]: Likewise.
* mem.c (print_mmap) [!HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mmap64) [_LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mprotect): Likewise.
(sys_mremap, sys_madvise, sys_mlockall) [LINUX]: Likewise.
(sys_msync) [MS_ASYNC]: Likewise.
(sys_mctl) [MC_SYNC]: Likewise.
(sys_remap_file_pages, sys_mbind, sys_get_mempolicy) [LINUX]:
Likewise.
* net.c (printmsghdr) [HAVE_STRUCT_MSGHDR_MSG_CONTROL]: Likewise.
(sys_send, sys_sendto): Likewise.
(sys_sendmsg) [HAVE_SENDMSG]: Likewise.
(sys_recv, sys_recvfrom): Likewise.
(sys_recvmsg) [HAVE_SENDMSG]: Likewise.
(printicmpfilter) [ICMP_FILTER]: Likewise.
* proc.c (proc_ioctl) [SVR4 && !HAVE_MP_PROCFS || FREEBSD]: Likewise.
* process.c (sys_clone) [LINUX]: Likewise.
(printwaitn): Likewise.
(sys_waitid) [SVR4 || LINUX]: Likewise.
* signal.c (sys_sigvec) [SUNOS4 || FREEBSD]: Likewise.
(sys_sigaction): Likewise.
(printcontext) [SVR4]: Likewise.
(print_stack_t) [LINUX) || FREEBSD]: Likewise.
(sys_rt_sigaction) [LINUX]: Likewise.
* sock.c (sock_ioctl) [LINUX]: Likewise.
* stream.c (sys_putmsg, sys_getmsg): Likewise.
(sys_putpmsg) [SYS_putpmsg]: Likewise.
(sys_getpmsg) [SYS_getpmsg]: Likewise.
(sys_poll): Likewise.
(print_transport_message) [TI_BIND]: Likewise.
(stream_ioctl): Likewise.
* system.c (sys_mount, sys_reboot): Likewise.
(sys_cacheflush) [LINUX && M68K]: Likewise.
(sys_capget, sys_capset) [SYS_capget]: Likewise.
* term.c (term_ioctl) [TIOCMGET]: Likewise.
* time.c (sys_clock_nanosleep, sys_timer_settime) [LINUX]:
Likewise.
Fixes RH#159310.
2005-06-01 23:02:36 +04:00
printflags ( icmpfilterflags , ~ filter . data , " ICMP_??? " ) ;
2011-09-01 12:00:28 +04:00
tprints ( " ) " ) ;
2000-07-05 20:05:39 +04:00
}
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
static void
2016-04-01 04:03:20 +03:00
print_getsockopt ( struct tcb * tcp , unsigned int level , unsigned int name ,
long addr , int len )
1999-02-19 03:21:36 +03:00
{
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
if ( addr & & verbose ( tcp ) )
2002-05-23 15:48:58 +04:00
switch ( level ) {
2012-03-17 07:42:07 +04:00
case SOL_SOCKET :
2002-05-23 15:48:58 +04:00
switch ( name ) {
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
# ifdef SO_LINGER
2012-03-17 07:42:07 +04:00
case SO_LINGER :
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
print_linger ( tcp , addr , len ) ;
goto done ;
# endif
# ifdef SO_PEERCRED
case SO_PEERCRED :
print_ucred ( tcp , addr , len ) ;
goto done ;
2002-05-23 15:48:58 +04:00
# endif
}
break ;
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
case SOL_PACKET :
switch ( name ) {
2015-01-29 07:42:37 +03:00
# ifdef PACKET_STATISTICS
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
case PACKET_STATISTICS :
print_tpacket_stats ( tcp , addr , len ) ;
goto done ;
2015-01-29 07:42:37 +03:00
# endif
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
}
2002-05-23 15:48:58 +04:00
break ;
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
case SOL_RAW :
switch ( name ) {
case ICMP_FILTER :
print_icmp_filter ( tcp , addr , len ) ;
goto done ;
}
2004-08-31 11:01:26 +04:00
break ;
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
}
/* default arg printing */
if ( verbose ( tcp ) ) {
if ( len = = sizeof ( int ) ) {
printnum_int ( tcp , addr , " %d " ) ;
} else {
printstr ( tcp , addr , len ) ;
}
} else {
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
printaddr ( addr ) ;
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
}
done :
tprintf ( " , [%d] " , len ) ;
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( getsockopt )
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
{
if ( entering ( tcp ) ) {
print_sockopt_fd_level_name ( tcp , tcp - > u_arg [ 0 ] ,
decode extend getsockopt/setsockopt options
Currently the code assumes the set of valid options between getsockopt
and setsockopt are exactly the same and thus maintains one list. The
kernel unfortunately does not do this -- it allows for different opts
between the get and set functions. See the {g,s}et_opt{min,max} fields
in the various netfilter subcores.
To support this, extend the printxval function to take multiple sets of
xlats as varargs. Then we add the new get/set lists, and pass them down
in the net code when decoding things.
A simple example is iptables; before:
getsockopt(4, SOL_IP, 0x40 /* IP_??? */, ...) = 0
getsockopt(4, SOL_IP, 0x41 /* IP_??? */, ...) = 0
after:
getsockopt(4, SOL_IP, IPT_SO_GET_INFO, ...) = 0
getsockopt(4, SOL_IP, IPT_SO_GET_ENTRIES, ...) = 0
If these were setsockopt calls, then 0x40 & 0x41 would be
IPT_SO_SET_REPLACE & IPT_SO_SET_ADD_COUNTERS.
* configure.ac: Check for netfilter headers.
* defs.h (printxvals): New prototype.
(printxval): Change to a define.
* net.c: Include netfilter headers and new sockopts headers.
(print_sockopt_fd_level_name): Add a is_getsockopt argument. Change SOL_IP
and SOL_IPV6 decoding to use printxvals, and use is_getsockopt to pass more
xlats down.
(getsockopt): Call print_sockopt_fd_level_name with is_getsockopt as true.
(setsockopt): Call print_sockopt_fd_level_name with is_getsockopt as false.
* util.c (printxval): Rename to ...
(printxvals): ... this. Rewrite to be varargs based.
* xlat/getsockipoptions.in: New xlat list.
* xlat/getsockipv6options.in, xlat/setsockipoptions.in,
xlat/setsockipv6options.in: Likewise.
2015-08-19 20:29:27 +03:00
tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] , true ) ;
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
} else {
int len ;
if ( syserror ( tcp ) | | umove ( tcp , tcp - > u_arg [ 4 ] , & len ) < 0 ) {
2016-06-11 04:28:21 +03:00
printaddr ( tcp - > u_arg [ 3 ] ) ;
tprints ( " , " ) ;
printaddr ( tcp - > u_arg [ 4 ] ) ;
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
} else {
print_getsockopt ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ,
tcp - > u_arg [ 3 ] , len ) ;
}
}
return 0 ;
}
2015-06-08 17:19:46 +03:00
# ifdef IP_ADD_MEMBERSHIP
static void
print_mreq ( struct tcb * tcp , long addr , unsigned int len )
{
struct ip_mreq mreq ;
if ( len < sizeof ( mreq ) ) {
printstr ( tcp , addr , len ) ;
return ;
}
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
if ( umove_or_printaddr ( tcp , addr , & mreq ) )
2015-06-08 17:19:46 +03:00
return ;
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
2015-06-08 17:19:46 +03:00
tprints ( " {imr_multiaddr=inet_addr( " ) ;
print_quoted_string ( inet_ntoa ( mreq . imr_multiaddr ) ,
16 , QUOTE_0_TERMINATED ) ;
tprints ( " ), imr_interface=inet_addr( " ) ;
print_quoted_string ( inet_ntoa ( mreq . imr_interface ) ,
16 , QUOTE_0_TERMINATED ) ;
tprints ( " )} " ) ;
}
# endif /* IP_ADD_MEMBERSHIP */
# ifdef IPV6_ADD_MEMBERSHIP
static void
print_mreq6 ( struct tcb * tcp , long addr , unsigned int len )
{
struct ipv6_mreq mreq ;
if ( len < sizeof ( mreq ) )
goto fail ;
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
if ( umove_or_printaddr ( tcp , addr , & mreq ) )
2015-06-08 17:19:46 +03:00
return ;
# ifdef HAVE_INET_NTOP
const struct in6_addr * in6 = & mreq . ipv6mr_multiaddr ;
char address [ INET6_ADDRSTRLEN ] ;
if ( ! inet_ntop ( AF_INET6 , in6 , address , sizeof ( address ) ) )
goto fail ;
tprints ( " {ipv6mr_multiaddr=inet_pton( " ) ;
print_quoted_string ( address , sizeof ( address ) , QUOTE_0_TERMINATED ) ;
tprints ( " ), ipv6mr_interface= " ) ;
print_ifindex ( mreq . ipv6mr_interface ) ;
tprints ( " } " ) ;
return ;
# endif /* HAVE_INET_NTOP */
fail :
printstr ( tcp , addr , len ) ;
}
# endif /* IPV6_ADD_MEMBERSHIP */
2015-01-30 04:55:20 +03:00
# ifdef MCAST_JOIN_GROUP
static void
print_group_req ( struct tcb * tcp , long addr , int len )
{
struct group_req greq ;
if ( len ! = sizeof ( greq ) | |
umove ( tcp , addr , & greq ) < 0 ) {
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
printaddr ( addr ) ;
2015-01-30 04:55:20 +03:00
return ;
}
2015-11-21 05:38:59 +03:00
tprintf ( " {gr_interface=%u, gr_group= " , greq . gr_interface ) ;
print_sockaddr ( tcp , ( const void * ) & greq . gr_group ,
sizeof ( greq . gr_group ) ) ;
tprintf ( " } " ) ;
2015-01-30 04:55:20 +03:00
}
# endif /* MCAST_JOIN_GROUP */
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
# ifdef PACKET_RX_RING
static void
print_tpacket_req ( struct tcb * tcp , long addr , int len )
{
struct tpacket_req req ;
if ( len ! = sizeof ( req ) | |
umove ( tcp , addr , & req ) < 0 ) {
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
printaddr ( addr ) ;
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
} else {
tprintf ( " {block_size=%u, block_nr=%u, "
" frame_size=%u, frame_nr=%u} " ,
req . tp_block_size ,
req . tp_block_nr ,
req . tp_frame_size ,
req . tp_frame_nr ) ;
}
}
# endif /* PACKET_RX_RING */
2015-01-29 06:26:53 +03:00
# ifdef PACKET_ADD_MEMBERSHIP
# include "xlat / packet_mreq_type.h"
static void
print_packet_mreq ( struct tcb * tcp , long addr , int len )
{
struct packet_mreq mreq ;
if ( len ! = sizeof ( mreq ) | |
umove ( tcp , addr , & mreq ) < 0 ) {
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
printaddr ( addr ) ;
2015-01-29 06:26:53 +03:00
} else {
unsigned int i ;
tprintf ( " {mr_ifindex=%u, mr_type= " , mreq . mr_ifindex ) ;
printxval ( packet_mreq_type , mreq . mr_type , " PACKET_MR_??? " ) ;
tprintf ( " , mr_alen=%u, mr_address= " , mreq . mr_alen ) ;
if ( mreq . mr_alen > ARRAY_SIZE ( mreq . mr_address ) )
mreq . mr_alen = ARRAY_SIZE ( mreq . mr_address ) ;
for ( i = 0 ; i < mreq . mr_alen ; + + i )
tprintf ( " %02x " , mreq . mr_address [ i ] ) ;
tprints ( " } " ) ;
}
}
# endif /* PACKET_ADD_MEMBERSHIP */
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
static void
2016-04-01 04:03:20 +03:00
print_setsockopt ( struct tcb * tcp , unsigned int level , unsigned int name ,
long addr , int len )
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
{
if ( addr & & verbose ( tcp ) )
switch ( level ) {
case SOL_SOCKET :
switch ( name ) {
# ifdef SO_LINGER
case SO_LINGER :
print_linger ( tcp , addr , len ) ;
goto done ;
2004-08-31 11:01:26 +04:00
# endif
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
}
2002-05-23 15:48:58 +04:00
break ;
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
2015-01-30 04:55:20 +03:00
case SOL_IP :
switch ( name ) {
2015-06-08 17:19:46 +03:00
# ifdef IP_ADD_MEMBERSHIP
case IP_ADD_MEMBERSHIP :
case IP_DROP_MEMBERSHIP :
print_mreq ( tcp , addr , len ) ;
goto done ;
# endif /* IP_ADD_MEMBERSHIP */
2015-01-30 04:55:20 +03:00
# ifdef MCAST_JOIN_GROUP
case MCAST_JOIN_GROUP :
case MCAST_LEAVE_GROUP :
print_group_req ( tcp , addr , len ) ;
goto done ;
# endif /* MCAST_JOIN_GROUP */
}
2015-02-08 04:19:06 +03:00
break ;
2015-06-08 17:19:46 +03:00
case SOL_IPV6 :
switch ( name ) {
# ifdef IPV6_ADD_MEMBERSHIP
case IPV6_ADD_MEMBERSHIP :
case IPV6_DROP_MEMBERSHIP :
# ifdef IPV6_JOIN_ANYCAST
case IPV6_JOIN_ANYCAST :
# endif
# ifdef IPV6_LEAVE_ANYCAST
case IPV6_LEAVE_ANYCAST :
# endif
print_mreq6 ( tcp , addr , len ) ;
goto done ;
# endif /* IPV6_ADD_MEMBERSHIP */
}
break ;
2015-01-30 04:55:20 +03:00
2012-03-17 07:42:07 +04:00
case SOL_PACKET :
2009-11-13 15:51:04 +03:00
switch ( name ) {
2015-01-29 07:42:37 +03:00
# ifdef PACKET_RX_RING
2012-03-17 07:42:07 +04:00
case PACKET_RX_RING :
2015-01-29 07:42:37 +03:00
# ifdef PACKET_TX_RING
2012-03-17 07:42:07 +04:00
case PACKET_TX_RING :
2015-01-29 07:42:37 +03:00
# endif
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
print_tpacket_req ( tcp , addr , len ) ;
goto done ;
2015-01-29 07:42:37 +03:00
# endif /* PACKET_RX_RING */
# ifdef PACKET_ADD_MEMBERSHIP
2015-01-29 06:26:53 +03:00
case PACKET_ADD_MEMBERSHIP :
case PACKET_DROP_MEMBERSHIP :
print_packet_mreq ( tcp , addr , len ) ;
goto done ;
2015-01-29 07:42:37 +03:00
# endif /* PACKET_ADD_MEMBERSHIP */
2009-11-13 15:51:04 +03:00
}
2002-05-23 15:48:58 +04:00
break ;
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
2012-03-17 07:42:07 +04:00
case SOL_RAW :
2002-05-23 15:48:58 +04:00
switch ( name ) {
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
case ICMP_FILTER :
print_icmp_filter ( tcp , addr , len ) ;
goto done ;
2002-05-23 15:48:58 +04:00
}
break ;
}
2002-05-22 19:46:49 +04:00
2002-05-23 15:48:58 +04:00
/* default arg printing */
2002-05-22 19:46:49 +04:00
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
if ( verbose ( tcp ) ) {
if ( len = = sizeof ( int ) ) {
printnum_int ( tcp , addr , " %d " ) ;
} else {
printstr ( tcp , addr , len ) ;
}
} else {
net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:36:46 +03:00
printaddr ( addr ) ;
2002-05-23 15:48:58 +04:00
}
getsockopt, setsockopt: do not decode structures in non-verbose mode
Move the code that is common between getsockopt and setsockopt parsers
to a separate function.
Move printers specific to getsockopt and setsockopt to separate
functions, choose appropriate parsers depending on verbose mode.
Move parsers of specific socket options to separate functions.
* net.c (printicmpfilter): Rename to print_icmp_filter.
(printsockopt): Remove.
(print_sockopt_fd_level_name, print_linger, print_ucred,
print_tpacket_stats, print_getsockopt, print_tpacket_req,
print_packet_mreq, print_setsockopt): New functions.
(sys_getsockopt, sys_setsockopt): Use them.
2015-01-29 06:11:41 +03:00
done :
tprintf ( " , %d " , len ) ;
2002-05-23 15:48:58 +04:00
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( setsockopt )
2002-05-23 15:48:58 +04:00
{
2015-07-20 01:52:47 +03:00
print_sockopt_fd_level_name ( tcp , tcp - > u_arg [ 0 ] ,
decode extend getsockopt/setsockopt options
Currently the code assumes the set of valid options between getsockopt
and setsockopt are exactly the same and thus maintains one list. The
kernel unfortunately does not do this -- it allows for different opts
between the get and set functions. See the {g,s}et_opt{min,max} fields
in the various netfilter subcores.
To support this, extend the printxval function to take multiple sets of
xlats as varargs. Then we add the new get/set lists, and pass them down
in the net code when decoding things.
A simple example is iptables; before:
getsockopt(4, SOL_IP, 0x40 /* IP_??? */, ...) = 0
getsockopt(4, SOL_IP, 0x41 /* IP_??? */, ...) = 0
after:
getsockopt(4, SOL_IP, IPT_SO_GET_INFO, ...) = 0
getsockopt(4, SOL_IP, IPT_SO_GET_ENTRIES, ...) = 0
If these were setsockopt calls, then 0x40 & 0x41 would be
IPT_SO_SET_REPLACE & IPT_SO_SET_ADD_COUNTERS.
* configure.ac: Check for netfilter headers.
* defs.h (printxvals): New prototype.
(printxval): Change to a define.
* net.c: Include netfilter headers and new sockopts headers.
(print_sockopt_fd_level_name): Add a is_getsockopt argument. Change SOL_IP
and SOL_IPV6 decoding to use printxvals, and use is_getsockopt to pass more
xlats down.
(getsockopt): Call print_sockopt_fd_level_name with is_getsockopt as true.
(setsockopt): Call print_sockopt_fd_level_name with is_getsockopt as false.
* util.c (printxval): Rename to ...
(printxvals): ... this. Rewrite to be varargs based.
* xlat/getsockipoptions.in: New xlat list.
* xlat/getsockipv6options.in, xlat/setsockipoptions.in,
xlat/setsockipv6options.in: Likewise.
2015-08-19 20:29:27 +03:00
tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] , false ) ;
2015-07-20 01:52:47 +03:00
print_setsockopt ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ,
tcp - > u_arg [ 3 ] , tcp - > u_arg [ 4 ] ) ;
return RVAL_DECODED ;
1999-02-19 03:21:36 +03:00
}