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
1999-11-18 20:09:47 +03:00
# if defined(HAVE_LINUX_NETLINK_H)
2012-03-16 15:02:22 +04:00
# include <linux / netlink.h>
1999-11-18 20:09:47 +03:00
# endif
# if defined(HAVE_LINUX_IF_PACKET_H)
2012-03-16 15:02:22 +04:00
# include <linux / if_packet.h>
1999-11-18 20:09:47 +03:00
# endif
2000-07-05 20:05:39 +04:00
# if defined(HAVE_LINUX_ICMP_H)
2012-03-16 15:02:22 +04:00
# include <linux / icmp.h>
2000-07-05 20:05:39 +04:00
# endif
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
# ifndef PF_UNSPEC
2012-03-16 15:02:22 +04:00
# define PF_UNSPEC AF_UNSPEC
1999-02-19 03:21:36 +03:00
# endif
2014-04-26 03:30:54 +04:00
# include "xlat/domains.h"
# 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
# ifdef PF_NETLINK
2015-01-09 06:03:39 +03:00
# if !defined NETLINK_SOCK_DIAG && defined NETLINK_INET_DIAG
# define NETLINK_SOCK_DIAG NETLINK_INET_DIAG
# endif
# include "xlat / netlink_protocols.h"
2014-03-11 18:37:37 +04:00
# endif
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
2002-04-01 16:48:06 +04:00
# if defined(AF_PACKET) /* from e.g. linux/if_packet.h */
2015-01-29 07:42:37 +03:00
# include "xlat / af_packet_types.h"
# endif
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 ) ;
}
1999-02-19 03:21:36 +03:00
void
2007-10-09 03:31:19 +04:00
printsock ( struct tcb * tcp , long addr , int addrlen )
1999-02-19 03:21:36 +03:00
{
1999-11-18 20:09:47 +03:00
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
1999-11-18 20:09:47 +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)
1999-11-18 20:09:47 +03:00
struct sockaddr_ipx sipx ;
# endif
# ifdef AF_PACKET
struct sockaddr_ll ll ;
1999-02-19 03:21:36 +03:00
# endif
1999-11-18 20:09:47 +03:00
# ifdef AF_NETLINK
struct sockaddr_nl nl ;
2014-10-03 13:40:28 +04:00
# endif
# ifdef HAVE_BLUETOOTH_BLUETOOTH_H
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
} addrbuf ;
char string_addr [ 100 ] ;
1999-02-19 03:21:36 +03:00
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
if ( addrlen < 2 ) {
2015-07-30 16:53:42 +03:00
printaddr ( addr ) ;
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
return ;
}
if ( addrlen > ( int ) sizeof ( addrbuf ) )
2007-10-09 03:31:19 +04:00
addrlen = sizeof ( addrbuf ) ;
memset ( & addrbuf , 0 , sizeof ( addrbuf ) ) ;
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 ( umoven_or_printaddr ( tcp , addr , addrlen , addrbuf . pad ) )
1999-02-19 03:21:36 +03:00
return ;
2007-10-09 03:31:19 +04:00
addrbuf . pad [ sizeof ( addrbuf . pad ) - 1 ] = ' \0 ' ;
1999-11-18 20:09:47 +03:00
2011-09-01 12:00:28 +04:00
tprints ( " {sa_family= " ) ;
1999-11-18 20:09:47 +03:00
printxval ( addrfams , addrbuf . sa . sa_family , " AF_??? " ) ;
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
1999-11-18 20:09:47 +03:00
switch ( addrbuf . 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 " ) ;
1999-11-18 20:09:47 +03:00
} else if ( addrbuf . sau . sun_path [ 0 ] ) {
2012-02-22 04:23:52 +04:00
tprints ( " sun_path= " ) ;
2015-01-29 10:34:40 +03:00
print_quoted_string ( addrbuf . sau . sun_path ,
2015-01-29 18:19:21 +03:00
sizeof ( addrbuf . 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-01-29 10:34:40 +03:00
print_quoted_string ( addrbuf . sau . sun_path + 1 ,
2015-01-29 18:19:21 +03:00
sizeof ( addrbuf . 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 \" ) " ,
1999-11-18 20:09:47 +03:00
ntohs ( addrbuf . sin . sin_port ) , inet_ntoa ( addrbuf . 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 :
1999-11-18 20:09:47 +03:00
inet_ntop ( AF_INET6 , & addrbuf . sa6 . sin6_addr , string_addr , sizeof ( string_addr ) ) ;
2001-02-16 23:29:03 +03:00
tprintf ( " sin6_port=htons(%u), inet_pton(AF_INET6, \" %s \" , &sin6_addr), sin6_flowinfo=%u " ,
ntohs ( addrbuf . sa6 . sin6_port ) , string_addr ,
addrbuf . sa6 . sin6_flowinfo ) ;
2002-12-30 03:51:30 +03:00
# ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
2015-06-05 23:13:21 +03:00
tprints ( " , sin6_scope_id= " ) ;
# if defined IN6_IS_ADDR_LINKLOCAL && defined IN6_IS_ADDR_MC_LINKLOCAL
if ( IN6_IS_ADDR_LINKLOCAL ( & addrbuf . sa6 . sin6_addr )
| | IN6_IS_ADDR_MC_LINKLOCAL ( & addrbuf . sa6 . sin6_addr ) )
print_ifindex ( addrbuf . sa6 . sin6_scope_id ) ;
else
# endif
tprintf ( " %u " , addrbuf . 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), " ,
1999-11-18 20:09:47 +03:00
ntohs ( addrbuf . 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
*/
1999-11-18 20:09:47 +03:00
tprintf ( " %08lx: " , ( unsigned long ) ntohl ( addrbuf . sipx . sipx_network ) ) ;
2011-06-07 14:13:24 +04:00
for ( i = 0 ; i < IPX_NODE_LEN ; i + + )
1999-11-18 20:09:47 +03:00
tprintf ( " %02x " , addrbuf . sipx . sipx_node [ i ] ) ;
tprintf ( " /[%02x] " , addrbuf . sipx . sipx_type ) ;
}
break ;
2012-02-25 05:38:52 +04:00
# endif /* AF_IPX */
1999-11-18 20:09:47 +03:00
# ifdef AF_PACKET
case AF_PACKET :
{
int i ;
2002-04-01 16:48:06 +04:00
tprintf ( " proto=%#04x, if%d, pkttype= " ,
1999-11-18 20:09:47 +03:00
ntohs ( addrbuf . ll . sll_protocol ) ,
2002-04-01 16:48:06 +04:00
addrbuf . ll . sll_ifindex ) ;
2014-09-10 04:13:56 +04:00
printxval ( af_packet_types , addrbuf . ll . sll_pkttype , " PACKET_??? " ) ;
2002-04-01 16:48:06 +04:00
tprintf ( " , addr(%d)={%d, " ,
1999-11-18 20:09:47 +03:00
addrbuf . ll . sll_halen ,
addrbuf . ll . sll_hatype ) ;
2011-06-07 14:13:24 +04:00
for ( i = 0 ; i < addrbuf . ll . sll_halen ; i + + )
1999-11-18 20:09:47 +03:00
tprintf ( " %02x " , addrbuf . ll . sll_addr [ i ] ) ;
1999-02-19 03:21:36 +03:00
}
break ;
1999-11-18 20:09:47 +03:00
2012-02-25 05:38:52 +04:00
# endif /* AF_PACKET */
2003-11-07 02:41:23 +03:00
# ifdef AF_NETLINK
1999-11-18 20:09:47 +03:00
case AF_NETLINK :
tprintf ( " pid=%d, groups=%08x " , addrbuf . nl . nl_pid , addrbuf . nl . nl_groups ) ;
break ;
# endif /* AF_NETLINK */
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)} " ,
addrbuf . sco . sco_bdaddr . b [ 0 ] , addrbuf . sco . sco_bdaddr . b [ 1 ] ,
addrbuf . sco . sco_bdaddr . b [ 2 ] , addrbuf . sco . sco_bdaddr . b [ 3 ] ,
addrbuf . sco . sco_bdaddr . b [ 4 ] , addrbuf . sco . sco_bdaddr . b [ 5 ] ,
addrbuf . rc . rc_bdaddr . b [ 0 ] , addrbuf . rc . rc_bdaddr . b [ 1 ] ,
addrbuf . rc . rc_bdaddr . b [ 2 ] , addrbuf . rc . rc_bdaddr . b [ 3 ] ,
addrbuf . rc . rc_bdaddr . b [ 4 ] , addrbuf . rc . rc_bdaddr . b [ 5 ] ,
addrbuf . rc . rc_channel ,
btohs ( addrbuf . l2 . l2_psm ) , addrbuf . l2 . l2_bdaddr . b [ 0 ] ,
addrbuf . l2 . l2_bdaddr . b [ 1 ] , addrbuf . l2 . l2_bdaddr . b [ 2 ] ,
addrbuf . l2 . l2_bdaddr . b [ 3 ] , addrbuf . l2 . l2_bdaddr . b [ 4 ] ,
addrbuf . l2 . l2_bdaddr . b [ 5 ] , btohs ( addrbuf . l2 . l2_cid ) ,
btohs ( addrbuf . hci . hci_dev ) ) ;
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-01-30 16:36:49 +03:00
print_quoted_string ( addrbuf . sa . sa_data ,
sizeof ( addrbuf . 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-06-17 23:09:13 +03:00
# ifdef HAVE_SENDMSG
2015-01-24 18:20:31 +03:00
# ifndef SCM_SECURITY
# define SCM_SECURITY 0x03
# endif
# include "xlat / scmvals.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-01-24 18:20:31 +03:00
static bool
print_scm_rights ( struct tcb * tcp , size_t cmsg_size , char * ptr , size_t cmsg_len )
2004-10-07 02:11:51 +04:00
{
2015-01-24 18:20:31 +03:00
if ( cmsg_size + sizeof ( int ) > cmsg_len )
return false ;
int * fds = ( int * ) ( ptr + cmsg_size ) ;
bool seen = false ;
tprints ( " , [ " ) ;
while ( ( char * ) fds < ( ptr + cmsg_len ) ) {
if ( seen )
tprints ( " , " ) ;
else
seen = true ;
printfd ( tcp , * fds + + ) ;
}
tprints ( " ]} " ) ;
return true ;
}
static bool
print_scm_creds ( struct tcb * tcp , size_t cmsg_size , char * ptr , size_t cmsg_len )
{
if ( cmsg_size + sizeof ( struct ucred ) > cmsg_len )
return false ;
const struct ucred * uc = ( void * ) ( ptr + cmsg_size ) ;
tprintf ( " , {pid=%u, uid=%u, gid=%u}} " ,
( unsigned ) uc - > pid , ( unsigned ) uc - > uid , ( unsigned ) uc - > gid ) ;
return true ;
}
static bool
print_scm_security ( struct tcb * tcp , size_t cmsg_size , char * ptr , size_t cmsg_len )
{
if ( cmsg_size + sizeof ( char ) > cmsg_len )
return false ;
const char * label = ( const char * ) ( ptr + cmsg_size ) ;
const size_t label_len = cmsg_len - cmsg_size ;
2015-01-24 04:08:57 +03:00
2015-01-26 04:17:08 +03:00
tprints ( " , " ) ;
print_quoted_string ( label , label_len , 0 ) ;
tprints ( " } " ) ;
2015-01-24 18:20:31 +03:00
return true ;
}
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 ;
if ( cmsg_level = = SOL_SOCKET ) {
printxval ( scmvals , cmsg_type , " SCM_??? " ) ;
switch ( cmsg_type ) {
case SCM_RIGHTS :
if ( print_scm_rights ( tcp , cmsg_size , u . ptr , cmsg_len ) )
goto next_cmsg ;
break ;
case SCM_CREDENTIALS :
if ( print_scm_creds ( tcp , cmsg_size , u . ptr , cmsg_len ) )
goto next_cmsg ;
break ;
case SCM_SECURITY :
if ( print_scm_security ( tcp , cmsg_size , u . ptr , cmsg_len ) )
goto next_cmsg ;
break ;
2004-10-07 02:11:51 +04:00
}
2015-01-24 18:20:31 +03:00
} else {
tprintf ( " %u " , cmsg_type ) ;
}
tprints ( " , ...} " ) ;
next_cmsg :
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
dumpiov_in_msghdr ( struct tcb * tcp , long addr )
{
struct msghdr msg ;
if ( extractmsghdr ( tcp , addr , & msg ) )
dumpiov ( tcp , msg . msg_iovlen , ( long ) msg . msg_iov ) ;
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 ) ;
dumpiov ( tcp , mmsg . msg_hdr . msg_iovlen ,
( long ) mmsg . msg_hdr . msg_iov ) ;
}
}
}
1999-02-19 03:21:36 +03:00
# endif /* HAVE_SENDMSG */
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
2014-09-10 21:48:28 +04:00
tprint_sock_type ( 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
{
2015-07-20 01:52:47 +03:00
printxval ( domains , tcp - > u_arg [ 0 ] , " PF_??? " ) ;
tprints ( " , " ) ;
tprint_sock_type ( tcp - > u_arg [ 1 ] ) ;
tprints ( " , " ) ;
switch ( tcp - > u_arg [ 0 ] ) {
case PF_INET :
2003-06-24 03:39:59 +04:00
# ifdef PF_INET6
2015-07-20 01:52:47 +03:00
case PF_INET6 :
2003-06-24 03:39:59 +04:00
# endif
2015-07-20 01:52:47 +03:00
printxval ( inet_protocols , tcp - > u_arg [ 2 ] , " IPPROTO_??? " ) ;
break ;
1999-02-19 03:21:36 +03:00
# ifdef PF_IPX
2015-07-20 01:52:47 +03:00
case PF_IPX :
/* BTW: I don't believe this.. */
tprints ( " [ " ) ;
printxval ( domains , tcp - > u_arg [ 2 ] , " PF_??? " ) ;
tprints ( " ] " ) ;
break ;
1999-02-19 03:21:36 +03:00
# endif /* PF_IPX */
2014-03-11 18:37:37 +04:00
# ifdef PF_NETLINK
2015-07-20 01:52:47 +03:00
case PF_NETLINK :
printxval ( netlink_protocols , tcp - > u_arg [ 2 ] , " NETLINK_??? " ) ;
break ;
2014-10-03 13:40:28 +04:00
# endif
# if defined(PF_BLUETOOTH) && defined(HAVE_BLUETOOTH_BLUETOOTH_H)
2015-07-20 01:52:47 +03:00
case PF_BLUETOOTH :
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
}
# ifdef HAVE_SENDMSG
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 ) ) {
tprintf ( " %#lx, %u, " ,
tcp - > u_arg [ 1 ] , ( unsigned int ) tcp - > u_arg [ 2 ] ) ;
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 ;
}
1999-02-19 03:21:36 +03:00
# endif /* HAVE_SENDMSG */
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 ;
}
# ifdef HAVE_SENDMSG
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
{
2012-01-20 14:04:04 +04:00
/* +5 chars are for "left " prefix */
static char str [ 5 + 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 ) ) {
sprint_timespec ( str , tcp , tcp - > u_arg [ 4 ] ) ;
2012-01-20 14:04:04 +04:00
/* Abusing tcp->auxstr as temp storage.
* Will be used and freed on syscall exit .
*/
Introduce memory allocation wrappers
Introduce wrappers to the following functions that do memory allocation:
malloc, calloc, realloc, strdup.
This commit is a follow-up to the related discussions in strace-devel ML:
http://sourceforge.net/p/strace/mailman/message/33618180/
http://sourceforge.net/p/strace/mailman/message/33733470/
* defs.h (xmalloc, xcalloc, xreallocarray, xstrdup): New prototypes.
* xmalloc.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* count.c (count_syscall, call_summary_pers): Use xcalloc.
* desc.c (decode_select): Use xmalloc.
* dirent.c (sys_getdents, sys_getdents64): Likewise.
* net.c (sys_recvmmsg): Use xstrdup.
* pathtrace.c (storepath): Use xreallocarray.
(pathtrace_match): Use xmalloc.
* strace.c (die_out_of_memory): Move to xmalloc.c.
(expand_tcbtab): Use xcalloc and xreallocarray.
(startup_child): Use xstrdup.
(init): Use xmalloc, xcalloc, and xstrdup.
* syscall.c (reallocate_qual): Use xreallocarray.
(qualify): Use xstrdup.
* unwind.c (unwind_tcb_init): Use xmalloc.
(build_mmap_cache): Use xcalloc, xreallocarray, and xstrdup.
(get_symbol_name): Use xreallocarray.
(stacktrace_walk, queue_put): Use xmalloc.
* util.c (printstr): Use xmalloc.
* vsprintf.c (strace_vfprintf): Likewise.
2015-05-25 23:41:02 +03:00
tcp - > auxstr = xstrdup ( str ) ;
2010-03-29 20:45:48 +04:00
} else {
tprintf ( " %#lx, %ld, " , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
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 ) ;
2010-03-29 20:45:48 +04:00
/* timeout on entrance */
tprintf ( " , %s " , tcp - > auxstr ? tcp - > auxstr : " {...} " ) ;
free ( ( void * ) tcp - > auxstr ) ;
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 */
2012-01-20 14:04:04 +04:00
sprint_timespec ( stpcpy ( str , " left " ) , 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
}
}
1999-02-19 03:21:36 +03:00
# endif /* HAVE_SENDMSG */
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 ) ) {
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 [ 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
} else {
2015-03-23 03:04:27 +03:00
# ifdef HAVE_GETRVAL2
2015-08-02 04:54:48 +03:00
if ( flags_arg < 0 ) {
printpair_fd ( tcp , tcp - > u_rval , getrval2 ( tcp ) ) ;
} else
1999-02-19 03:21:36 +03:00
# endif
2015-08-02 04:54:48 +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
{
return do_pipe ( tcp , - 1 ) ;
}
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 ) ) {
printxval ( domains , tcp - > u_arg [ 0 ] , " PF_??? " ) ;
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"
# include "xlat/sockipv6options.h"
# 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
print_sockopt_fd_level_name ( struct tcb * tcp , int fd , int level , int name )
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 :
printxval ( sockipoptions , name , " IP_??? " ) ;
break ;
case SOL_IPV6 :
printxval ( sockipv6options , name , " IPV6_??? " ) ;
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
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 ICMP_FILTER
2015-01-29 07:42:37 +03:00
# include "xlat / icmpfilterflags.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
print_icmp_filter ( struct tcb * tcp , long addr , int len )
2000-07-05 20:05:39 +04:00
{
struct icmp_filter filter ;
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 ( filter ) | |
umove ( tcp , addr , & filter ) < 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 ;
}
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
}
# endif /* ICMP_FILTER */
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_getsockopt ( struct tcb * tcp , int level , 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 ) {
2015-01-29 07:42:37 +03:00
# ifdef ICMP_FILTER
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 ;
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
}
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 ] ,
tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
} else {
int len ;
if ( syserror ( tcp ) | | umove ( tcp , tcp - > u_arg [ 4 ] , & len ) < 0 ) {
tprintf ( " %#lx, %#lx " ,
tcp - > u_arg [ 3 ] , tcp - > u_arg [ 4 ] ) ;
} 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 ;
}
union {
struct sockaddr * sa ;
struct sockaddr_in * sin ;
# ifdef HAVE_INET_NTOP
struct sockaddr_in6 * sin6 ;
# endif
} a = { . sa = ( struct sockaddr * ) & greq . gr_group } ;
# ifdef HAVE_INET_NTOP
char str [ INET6_ADDRSTRLEN ] ;
# endif
tprintf ( " {gr_interface=%u, gr_group={sa_family= " , greq . gr_interface ) ;
printxval ( addrfams , a . sa - > sa_family , " AF_??? " ) ;
switch ( a . sa - > sa_family ) {
case AF_INET :
tprintf ( " , sin_port=htons(%u), sin_addr=inet_addr( \" %s \" )}} " ,
ntohs ( a . sin - > sin_port ) ,
inet_ntoa ( a . sin - > sin_addr ) ) ;
return ;
# ifdef HAVE_INET_NTOP
case AF_INET6 :
if ( ! inet_ntop ( AF_INET6 , & a . sin6 - > sin6_addr , str , sizeof ( str ) ) )
break ;
tprintf ( " , sin6_port=htons(%u) "
" , inet_pton(AF_INET6, \" %s \" , &sin6_addr)}} " ,
ntohs ( a . sin6 - > sin6_port ) , str ) ;
return ;
# endif /* HAVE_INET_NTOP */
}
tprints ( " , sa_data= " ) ;
print_quoted_string ( a . sa - > sa_data , sizeof ( a . sa - > sa_data ) , 0 ) ;
tprintf ( " }} " ) ;
}
# 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
print_setsockopt ( struct tcb * tcp , int level , int name , long addr , int len )
{
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 ) {
2015-01-29 07:42:37 +03:00
# ifdef ICMP_FILTER
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 ;
2015-01-29 07:42:37 +03:00
# endif
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 ] ,
tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
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
}