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>
# include <sys/un.h>
2001-02-16 23:29:03 +03:00
# if defined(HAVE_SIN6_SCOPE_ID_LINUX)
2012-03-16 15:02:22 +04:00
# define in6_addr in6_addr_libc
# define ipv6_mreq ipv6_mreq_libc
# define sockaddr_in6 sockaddr_in6_libc
2001-02-16 23:29:03 +03:00
# endif
1999-02-19 03:21:36 +03:00
# 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
2013-02-08 21:49:06 +04:00
# if defined(__GLIBC__) && defined(HAVE_SIN6_SCOPE_ID_LINUX)
2012-03-16 15:02:22 +04:00
# if defined(HAVE_LINUX_IN6_H)
# if defined(HAVE_SIN6_SCOPE_ID_LINUX)
# undef in6_addr
# undef ipv6_mreq
# undef sockaddr_in6
# define in6_addr in6_addr_kernel
# define ipv6_mreq ipv6_mreq_kernel
# define sockaddr_in6 sockaddr_in6_kernel
# endif
# include <linux / in6.h>
# if defined(HAVE_SIN6_SCOPE_ID_LINUX)
# undef in6_addr
# undef ipv6_mreq
# undef sockaddr_in6
# define in6_addr in6_addr_libc
# define ipv6_mreq ipv6_mreq_libc
# define sockaddr_in6 sockaddr_in6_kernel
# endif
# endif
1999-11-01 22:53:31 +03:00
# endif
1999-11-01 22:39:08 +03:00
1999-11-18 20:09:47 +03:00
# if defined(HAVE_SYS_UIO_H)
2012-03-16 15:02:22 +04:00
# include <sys / uio.h>
1999-11-18 20:09:47 +03:00
# endif
# 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
2014-04-26 03:30:54 +04:00
# include "xlat/socketlayers.h"
2002-05-22 19:46:49 +04:00
/*** WARNING: DANGER WILL ROBINSON: NOTE "socketlayers" array above
2014-03-11 18:37:37 +04:00
falls into " inet_protocols " array below ! ! ! ! This is intended ! ! ! * * */
2014-04-26 03:30:54 +04:00
# include "xlat/inet_protocols.h"
2014-03-11 18:37:37 +04:00
# ifdef PF_NETLINK
2014-04-26 03:30:54 +04:00
# 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"
# include "xlat/sockoptions.h"
1999-02-19 03:21:36 +03:00
2012-02-25 05:47:15 +04:00
# if !defined(SOL_IP) && defined(IPPROTO_IP)
2002-05-22 19:46:49 +04:00
# define SOL_IP IPPROTO_IP
# endif
1999-02-19 03:21:36 +03:00
# ifdef SOL_IP
2014-04-26 03:30:54 +04:00
# include "xlat/sockipoptions.h"
1999-02-19 03:21:36 +03:00
# endif /* SOL_IP */
2004-08-31 11:01:26 +04:00
# ifdef SOL_IPV6
2014-04-26 03:30:54 +04:00
# include "xlat/sockipv6options.h"
2004-08-31 11:01:26 +04:00
# endif /* SOL_IPV6 */
1999-02-19 03:21:36 +03:00
# ifdef SOL_IPX
2014-04-26 03:30:54 +04:00
# include "xlat/sockipxoptions.h"
1999-02-19 03:21:36 +03:00
# endif /* SOL_IPX */
2000-07-05 20:05:39 +04:00
# ifdef SOL_RAW
2014-04-26 03:30:54 +04:00
# include "xlat/sockrawoptions.h"
2000-07-05 20:05:39 +04:00
# endif /* SOL_RAW */
# ifdef SOL_PACKET
2014-04-26 03:30:54 +04:00
# include "xlat/sockpacketoptions.h"
2000-07-05 20:05:39 +04:00
# endif /* SOL_PACKET */
2011-01-14 13:08:12 +03:00
# ifdef SOL_SCTP
2014-04-26 03:30:54 +04:00
# include "xlat/socksctpoptions.h"
2011-01-14 13:08:12 +03:00
# endif
2012-02-25 05:47:15 +04:00
# if !defined(SOL_TCP) && defined(IPPROTO_TCP)
2002-05-22 19:46:49 +04:00
# define SOL_TCP IPPROTO_TCP
# endif
1999-02-19 03:21:36 +03:00
# ifdef SOL_TCP
2014-04-26 03:30:54 +04:00
# include "xlat/socktcpoptions.h"
1999-02-19 03:21:36 +03:00
# endif /* SOL_TCP */
2000-07-05 20:05:39 +04:00
# ifdef SOL_RAW
2014-04-26 03:30:54 +04:00
# include "xlat/icmpfilterflags.h"
2000-07-05 20:05:39 +04:00
# endif /* SOL_RAW */
2002-04-01 16:48:06 +04:00
# if defined(AF_PACKET) /* from e.g. linux/if_packet.h */
2014-04-26 03:30:54 +04:00
# include "xlat/af_packet_types.h"
2002-04-01 16:48:06 +04:00
# endif /* defined(AF_PACKET) */
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
if ( addr = = 0 ) {
2011-09-01 12:00:28 +04:00
tprints ( " NULL " ) ;
1999-02-19 03:21:36 +03:00
return ;
}
if ( ! verbose ( tcp ) ) {
tprintf ( " %#lx " , addr ) ;
return ;
}
1999-11-18 20:09:47 +03:00
2014-09-10 17:46:04 +04:00
if ( addrlen < 2 | | addrlen > ( int ) sizeof ( addrbuf ) )
2007-10-09 03:31:19 +04:00
addrlen = sizeof ( addrbuf ) ;
memset ( & addrbuf , 0 , sizeof ( addrbuf ) ) ;
if ( umoven ( tcp , addr , addrlen , addrbuf . pad ) < 0 ) {
2011-09-01 12:00:28 +04:00
tprints ( " {...} " ) ;
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= " ) ;
2007-10-14 01:03:17 +04:00
printpathn ( tcp , addr + 2 , strlen ( addrbuf . sau . sun_path ) ) ;
1999-11-18 20:09:47 +03:00
} else {
2012-02-22 04:23:52 +04:00
tprints ( " sun_path=@ " ) ;
2007-10-14 01:03:17 +04:00
printpathn ( tcp , addr + 3 , strlen ( addrbuf . sau . sun_path + 1 ) ) ;
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
2001-02-16 23:29:03 +03:00
{
# if defined(HAVE_IF_INDEXTONAME) && defined(IN6_IS_ADDR_LINKLOCAL) && defined(IN6_IS_ADDR_MC_LINKLOCAL)
2011-06-07 14:13:24 +04:00
int numericscope = 0 ;
if ( IN6_IS_ADDR_LINKLOCAL ( & addrbuf . sa6 . sin6_addr )
| | IN6_IS_ADDR_MC_LINKLOCAL ( & addrbuf . sa6 . sin6_addr ) ) {
char scopebuf [ IFNAMSIZ + 1 ] ;
2002-12-30 03:51:30 +03:00
2011-06-07 14:13:24 +04:00
if ( if_indextoname ( addrbuf . sa6 . sin6_scope_id , scopebuf ) = = NULL )
numericscope + + ;
else
tprintf ( " , sin6_scope_id=if_nametoindex( \" %s \" ) " , scopebuf ) ;
} else
numericscope + + ;
2002-12-30 03:51:30 +03:00
2011-06-07 14:13:24 +04:00
if ( numericscope )
2001-02-16 23:29:03 +03:00
# endif
2011-06-07 14:13:24 +04:00
tprintf ( " , sin6_scope_id=%u " , addrbuf . sa6 . sin6_scope_id ) ;
2001-02-16 23:29:03 +03:00
}
# endif
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= " ) ;
1999-02-19 03:21:36 +03:00
printstr ( tcp , ( long ) & ( ( struct sockaddr * ) addr ) - > sa_data ,
1999-11-18 20:09:47 +03:00
sizeof addrbuf . sa . sa_data ) ;
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
}
# if HAVE_SENDMSG
2014-04-26 03:30:54 +04:00
# include "xlat/scmvals.h"
2004-10-07 02:11:51 +04:00
static void
2009-03-23 16:12:46 +03:00
printcmsghdr ( struct tcb * tcp , unsigned long addr , unsigned long len )
2004-10-07 02:11:51 +04:00
{
2005-06-01 23:22:06 +04:00
struct cmsghdr * cmsg = len < sizeof ( struct cmsghdr ) ?
NULL : malloc ( len ) ;
if ( cmsg = = NULL | | umoven ( tcp , addr , len , ( char * ) cmsg ) < 0 ) {
2004-10-07 02:11:51 +04:00
tprintf ( " , msg_control=%#lx " , addr ) ;
2005-06-01 23:22:06 +04:00
free ( cmsg ) ;
2004-10-07 02:11:51 +04:00
return ;
}
2009-03-23 16:12:46 +03:00
tprintf ( " , {cmsg_len=%u, cmsg_level= " , ( unsigned ) cmsg - > cmsg_len ) ;
2005-06-01 23:22:06 +04:00
printxval ( socketlayers , cmsg - > cmsg_level , " SOL_??? " ) ;
2011-09-01 12:00:28 +04:00
tprints ( " , cmsg_type= " ) ;
2004-10-07 02:11:51 +04:00
2005-06-01 23:22:06 +04:00
if ( cmsg - > cmsg_level = = SOL_SOCKET ) {
unsigned long cmsg_len ;
printxval ( scmvals , cmsg - > cmsg_type , " SCM_??? " ) ;
cmsg_len = ( len < cmsg - > cmsg_len ) ? len : cmsg - > cmsg_len ;
2005-02-02 06:11:32 +03:00
2005-06-01 23:22:06 +04:00
if ( cmsg - > cmsg_type = = SCM_RIGHTS
& & CMSG_LEN ( sizeof ( int ) ) < = cmsg_len ) {
2011-06-07 14:13:24 +04:00
int * fds = ( int * ) CMSG_DATA ( cmsg ) ;
2004-10-07 02:11:51 +04:00
int first = 1 ;
2005-06-01 23:22:06 +04:00
2011-09-01 12:00:28 +04:00
tprints ( " , { " ) ;
2005-06-01 23:22:06 +04:00
while ( ( char * ) fds < ( ( char * ) cmsg + cmsg_len ) ) {
2004-10-07 02:11:51 +04:00
if ( ! first )
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
2014-05-30 01:35:34 +04:00
printfd ( tcp , * fds + + ) ;
2004-10-07 02:11:51 +04:00
first = 0 ;
}
2011-09-01 12:00:28 +04:00
tprints ( " }} " ) ;
2005-06-01 23:22:06 +04:00
free ( cmsg ) ;
2004-10-07 02:11:51 +04:00
return ;
}
2005-06-01 23:22:06 +04:00
if ( cmsg - > cmsg_type = = SCM_CREDENTIALS
& & CMSG_LEN ( sizeof ( struct ucred ) ) < = cmsg_len ) {
2011-06-07 14:13:24 +04:00
struct ucred * uc = ( struct ucred * ) CMSG_DATA ( cmsg ) ;
2005-06-01 23:22:06 +04:00
2004-10-07 02:11:51 +04:00
tprintf ( " {pid=%ld, uid=%ld, gid=%ld}} " ,
( long ) uc - > pid , ( long ) uc - > uid , ( long ) uc - > gid ) ;
2005-06-01 23:22:06 +04:00
free ( cmsg ) ;
2004-10-07 02:11:51 +04:00
return ;
}
}
2005-06-01 23:22:06 +04:00
free ( cmsg ) ;
2011-09-01 12:00:28 +04:00
tprints ( " , ...} " ) ;
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-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 ;
msg - > msg_name = ( void * ) ( long ) msg32 . msg_name ;
msg - > msg_namelen = msg32 . msg_namelen ;
msg - > msg_iov = ( void * ) ( long ) msg32 . msg_iov ;
msg - > msg_iovlen = msg32 . msg_iovlen ;
msg - > msg_control = ( void * ) ( long ) msg32 . msg_control ;
msg - > msg_controllen = msg32 . msg_controllen ;
msg - > msg_flags = msg32 . msg_flags ;
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 ;
}
static void
printmsghdr ( struct tcb * tcp , long addr , unsigned long data_size )
{
struct msghdr msg ;
if ( extractmsghdr ( tcp , addr , & msg ) )
do_msghdr ( tcp , & msg , data_size ) ;
else
1999-05-09 04:29:58 +04:00
tprintf ( " %#lx " , 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
{
struct mmsghdr {
struct msghdr msg_hdr ;
unsigned msg_len ;
} mmsg ;
1999-11-18 20:09:47 +03:00
2013-02-12 14:57:48 +04:00
# if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
if ( current_wordsize = = 4 ) {
struct mmsghdr32 mmsg32 ;
addr + = sizeof ( mmsg32 ) * idx ;
if ( umove ( tcp , addr , & mmsg32 ) < 0 ) {
tprintf ( " %#lx " , addr ) ;
return ;
}
mmsg . msg_hdr . msg_name = ( void * ) ( long ) mmsg32 . msg_hdr . msg_name ;
mmsg . msg_hdr . msg_namelen = mmsg32 . msg_hdr . msg_namelen ;
mmsg . msg_hdr . msg_iov = ( void * ) ( long ) mmsg32 . msg_hdr . msg_iov ;
mmsg . msg_hdr . msg_iovlen = mmsg32 . msg_hdr . msg_iovlen ;
mmsg . msg_hdr . msg_control = ( void * ) ( long ) mmsg32 . msg_hdr . msg_control ;
mmsg . msg_hdr . msg_controllen = mmsg32 . msg_hdr . msg_controllen ;
mmsg . msg_hdr . msg_flags = mmsg32 . msg_hdr . msg_flags ;
mmsg . msg_len = mmsg32 . msg_len ;
} else
# endif
{
addr + = sizeof ( mmsg ) * idx ;
if ( umove ( tcp , addr , & mmsg ) < 0 ) {
tprintf ( " %#lx " , addr ) ;
return ;
}
2010-02-12 23:39:12 +03:00
}
2011-09-01 12:00:28 +04:00
tprints ( " { " ) ;
2012-05-02 00:41:40 +04:00
do_msghdr ( tcp , & mmsg . msg_hdr , msg_len ? msg_len : mmsg . msg_len ) ;
2010-02-12 23:39:12 +03:00
tprintf ( " , %u} " , mmsg . msg_len ) ;
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 ) ) {
tprintf ( " %#lx " , tcp - > u_arg [ 1 ] ) ;
} 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_??? " ) ;
}
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_??? " ) ;
}
1999-02-19 03:21:36 +03:00
int
2008-11-10 20:21:23 +03:00
sys_socket ( struct tcb * tcp )
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 ] ) ;
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
1999-02-19 03:21:36 +03:00
switch ( tcp - > u_arg [ 0 ] ) {
case PF_INET :
2003-06-24 03:39:59 +04:00
# ifdef PF_INET6
case PF_INET6 :
# endif
2014-03-11 18:37:37 +04:00
printxval ( inet_protocols , tcp - > u_arg [ 2 ] , " IPPROTO_??? " ) ;
1999-02-19 03:21:36 +03:00
break ;
# ifdef PF_IPX
case PF_IPX :
/* BTW: I don't believe this.. */
2011-09-01 12:00:28 +04:00
tprints ( " [ " ) ;
1999-02-19 03:21:36 +03:00
printxval ( domains , tcp - > u_arg [ 2 ] , " PF_??? " ) ;
2011-09-01 12:00:28 +04:00
tprints ( " ] " ) ;
1999-02-19 03:21:36 +03:00
break ;
# endif /* PF_IPX */
2014-03-11 18:37:37 +04:00
# ifdef PF_NETLINK
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)
case PF_BLUETOOTH :
printxval ( bt_protocols , tcp - > u_arg [ 2 ] , " BTPROTO_??? " ) ;
break ;
2014-03-11 18:37:37 +04:00
# endif
1999-02-19 03:21:36 +03:00
default :
tprintf ( " %lu " , tcp - > u_arg [ 2 ] ) ;
break ;
}
}
return 0 ;
}
int
2011-05-30 16:00:14 +04:00
sys_bind ( struct tcb * tcp )
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-11-18 20:09:47 +03:00
printsock ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
1999-02-19 03:21:36 +03:00
tprintf ( " , %lu " , tcp - > u_arg [ 2 ] ) ;
}
return 0 ;
}
int
2011-05-30 16:00:14 +04:00
sys_connect ( struct tcb * tcp )
1999-02-19 03:21:36 +03:00
{
return sys_bind ( tcp ) ;
}
int
2011-05-30 16:00:14 +04:00
sys_listen ( struct tcb * tcp )
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 ( " , " ) ;
tprintf ( " %lu " , tcp - > u_arg [ 1 ] ) ;
1999-02-19 03:21:36 +03:00
}
return 0 ;
}
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 ;
}
if ( ! tcp - > u_arg [ 2 ] )
1999-02-19 03:21:36 +03:00
tprintf ( " %#lx, NULL " , tcp - > u_arg [ 1 ] ) ;
else {
2009-01-02 01:47:51 +03:00
int len ;
if ( tcp - > u_arg [ 1 ] = = 0 | | syserror ( tcp )
2011-06-07 14:13:24 +04:00
| | umove ( tcp , tcp - > u_arg [ 2 ] , & len ) < 0 ) {
1999-02-19 03:21:36 +03:00
tprintf ( " %#lx " , tcp - > u_arg [ 1 ] ) ;
} else {
2009-01-02 01:47:51 +03:00
printsock ( tcp , tcp - > u_arg [ 1 ] , len ) ;
1999-02-19 03:21:36 +03:00
}
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
2009-01-02 01:47:51 +03:00
printnum_int ( tcp , tcp - > u_arg [ 2 ] , " %u " ) ;
1999-02-19 03:21:36 +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 ;
}
2009-08-14 14:34:05 +04:00
int
sys_accept ( struct tcb * tcp )
{
2014-08-06 20:46:13 +04:00
do_sockname ( tcp , - 1 ) ;
return RVAL_FD ;
2009-08-14 14:34:05 +04:00
}
int
sys_accept4 ( struct tcb * tcp )
{
2014-08-06 20:46:13 +04:00
do_sockname ( tcp , 3 ) ;
return RVAL_FD ;
2009-08-14 14:34:05 +04:00
}
1999-02-19 03:21:36 +03:00
int
2011-05-30 16:00:14 +04:00
sys_send ( struct tcb * tcp )
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
printstr ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
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_??? " ) ;
1999-02-19 03:21:36 +03:00
}
return 0 ;
}
int
2011-05-30 16:00:14 +04:00
sys_sendto ( struct tcb * tcp )
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
printstr ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
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_??? " ) ;
1999-02-19 03:21:36 +03:00
/* to address */
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
1999-11-18 20:09:47 +03:00
printsock ( tcp , tcp - > u_arg [ 4 ] , tcp - > u_arg [ 5 ] ) ;
1999-02-19 03:21:36 +03:00
/* to length */
tprintf ( " , %lu " , tcp - > u_arg [ 5 ] ) ;
}
return 0 ;
}
# ifdef HAVE_SENDMSG
int
2011-05-30 16:00:14 +04:00
sys_sendmsg ( struct tcb * tcp )
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 ( " , " ) ;
2012-05-02 00:30:02 +04:00
printmsghdr ( tcp , tcp - > u_arg [ 1 ] , ( unsigned long ) - 1L ) ;
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 ;
}
2012-03-12 03:59:29 +04:00
int
sys_sendmmsg ( struct tcb * tcp )
{
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 */
int
2011-05-30 16:00:14 +04:00
sys_recv ( struct tcb * tcp )
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 ) )
tprintf ( " %#lx " , tcp - > u_arg [ 1 ] ) ;
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 ;
}
int
2011-05-30 16:00:14 +04:00
sys_recvfrom ( struct tcb * tcp )
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 {
if ( syserror ( tcp ) ) {
tprintf ( " %#lx, %lu, %lu, %#lx, %#lx " ,
tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] , tcp - > u_arg [ 3 ] ,
tcp - > u_arg [ 4 ] , tcp - > u_arg [ 5 ] ) ;
return 0 ;
}
/* buf */
printstr ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_rval ) ;
/* 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_??? " ) ;
1999-02-19 03:21:36 +03:00
/* from address, len */
if ( ! tcp - > u_arg [ 4 ] | | ! tcp - > u_arg [ 5 ] ) {
if ( tcp - > u_arg [ 4 ] = = 0 )
2011-09-01 12:00:28 +04:00
tprints ( " , NULL " ) ;
1999-02-19 03:21:36 +03:00
else
tprintf ( " , %#lx " , tcp - > u_arg [ 4 ] ) ;
if ( tcp - > u_arg [ 5 ] = = 0 )
2011-09-01 12:00:28 +04:00
tprints ( " , NULL " ) ;
1999-02-19 03:21:36 +03:00
else
tprintf ( " , %#lx " , tcp - > u_arg [ 5 ] ) ;
return 0 ;
}
if ( umove ( tcp , tcp - > u_arg [ 5 ] , & fromlen ) < 0 ) {
2011-09-01 12:00:28 +04:00
tprints ( " , {...}, [?] " ) ;
1999-02-19 03:21:36 +03:00
return 0 ;
}
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
1999-11-18 20:09:47 +03:00
printsock ( tcp , tcp - > u_arg [ 4 ] , tcp - > u_arg [ 5 ] ) ;
1999-02-19 03:21:36 +03:00
/* from length */
tprintf ( " , [%u] " , fromlen ) ;
}
return 0 ;
}
# ifdef HAVE_SENDMSG
int
2011-05-30 16:00:14 +04:00
sys_recvmsg ( struct tcb * tcp )
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 ) | | ! verbose ( tcp ) )
tprintf ( " %#lx " , tcp - > u_arg [ 1 ] ) ;
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 ;
}
2010-02-12 23:39:12 +03:00
int
sys_recvmmsg ( struct tcb * tcp )
{
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 .
*/
2010-03-29 20:45:48 +04:00
tcp - > auxstr = strdup ( str ) ;
} 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
1999-02-19 03:21:36 +03:00
int
2011-05-30 16:00:14 +04:00
sys_shutdown ( struct tcb * tcp )
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 ( " , " ) ;
2011-03-03 03:12:25 +03:00
printxval ( shutdown_modes , tcp - > u_arg [ 1 ] , " SHUT_??? " ) ;
1999-02-19 03:21:36 +03:00
}
return 0 ;
}
int
2011-05-30 16:00:14 +04:00
sys_getsockname ( struct tcb * tcp )
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
}
int
2011-05-30 16:00:14 +04:00
sys_getpeername ( struct tcb * tcp )
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
}
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 ) ) {
tprintf ( " %#lx " , 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 {
2012-02-25 05:38:52 +04:00
# if !defined(SPARC) && !defined(SPARC64) && !defined(SH) && !defined(IA64)
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
int fds [ 2 ] ;
if ( umoven ( tcp , tcp - > u_arg [ 0 ] , sizeof fds , ( char * ) fds ) < 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
else
tprintf ( " [%u, %u] " , fds [ 0 ] , fds [ 1 ] ) ;
2012-02-25 05:38:52 +04:00
# elif defined(SPARC) || defined(SPARC64) || defined(SH) || defined(IA64)
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
tprintf ( " [%lu, %lu] " , tcp - > u_rval , getrval2 ( tcp ) ) ;
# else
tprintf ( " %#lx " , tcp - > u_arg [ 0 ] ) ;
1999-02-19 03:21:36 +03:00
# endif
2008-10-23 Dmitry V. Levin <ldv@altlinux.org>
Implement parsers for new linux syscalls.
* desc.c (do_dup2, [LINUX] sys_dup3): New functions.
(sys_dup2): Use do_dup2.
[LINUX] (sys_epoll_create1): New function.
[LINUX] (do_eventfd, sys_eventfd2): New functions.
[LINUX] (sys_eventfd): Use do_eventfd.
* net.c (do_pipe, [LINUX] sys_pipe2): New functions.
(sys_pipe): Use do_pipe.
* signal.c [LINUX] (do_signalfd, sys_signalfd4): New functions.
[LINUX] (sys_signalfd): Use do_signalfd.
* linux/syscall.h: Declare new sys_* functions.
* linux/syscallent.h: Hook up signalfd4, eventfd2, epoll_create1,
dup3, pipe2, inotify_init1.
* linux/x86_64/syscallent.h: Hook up paccept, signalfd4, eventfd2,
epoll_create1, dup3, pipe2, inotify_init1.
2008-11-11 01:53:02 +03:00
}
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 ;
}
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
int
sys_pipe ( struct tcb * tcp )
{
return do_pipe ( tcp , - 1 ) ;
}
int
sys_pipe2 ( struct tcb * tcp )
{
return do_pipe ( tcp , 1 ) ;
}
1999-02-19 03:21:36 +03:00
int
2008-11-10 20:21:23 +03:00
sys_socketpair ( struct tcb * tcp )
1999-02-19 03:21:36 +03:00
{
int fds [ 2 ] ;
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 {
if ( syserror ( tcp ) ) {
1999-05-09 04:29:58 +04:00
tprintf ( " , %#lx " , tcp - > u_arg [ 3 ] ) ;
1999-02-19 03:21:36 +03:00
return 0 ;
}
if ( umoven ( tcp , tcp - > u_arg [ 3 ] , sizeof fds , ( char * ) fds ) < 0 )
2011-09-01 12:00:28 +04:00
tprints ( " , [...] " ) ;
1999-02-19 03:21:36 +03:00
else
tprintf ( " , [%u, %u] " , fds [ 0 ] , fds [ 1 ] ) ;
}
return 0 ;
}
int
2009-11-06 21:05:40 +03:00
sys_getsockopt ( struct tcb * tcp )
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 ( " , " ) ;
2002-05-22 19:46:49 +04:00
printxval ( socketlayers , tcp - > u_arg [ 1 ] , " SOL_??? " ) ;
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
1999-02-19 03:21:36 +03:00
switch ( tcp - > u_arg [ 1 ] ) {
case SOL_SOCKET :
printxval ( sockoptions , tcp - > u_arg [ 2 ] , " SO_??? " ) ;
break ;
# ifdef SOL_IP
case SOL_IP :
printxval ( sockipoptions , tcp - > u_arg [ 2 ] , " IP_??? " ) ;
break ;
# endif
2004-08-31 11:01:26 +04:00
# ifdef SOL_IPV6
case SOL_IPV6 :
printxval ( sockipv6options , tcp - > u_arg [ 2 ] , " IPV6_??? " ) ;
break ;
# endif
1999-02-19 03:21:36 +03:00
# ifdef SOL_IPX
case SOL_IPX :
printxval ( sockipxoptions , tcp - > u_arg [ 2 ] , " IPX_??? " ) ;
break ;
# endif
2000-07-05 20:05:39 +04:00
# ifdef SOL_PACKET
case SOL_PACKET :
printxval ( sockpacketoptions , tcp - > u_arg [ 2 ] , " PACKET_??? " ) ;
break ;
# endif
1999-02-19 03:21:36 +03:00
# ifdef SOL_TCP
case SOL_TCP :
printxval ( socktcpoptions , tcp - > u_arg [ 2 ] , " TCP_??? " ) ;
break ;
# endif
2011-01-14 13:08:12 +03:00
# ifdef SOL_SCTP
case SOL_SCTP :
printxval ( socksctpoptions , tcp - > u_arg [ 2 ] , " SCTP_??? " ) ;
break ;
# endif
1999-02-19 03:21:36 +03:00
/* SOL_AX25 SOL_ROSE SOL_ATALK SOL_NETROM SOL_UDP SOL_DECNET SOL_X25
* etc . still need work */
2002-12-30 03:51:30 +03:00
default :
2002-05-22 19:46:49 +04:00
tprintf ( " %lu " , tcp - > u_arg [ 2 ] ) ;
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
} else {
2005-02-02 05:48:57 +03:00
int len ;
2011-06-07 14:13:24 +04:00
if ( syserror ( tcp ) | | umove ( tcp , tcp - > u_arg [ 4 ] , & len ) < 0 ) {
2009-11-06 21:05:40 +03:00
tprintf ( " %#lx, %#lx " ,
1999-02-19 03:21:36 +03:00
tcp - > u_arg [ 3 ] , tcp - > u_arg [ 4 ] ) ;
return 0 ;
}
2002-05-22 19:46:49 +04:00
switch ( tcp - > u_arg [ 1 ] ) {
case SOL_SOCKET :
switch ( tcp - > u_arg [ 2 ] ) {
# ifdef SO_LINGER
case SO_LINGER :
2011-06-07 14:13:24 +04:00
if ( len = = sizeof ( struct linger ) ) {
2002-05-22 19:46:49 +04:00
struct linger linger ;
2011-06-07 14:13:24 +04:00
if ( umove ( tcp ,
2002-05-22 19:46:49 +04:00
tcp - > u_arg [ 3 ] ,
& linger ) < 0 )
break ;
2009-11-06 21:05:40 +03:00
tprintf ( " {onoff=%d, linger=%d}, "
2005-02-02 06:11:32 +03:00
" [%d] " ,
2002-05-22 19:46:49 +04:00
linger . l_onoff ,
linger . l_linger ,
len ) ;
return 0 ;
}
break ;
2010-12-03 19:54:53 +03:00
# endif
# ifdef SO_PEERCRED
case SO_PEERCRED :
2011-06-07 14:13:24 +04:00
if ( len = = sizeof ( struct ucred ) ) {
2010-12-03 19:54:53 +03:00
struct ucred uc ;
2011-06-07 14:13:24 +04:00
if ( umove ( tcp ,
2010-12-03 19:54:53 +03:00
tcp - > u_arg [ 3 ] ,
& uc ) < 0 )
break ;
tprintf ( " {pid=%ld, uid=%ld, gid=%ld}, "
" [%d] " ,
( long ) uc . pid ,
( long ) uc . uid ,
( long ) uc . gid ,
len ) ;
return 0 ;
}
break ;
2009-11-13 15:51:04 +03:00
# endif
}
break ;
case SOL_PACKET :
switch ( tcp - > u_arg [ 2 ] ) {
# ifdef PACKET_STATISTICS
case PACKET_STATISTICS :
if ( len = = sizeof ( struct tpacket_stats ) ) {
struct tpacket_stats stats ;
2011-06-07 14:13:24 +04:00
if ( umove ( tcp ,
2009-11-13 15:51:04 +03:00
tcp - > u_arg [ 3 ] ,
& stats ) < 0 )
break ;
tprintf ( " {packets=%u, drops=%u}, "
" [%d] " ,
stats . tp_packets ,
stats . tp_drops ,
len ) ;
return 0 ;
}
break ;
2002-05-22 19:46:49 +04:00
# endif
}
break ;
}
2011-06-07 14:13:24 +04:00
if ( len = = sizeof ( int ) ) {
2009-11-06 21:05:40 +03:00
printnum_int ( tcp , tcp - > u_arg [ 3 ] , " %d " ) ;
2002-05-22 19:46:49 +04:00
}
else {
2011-06-07 14:13:24 +04:00
printstr ( tcp , tcp - > u_arg [ 3 ] , len ) ;
2002-05-22 19:46:49 +04:00
}
2005-02-02 05:48:57 +03:00
tprintf ( " , [%d] " , len ) ;
1999-02-19 03:21:36 +03:00
}
return 0 ;
}
2000-07-05 20:05:39 +04:00
# if defined(ICMP_FILTER)
2011-05-30 16:00:14 +04:00
static void printicmpfilter ( struct tcb * tcp , long addr )
2000-07-05 20:05:39 +04:00
{
struct icmp_filter filter ;
if ( ! addr ) {
2011-09-01 12:00:28 +04:00
tprints ( " NULL " ) ;
2000-07-05 20:05:39 +04:00
return ;
}
if ( syserror ( tcp ) | | ! verbose ( tcp ) ) {
tprintf ( " %#lx " , addr ) ;
return ;
}
if ( umove ( tcp , addr , & filter ) < 0 ) {
2011-09-01 12:00:28 +04:00
tprints ( " {...} " ) ;
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 */
2002-05-23 15:48:58 +04:00
static int
2011-05-30 16:00:14 +04:00
printsockopt ( struct tcb * tcp , int level , int name , long addr , int len )
1999-02-19 03:21:36 +03:00
{
2002-05-23 15:48:58 +04:00
printxval ( socketlayers , level , " SOL_?? " ) ;
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
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
printxval ( sockoptions , name , " SO_??? " ) ;
switch ( name ) {
2002-05-22 19:46:49 +04:00
# if defined(SO_LINGER)
2012-03-17 07:42:07 +04:00
case SO_LINGER :
2011-06-07 14:13:24 +04:00
if ( len = = sizeof ( struct linger ) ) {
2002-05-23 15:48:58 +04:00
struct linger linger ;
2011-06-07 14:13:24 +04:00
if ( umove ( tcp , addr , & linger ) < 0 )
2002-05-23 15:48:58 +04:00
break ;
tprintf ( " , {onoff=%d, linger=%d} " ,
linger . l_onoff ,
linger . l_linger ) ;
return 0 ;
2002-05-22 19:46:49 +04:00
}
1999-02-19 03:21:36 +03:00
break ;
2002-05-23 15:48:58 +04:00
# endif
}
break ;
1999-02-19 03:21:36 +03:00
# ifdef SOL_IP
2012-03-17 07:42:07 +04:00
case SOL_IP :
2002-05-23 15:48:58 +04:00
printxval ( sockipoptions , name , " IP_??? " ) ;
break ;
1999-02-19 03:21:36 +03:00
# endif
2004-08-31 11:01:26 +04:00
# ifdef SOL_IPV6
2012-03-17 07:42:07 +04:00
case SOL_IPV6 :
2004-08-31 11:01:26 +04:00
printxval ( sockipv6options , name , " IPV6_??? " ) ;
break ;
# endif
1999-02-19 03:21:36 +03:00
# ifdef SOL_IPX
2012-03-17 07:42:07 +04:00
case SOL_IPX :
2002-05-23 15:48:58 +04:00
printxval ( sockipxoptions , name , " IPX_??? " ) ;
break ;
2000-07-05 20:05:39 +04:00
# endif
# ifdef SOL_PACKET
2012-03-17 07:42:07 +04:00
case SOL_PACKET :
2002-05-23 15:48:58 +04:00
printxval ( sockpacketoptions , name , " PACKET_??? " ) ;
/* TODO: decode packate_mreq for PACKET_*_MEMBERSHIP */
2009-11-13 15:51:04 +03:00
switch ( name ) {
# ifdef PACKET_RX_RING
2012-03-17 07:42:07 +04:00
case PACKET_RX_RING :
2009-11-13 15:51:04 +03:00
# endif
# ifdef PACKET_TX_RING
2012-03-17 07:42:07 +04:00
case PACKET_TX_RING :
2009-11-13 15:51:04 +03:00
# endif
# if defined(PACKET_RX_RING) || defined(PACKET_TX_RING)
if ( len = = sizeof ( struct tpacket_req ) ) {
struct tpacket_req req ;
if ( umove ( tcp , addr , & req ) < 0 )
break ;
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 ) ;
return 0 ;
}
break ;
# endif /* PACKET_RX_RING || PACKET_TX_RING */
}
2002-05-23 15:48:58 +04:00
break ;
1999-02-19 03:21:36 +03:00
# endif
# ifdef SOL_TCP
2012-03-17 07:42:07 +04:00
case SOL_TCP :
2002-05-23 15:48:58 +04:00
printxval ( socktcpoptions , name , " TCP_??? " ) ;
break ;
2000-07-05 20:05:39 +04:00
# endif
2011-01-14 13:08:12 +03:00
# ifdef SOL_SCTP
2012-03-17 07:42:07 +04:00
case SOL_SCTP :
2011-01-14 13:08:12 +03:00
printxval ( socksctpoptions , name , " SCTP_??? " ) ;
break ;
# endif
2000-07-05 20:05:39 +04:00
# ifdef SOL_RAW
2012-03-17 07:42:07 +04:00
case SOL_RAW :
2002-05-23 15:48:58 +04:00
printxval ( sockrawoptions , name , " RAW_??? " ) ;
switch ( name ) {
2000-07-05 20:05:39 +04:00
# if defined(ICMP_FILTER)
2012-02-27 16:56:59 +04:00
case ICMP_FILTER :
tprints ( " , " ) ;
printicmpfilter ( tcp , addr ) ;
return 0 ;
2000-07-05 20:05:39 +04:00
# endif
2002-05-23 15:48:58 +04:00
}
break ;
1999-02-19 03:21:36 +03:00
# endif
2002-12-30 03:51:30 +03:00
/* SOL_AX25 SOL_ATALK SOL_NETROM SOL_UDP SOL_DECNET SOL_X25
1999-02-19 03:21:36 +03:00
* etc . still need work */
2002-05-22 19:46:49 +04:00
2012-03-17 07:42:07 +04:00
default :
2002-05-23 15:48:58 +04:00
tprintf ( " %u " , name ) ;
}
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
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
2002-12-30 03:51:30 +03:00
2011-06-07 14:13:24 +04:00
if ( len = = sizeof ( int ) ) {
printnum_int ( tcp , addr , " %d " ) ;
2002-05-23 15:48:58 +04:00
}
else {
2011-06-07 14:13:24 +04:00
printstr ( tcp , addr , len ) ;
2002-05-23 15:48:58 +04:00
}
return 0 ;
}
int
2011-05-30 16:00:14 +04:00
sys_setsockopt ( struct tcb * tcp )
2002-05-23 15:48:58 +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 ( " , " ) ;
2011-06-07 14:13:24 +04:00
printsockopt ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ,
2002-05-23 15:48:58 +04:00
tcp - > u_arg [ 3 ] , tcp - > u_arg [ 4 ] ) ;
2002-05-22 19:46:49 +04:00
tprintf ( " , %lu " , tcp - > u_arg [ 4 ] ) ;
1999-02-19 03:21:36 +03:00
}
return 0 ;
}