2017-07-01 16:14:49 +03:00
/*
* Copyright ( c ) 2016 - 2017 Dmitry V . Levin < ldv @ altlinux . org >
2018-02-14 01:00:00 +03:00
* Copyright ( c ) 2017 - 2018 The strace developers .
2017-07-01 16:14:49 +03:00
* All rights reserved .
*
2018-12-10 03:00:00 +03:00
* SPDX - License - Identifier : LGPL - 2.1 - or - later
2017-07-01 16:14:49 +03:00
*/
# ifndef STRACE_PRINT_FIELDS_H
2018-12-30 18:35:21 +03:00
# define STRACE_PRINT_FIELDS_H
2017-07-01 16:14:49 +03:00
/*
* The printf - like function to use in header files
* shared between strace and its tests .
*/
2018-12-30 18:35:21 +03:00
# ifndef STRACE_PRINTF
# define STRACE_PRINTF tprintf
# endif
2017-07-01 16:14:49 +03:00
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_D(prefix_, where_, field_) \
2017-07-01 16:14:49 +03:00
STRACE_PRINTF ( " %s%s=%lld " , ( prefix_ ) , # field_ , \
sign_extend_unsigned_to_ll ( ( where_ ) . field_ ) )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_U(prefix_, where_, field_) \
2017-07-01 16:14:49 +03:00
STRACE_PRINTF ( " %s%s=%llu " , ( prefix_ ) , # field_ , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_U_CAST(prefix_, where_, field_, type_) \
2018-01-05 22:59:04 +03:00
STRACE_PRINTF ( " %s%s=%llu " , ( prefix_ ) , # field_ , \
zero_extend_signed_to_ull ( ( type_ ) ( where_ ) . field_ ) )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_X(prefix_, where_, field_) \
2017-07-01 16:14:49 +03:00
STRACE_PRINTF ( " %s%s=%#llx " , ( prefix_ ) , # field_ , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_ADDR(prefix_, where_, field_) \
2018-03-09 00:51:30 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printaddr ( ( where_ ) . field_ ) ; \
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_ADDR64(prefix_, where_, field_) \
2018-03-09 00:51:30 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printaddr64 ( ( where_ ) . field_ ) ; \
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_0X(prefix_, where_, field_) \
2017-07-10 05:23:00 +03:00
STRACE_PRINTF ( " %s%s=%#0*llx " , ( prefix_ ) , # field_ , \
( int ) sizeof ( ( where_ ) . field_ ) * 2 , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_COOKIE(prefix_, where_, field_) \
2017-07-01 16:14:49 +03:00
STRACE_PRINTF ( " %s%s=[%llu, %llu] " , ( prefix_ ) , # field_ , \
zero_extend_signed_to_ull ( ( where_ ) . field_ [ 0 ] ) , \
zero_extend_signed_to_ull ( ( where_ ) . field_ [ 1 ] ) )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_FLAGS(prefix_, where_, field_, xlat_, dflt_) \
2017-07-01 16:14:49 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
2017-07-23 14:16:23 +03:00
printflags64 ( ( xlat_ ) , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) , \
( dflt_ ) ) ; \
2017-07-19 00:54:38 +03:00
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_XVAL(prefix_, where_, field_, xlat_, dflt_) \
2017-07-01 16:14:49 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
2017-07-23 14:16:23 +03:00
printxval64 ( ( xlat_ ) , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) , \
( dflt_ ) ) ; \
2017-07-19 00:54:38 +03:00
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_XVAL_U(prefix_, where_, field_, xlat_, dflt_) \
2018-03-14 01:51:54 +03:00
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-12-30 18:35:21 +03:00
# define PRINT_FIELD_XVAL_SORTED_SIZED(prefix_, where_, field_, xlat_, \
2018-05-30 16:23:37 +03:00
xlat_size_ , dflt_ ) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printxval_searchn ( ( xlat_ ) , ( xlat_size_ ) , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) , \
( dflt_ ) ) ; \
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_XVAL_INDEX(prefix_, where_, field_, xlat_, dflt_) \
2018-05-16 13:58:32 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printxval_index ( ( xlat_ ) , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) , \
( dflt_ ) ) ; \
} while ( 0 )
2018-01-05 22:57:57 +03:00
/*
* Generic " ID " printing . ID is considered unsigned except for the special value
* of - 1.
*/
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_ID(prefix_, where_, field_) \
2017-07-08 22:27:26 +03: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-12-30 18:35:21 +03:00
# define PRINT_FIELD_UID PRINT_FIELD_ID
2018-01-05 22:57:57 +03:00
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_U64(prefix_, where_, field_) \
2018-03-14 01:46:14 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
if ( zero_extend_signed_to_ull ( ( where_ ) . field_ ) = = UINT64_MAX ) \
2018-08-19 21:13:02 +03:00
print_xlat_u ( UINT64_MAX ) ; \
2018-03-14 01:46:14 +03:00
else \
STRACE_PRINTF ( " %llu " , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) ) ; \
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_STRING(prefix_, where_, field_, len_, style_) \
2017-07-11 03:20:54 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_quoted_string ( ( const char * ) ( where_ ) . field_ , \
( len_ ) , ( style_ ) ) ; \
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_CSTRING(prefix_, where_, field_) \
2017-07-11 03:20:54 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
2018-03-10 07:09:42 +03:00
print_quoted_cstring ( ( const char * ) ( where_ ) . field_ , \
sizeof ( ( where_ ) . field_ ) + \
MUST_BE_ARRAY ( ( where_ ) . field_ ) ) ; \
2017-05-21 06:42:13 +03:00
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_CSTRING_SZ(prefix_, where_, field_, size_) \
2018-03-25 15:11:09 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_quoted_cstring ( ( const char * ) ( where_ ) . field_ , \
( size_ ) ) ; \
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_HEX_ARRAY(prefix_, where_, field_) \
2018-01-12 00:47:11 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_quoted_string ( ( const char * ) ( where_ ) . field_ , \
2018-03-05 17:57:19 +03:00
sizeof ( ( where_ ) . field_ ) + \
2018-01-12 00:47:11 +03:00
MUST_BE_ARRAY ( ( where_ ) . field_ ) , \
QUOTE_FORCE_HEX ) ; \
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_INET_ADDR(prefix_, where_, field_, af_) \
2017-07-09 16:54:01 +03:00
do { \
STRACE_PRINTF ( prefix_ ) ; \
print_inet_addr ( ( af_ ) , & ( where_ ) . field_ , \
sizeof ( ( where_ ) . field_ ) , # field_ ) ; \
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_AX25_ADDR(prefix_, where_, field_) \
2018-08-27 04:13:04 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_ax25_addr ( & ( where_ ) . field_ ) ; \
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_X25_ADDR(prefix_, where_, field_) \
2018-08-27 07:26:56 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_x25_addr ( & ( where_ ) . field_ ) ; \
} while ( 0 )
2019-01-03 00:15:28 +03:00
# define PRINT_FIELD_NET_PORT(prefix_, where_, field_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
\
if ( xlat_verbose ( xlat_verbosity ) ! = XLAT_STYLE_ABBREV ) \
print_quoted_string ( ( const char * ) \
& ( where_ ) . field_ , \
sizeof ( ( where_ ) . field_ ) , \
QUOTE_FORCE_HEX ) ; \
\
if ( xlat_verbose ( xlat_verbosity ) = = XLAT_STYLE_RAW ) \
break ; \
\
if ( xlat_verbose ( xlat_verbosity ) \
= = XLAT_STYLE_VERBOSE ) \
STRACE_PRINTF ( " /* " ) ; \
\
STRACE_PRINTF ( " htons(%u) " , ntohs ( ( where_ ) . field_ ) ) ; \
\
if ( xlat_verbose ( xlat_verbosity ) \
= = XLAT_STYLE_VERBOSE ) \
STRACE_PRINTF ( " */ " ) ; \
} while ( 0 )
2017-07-09 16:54:01 +03:00
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_IFINDEX(prefix_, where_, field_) \
2017-07-09 16:54:01 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_ifindex ( ( where_ ) . field_ ) ; \
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_SOCKADDR(prefix_, where_, field_) \
2017-07-09 19:04:24 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_sockaddr ( & ( where_ ) . field_ , \
sizeof ( ( where_ ) . field_ ) ) ; \
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_DEV(prefix_, where_, field_) \
2017-07-09 16:54:01 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_dev_t ( ( where_ ) . field_ ) ; \
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_PTR(prefix_, where_, field_) \
2017-07-15 03:08:12 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printaddr ( ( mpers_ptr_t ) ( where_ ) . field_ ) ; \
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_FD(prefix_, where_, field_, tcp_) \
2017-07-17 14:59:26 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printfd ( ( tcp_ ) , ( where_ ) . field_ ) ; \
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_STRN(prefix_, where_, field_, len_, tcp_) \
2017-07-17 14:59:26 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printstrn ( ( tcp_ ) , ( where_ ) . field_ , ( len_ ) ) ; \
} while ( 0 )
2017-07-25 15:47:19 +03:00
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_STR(prefix_, where_, field_, tcp_) \
2017-07-25 15:47:19 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printstr ( ( tcp_ ) , ( where_ ) . field_ ) ; \
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_PATH(prefix_, where_, field_, tcp_) \
2017-07-25 15:47:19 +03:00
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printpath ( ( tcp_ ) , ( where_ ) . field_ ) ; \
} while ( 0 )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_MAC(prefix_, where_, field_) \
2018-05-07 01:04:18 +03:00
PRINT_FIELD_MAC_SZ ( ( prefix_ ) , ( where_ ) , field_ , \
ARRAY_SIZE ( ( where_ ) . field_ ) )
2018-12-30 18:35:21 +03:00
# define PRINT_FIELD_MAC_SZ(prefix_, where_, field_, size_) \
2018-05-07 01:04:18 +03:00
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 )
2017-07-01 16:14:49 +03:00
# endif /* !STRACE_PRINT_FIELDS_H */