2017-07-01 13:14:49 +00:00
/*
* Copyright ( c ) 2016 - 2017 Dmitry V . Levin < ldv @ altlinux . org >
2018-02-13 22:00:00 +00:00
* Copyright ( c ) 2017 - 2018 The strace developers .
2017-07-01 13:14:49 +00: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 .
*/
# ifndef STRACE_PRINT_FIELDS_H
# define STRACE_PRINT_FIELDS_H
/*
* The printf - like function to use in header files
* shared between strace and its tests .
*/
# ifndef STRACE_PRINTF
# define STRACE_PRINTF tprintf
# endif
# define PRINT_FIELD_D(prefix_, where_, field_) \
STRACE_PRINTF ( " %s%s=%lld " , ( prefix_ ) , # field_ , \
sign_extend_unsigned_to_ll ( ( where_ ) . field_ ) )
# define PRINT_FIELD_U(prefix_, where_, field_) \
STRACE_PRINTF ( " %s%s=%llu " , ( prefix_ ) , # field_ , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) )
2018-01-05 20:59:04 +01:00
# define PRINT_FIELD_U_CAST(prefix_, where_, field_, type_) \
STRACE_PRINTF ( " %s%s=%llu " , ( prefix_ ) , # field_ , \
zero_extend_signed_to_ull ( ( type_ ) ( where_ ) . field_ ) )
2017-07-01 13:14:49 +00:00
# define PRINT_FIELD_X(prefix_, where_, field_) \
STRACE_PRINTF ( " %s%s=%#llx " , ( prefix_ ) , # field_ , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) )
2018-03-08 22:51:30 +01:00
# define PRINT_FIELD_ADDR(prefix_, where_, field_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printaddr ( ( where_ ) . field_ ) ; \
} while ( 0 )
# define PRINT_FIELD_ADDR64(prefix_, where_, field_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printaddr64 ( ( where_ ) . field_ ) ; \
} while ( 0 )
2017-07-10 02:23:00 +00:00
# define PRINT_FIELD_0X(prefix_, where_, field_) \
STRACE_PRINTF ( " %s%s=%#0*llx " , ( prefix_ ) , # field_ , \
( int ) sizeof ( ( where_ ) . field_ ) * 2 , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) )
2017-07-01 13:14:49 +00:00
# define PRINT_FIELD_COOKIE(prefix_, where_, field_) \
STRACE_PRINTF ( " %s%s=[%llu, %llu] " , ( prefix_ ) , # field_ , \
zero_extend_signed_to_ull ( ( where_ ) . field_ [ 0 ] ) , \
zero_extend_signed_to_ull ( ( where_ ) . field_ [ 1 ] ) )
# define PRINT_FIELD_FLAGS(prefix_, where_, field_, xlat_, dflt_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
2017-07-23 11:16:23 +00:00
printflags64 ( ( xlat_ ) , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) , \
( dflt_ ) ) ; \
2017-07-18 21:54:38 +00:00
} while ( 0 )
2017-07-01 13:14:49 +00:00
# define PRINT_FIELD_XVAL(prefix_, where_, field_, xlat_, dflt_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
2017-07-23 11:16:23 +00:00
printxval64 ( ( xlat_ ) , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) , \
( dflt_ ) ) ; \
2017-07-18 21:54:38 +00:00
} while ( 0 )
2018-03-13 23:51:54 +01:00
# define PRINT_FIELD_XVAL_U(prefix_, where_, field_, xlat_, dflt_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printxvals_ex ( zero_extend_signed_to_ull ( ( where_ ) . field_ ) , \
( dflt_ ) , XLAT_STYLE_FMT_U , \
( xlat_ ) , NULL ) ; \
} while ( 0 )
2018-01-05 20:57:57 +01:00
/*
* Generic " ID " printing . ID is considered unsigned except for the special value
* of - 1.
*/
# define PRINT_FIELD_ID(prefix_, where_, field_) \
2017-07-08 19:27:26 +00:00
do { \
if ( sign_extend_unsigned_to_ll ( ( where_ ) . field_ ) = = - 1LL ) \
STRACE_PRINTF ( " %s%s=-1 " , ( prefix_ ) , # field_ ) ; \
else \
STRACE_PRINTF ( " %s%s=%llu " , ( prefix_ ) , # field_ , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) ) ; \
} while ( 0 )
2018-01-05 20:57:57 +01:00
# define PRINT_FIELD_UID PRINT_FIELD_ID
2018-03-13 23:46:14 +01:00
# define PRINT_FIELD_U64(prefix_, where_, field_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
if ( zero_extend_signed_to_ull ( ( where_ ) . field_ ) = = UINT64_MAX ) \
2018-08-19 20:13:02 +02:00
print_xlat_u ( UINT64_MAX ) ; \
2018-03-13 23:46:14 +01:00
else \
STRACE_PRINTF ( " %llu " , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) ) ; \
} while ( 0 )
2017-07-11 00:20:54 +00:00
# define PRINT_FIELD_STRING(prefix_, where_, field_, len_, style_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_quoted_string ( ( const char * ) ( where_ ) . field_ , \
( len_ ) , ( style_ ) ) ; \
} while ( 0 )
# define PRINT_FIELD_CSTRING(prefix_, where_, field_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
2018-03-10 05:09:42 +01:00
print_quoted_cstring ( ( const char * ) ( where_ ) . field_ , \
sizeof ( ( where_ ) . field_ ) + \
MUST_BE_ARRAY ( ( where_ ) . field_ ) ) ; \
2017-05-21 11:42:13 +08:00
} while ( 0 )
2018-03-25 14:11:09 +02:00
# define PRINT_FIELD_CSTRING_SZ(prefix_, where_, field_, size_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_quoted_cstring ( ( const char * ) ( where_ ) . field_ , \
( size_ ) ) ; \
} while ( 0 )
2018-01-11 22:47:11 +01:00
# define PRINT_FIELD_HEX_ARRAY(prefix_, where_, field_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_quoted_string ( ( const char * ) ( where_ ) . field_ , \
2018-03-05 15:57:19 +01:00
sizeof ( ( where_ ) . field_ ) + \
2018-01-11 22:47:11 +01:00
MUST_BE_ARRAY ( ( where_ ) . field_ ) , \
QUOTE_FORCE_HEX ) ; \
} while ( 0 )
2017-07-09 13:54:01 +00:00
# define PRINT_FIELD_INET_ADDR(prefix_, where_, field_, af_) \
do { \
STRACE_PRINTF ( prefix_ ) ; \
print_inet_addr ( ( af_ ) , & ( where_ ) . field_ , \
sizeof ( ( where_ ) . field_ ) , # field_ ) ; \
} while ( 0 )
2017-07-09 13:54:01 +00:00
# define PRINT_FIELD_INET4_ADDR(prefix_, where_, field_) \
STRACE_PRINTF ( " %s%s=inet_addr( \" %s \" ) " , ( prefix_ ) , # field_ , \
inet_ntoa ( ( where_ ) . field_ ) )
sock: decode SIOCADDRT and SIOCDELRT commands
Those are a bit tricky, as their arguments depends on socket's address
family. So far, it's implemented for AF_INET, AF_AX25, AF_APPLETALK,
AF_NETROM, AF_X25, AF_INET6, AF_ROSE, and AF_PACKET.
* xlat/inet6_route_metrics.in: New file.
* xlat/inet6_router_pref.in: Likewise.
* xlat/netrom_route_types.in: Likewise.
* xlat/route_flags.in: Likewise.
* defs.h (route_nexthop_flags): New xlat declaration.
(sock_proto): Add SOCK_PROTO_AX25, SOCK_PROTO_DDP, SOCK_PROTO_NETROM,
SOCK_PROTO_PACKET, SOCK_PROTO_ROSE, SOCK_PROTO_X25.
* print_fields.h (PRINT_FIELD_INET6_ADDR): New macro.
* sock.c: Include <linux/ax25.h>, <linux/in_route.h>,
<linux/ipv6_route.h>, <linux/netrom.h>, <linux/rose.h>, <linux/route.h>,
<linux/x25.h>, "xlat/inet6_route_metrics.h", "xlat/inet6_router_pref.h",
"xlat/netrom_route_types.h", "xlat/route_flags.h",
"xlat/route_flags_inet6.h", "xlat/route_nexthop_flags.h",
"xlat/routing_types.h".
(decode_rtentry, print_digipeaters, decode_ax25_routes_struct,
decode_nr_route_struct, decode_x25_route_struct, print_inet6_route_pref,
decode_in6_rtmsg, decode_rose_route_struct): New function.
(sock_ioctl): Handle SIOCADDRT and SIOCDELRT.
* socketutils.c (protocols): Add address family information for
SOCK_PROTO_AX25, SOCK_PROTO_DDP, SOCK_PROTO_NETROM, SOCK_PROTO_PACKET,
SOCK_PROTO_ROSE, and SOCK_PROTO_X25.
Co-Authored-by; Olga Feiermann <charmik@users.sourceforge.net>
Closes: https://github.com/strace/strace/issues/41
2018-08-27 12:52:53 +02:00
# define PRINT_FIELD_INET6_ADDR(prefix_, where_, field_) \
PRINT_FIELD_INET_ADDR ( ( prefix_ ) , ( where_ ) , field_ , AF_INET6 )
2018-08-27 03:13:04 +02:00
# define PRINT_FIELD_AX25_ADDR(prefix_, where_, field_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_ax25_addr ( & ( where_ ) . field_ ) ; \
} while ( 0 )
2018-08-27 06:26:56 +02:00
# define PRINT_FIELD_X25_ADDR(prefix_, where_, field_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_x25_addr ( & ( where_ ) . field_ ) ; \
} while ( 0 )
2018-08-27 12:37:24 +02:00
# define PRINT_FIELD_ROSE_ADDR(prefix_, where_, field_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_rose_addr ( & ( where_ ) . field_ ) ; \
} while ( 0 )
2017-07-09 13:54:01 +00:00
# define PRINT_FIELD_NET_PORT(prefix_, where_, field_) \
STRACE_PRINTF ( " %s%s=htons(%u) " , ( prefix_ ) , # field_ , \
ntohs ( ( where_ ) . field_ ) )
2017-07-09 13:54:01 +00:00
# define PRINT_FIELD_IFINDEX(prefix_, where_, field_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_ifindex ( ( where_ ) . field_ ) ; \
} while ( 0 )
2017-07-09 16:04:24 +00:00
# define PRINT_FIELD_SOCKADDR(prefix_, where_, field_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_sockaddr ( & ( where_ ) . field_ , \
sizeof ( ( where_ ) . field_ ) ) ; \
} while ( 0 )
2017-07-09 13:54:01 +00:00
# define PRINT_FIELD_DEV(prefix_, where_, field_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_dev_t ( ( where_ ) . field_ ) ; \
} while ( 0 )
2017-07-15 00:08:12 +00:00
# define PRINT_FIELD_PTR(prefix_, where_, field_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printaddr ( ( mpers_ptr_t ) ( where_ ) . field_ ) ; \
} while ( 0 )
2017-07-17 11:59:26 +00:00
# define PRINT_FIELD_FD(prefix_, where_, field_, tcp_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printfd ( ( tcp_ ) , ( where_ ) . field_ ) ; \
} while ( 0 )
# define PRINT_FIELD_STRN(prefix_, where_, field_, len_, tcp_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printstrn ( ( tcp_ ) , ( where_ ) . field_ , ( len_ ) ) ; \
} while ( 0 )
2017-07-25 12:47:19 +00:00
# define PRINT_FIELD_STR(prefix_, where_, field_, tcp_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printstr ( ( tcp_ ) , ( where_ ) . field_ ) ; \
} while ( 0 )
# define PRINT_FIELD_PATH(prefix_, where_, field_, tcp_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printpath ( ( tcp_ ) , ( where_ ) . field_ ) ; \
} while ( 0 )
2018-05-07 00:04:18 +02:00
# define PRINT_FIELD_MAC(prefix_, where_, field_) \
PRINT_FIELD_MAC_SZ ( ( prefix_ ) , ( where_ ) , field_ , \
ARRAY_SIZE ( ( where_ ) . field_ ) )
# define PRINT_FIELD_MAC_SZ(prefix_, where_, field_, size_) \
do { \
static_assert ( sizeof ( ( ( where_ ) . field_ ) [ 0 ] ) = = 1 , \
" MAC address is not a byte array " ) ; \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_mac_addr ( " " , ( const uint8_t * ) ( ( where_ ) . field_ ) , \
( size_ ) ) ; \
} while ( 0 )
2018-08-31 06:00:29 +02:00
# define PRINT_FIELD_HWADDR_SZ(prefix_, where_, field_, size_, hwtype_) \
do { \
static_assert ( sizeof ( ( ( where_ ) . field_ ) [ 0 ] ) = = 1 , \
" hwaddress is not a byte array " ) ; \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_hwaddr ( " " , ( const uint8_t * ) ( ( where_ ) . field_ ) , \
( size_ ) , ( hwtype_ ) ) ; \
} while ( 0 )
2017-07-01 13:14:49 +00:00
# endif /* !STRACE_PRINT_FIELDS_H */