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