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 .
*
* 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 22:59:04 +03: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 16:14:49 +03:00
# define PRINT_FIELD_X(prefix_, where_, field_) \
STRACE_PRINTF ( " %s%s=%#llx " , ( prefix_ ) , # field_ , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) )
2018-03-09 00:51:30 +03: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 05:23:00 +03: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 16:14:49 +03: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 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 )
2017-07-01 16:14:49 +03:00
# define PRINT_FIELD_XVAL(prefix_, where_, field_, xlat_, dflt_) \
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-03-14 01:51:54 +03: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-05-16 13:58:32 +03:00
# define PRINT_FIELD_XVAL_INDEX(prefix_, where_, field_, xlat_, dflt_) \
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.
*/
# 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-01-05 22:57:57 +03:00
# define PRINT_FIELD_UID PRINT_FIELD_ID
2018-03-14 01:46:14 +03: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 ) \
print_xlat_ex ( UINT64_MAX , " UINT64_MAX " , XLAT_STYLE_FMT_U ) ; \
else \
STRACE_PRINTF ( " %llu " , \
zero_extend_signed_to_ull ( ( where_ ) . field_ ) ) ; \
} while ( 0 )
2017-07-11 03:20:54 +03: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 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-03-25 15:11:09 +03: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-12 00:47:11 +03: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 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 )
2017-07-09 16:54:01 +03: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 16:54:01 +03:00
# define PRINT_FIELD_INET4_ADDR(prefix_, where_, field_) \
STRACE_PRINTF ( " %s%s=inet_addr( \" %s \" ) " , ( prefix_ ) , # field_ , \
inet_ntoa ( ( where_ ) . field_ ) )
2017-07-09 16:54:01 +03:00
# define PRINT_FIELD_NET_PORT(prefix_, where_, field_) \
STRACE_PRINTF ( " %s%s=htons(%u) " , ( prefix_ ) , # field_ , \
ntohs ( ( where_ ) . field_ ) )
2017-07-09 16:54:01 +03:00
# define PRINT_FIELD_IFINDEX(prefix_, where_, field_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
print_ifindex ( ( where_ ) . field_ ) ; \
} while ( 0 )
2017-07-09 19:04:24 +03: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 16:54:01 +03: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 03:08:12 +03: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 14:59:26 +03: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 15:47:19 +03: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 01:04:18 +03: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 )
2017-07-01 16:14:49 +03:00
# endif /* !STRACE_PRINT_FIELDS_H */