strace/print_fields.h
Dmitry V. Levin b93d52fe3d Change the license of strace to LGPL-2.1-or-later
strace is now provided under the terms of the GNU Lesser General
Public License version 2.1 or later, see COPYING for more details.

strace test suite is now provided under the terms of the GNU General
Public License version 2 or later, see tests/COPYING for more details.
2018-12-10 00:00:00 +00:00

246 lines
7.7 KiB
C

/*
* Copyright (c) 2016-2017 Dmitry V. Levin <ldv@altlinux.org>
* Copyright (c) 2017-2018 The strace developers.
* All rights reserved.
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*/
#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_))
#define PRINT_FIELD_U_CAST(prefix_, where_, field_, type_) \
STRACE_PRINTF("%s%s=%llu", (prefix_), #field_, \
zero_extend_signed_to_ull((type_) (where_).field_))
#define PRINT_FIELD_X(prefix_, where_, field_) \
STRACE_PRINTF("%s%s=%#llx", (prefix_), #field_, \
zero_extend_signed_to_ull((where_).field_))
#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)
#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_))
#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_); \
printflags64((xlat_), \
zero_extend_signed_to_ull((where_).field_),\
(dflt_)); \
} while (0)
#define PRINT_FIELD_XVAL(prefix_, where_, field_, xlat_, dflt_) \
do { \
STRACE_PRINTF("%s%s=", (prefix_), #field_); \
printxval64((xlat_), \
zero_extend_signed_to_ull((where_).field_), \
(dflt_)); \
} while (0)
#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)
#define PRINT_FIELD_XVAL_SORTED_SIZED(prefix_, where_, field_, xlat_, \
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)
#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)
/*
* Generic "ID" printing. ID is considered unsigned except for the special value
* of -1.
*/
#define PRINT_FIELD_ID(prefix_, where_, field_) \
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)
#define PRINT_FIELD_UID PRINT_FIELD_ID
#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_u(UINT64_MAX); \
else \
STRACE_PRINTF("%llu", \
zero_extend_signed_to_ull((where_).field_)); \
} while (0)
#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_); \
print_quoted_cstring((const char *) (where_).field_, \
sizeof((where_).field_) + \
MUST_BE_ARRAY((where_).field_)); \
} while (0)
#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)
#define PRINT_FIELD_HEX_ARRAY(prefix_, where_, field_) \
do { \
STRACE_PRINTF("%s%s=", (prefix_), #field_); \
print_quoted_string((const char *)(where_).field_, \
sizeof((where_).field_) + \
MUST_BE_ARRAY((where_).field_), \
QUOTE_FORCE_HEX); \
} while (0)
#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)
#define PRINT_FIELD_INET4_ADDR(prefix_, where_, field_) \
STRACE_PRINTF("%s%s=inet_addr(\"%s\")", (prefix_), #field_, \
inet_ntoa((where_).field_))
#define PRINT_FIELD_AX25_ADDR(prefix_, where_, field_) \
do { \
STRACE_PRINTF("%s%s=", (prefix_), #field_); \
print_ax25_addr(&(where_).field_); \
} while (0)
#define PRINT_FIELD_X25_ADDR(prefix_, where_, field_) \
do { \
STRACE_PRINTF("%s%s=", (prefix_), #field_); \
print_x25_addr(&(where_).field_); \
} while (0)
#define PRINT_FIELD_NET_PORT(prefix_, where_, field_) \
STRACE_PRINTF("%s%s=htons(%u)", (prefix_), #field_, \
ntohs((where_).field_))
#define PRINT_FIELD_IFINDEX(prefix_, where_, field_) \
do { \
STRACE_PRINTF("%s%s=", (prefix_), #field_); \
print_ifindex((where_).field_); \
} while (0)
#define PRINT_FIELD_SOCKADDR(prefix_, where_, field_) \
do { \
STRACE_PRINTF("%s%s=", (prefix_), #field_); \
print_sockaddr(&(where_).field_, \
sizeof((where_).field_)); \
} while (0)
#define PRINT_FIELD_DEV(prefix_, where_, field_) \
do { \
STRACE_PRINTF("%s%s=", (prefix_), #field_); \
print_dev_t((where_).field_); \
} while (0)
#define PRINT_FIELD_PTR(prefix_, where_, field_) \
do { \
STRACE_PRINTF("%s%s=", (prefix_), #field_); \
printaddr((mpers_ptr_t) (where_).field_); \
} while (0)
#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)
#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)
#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)
#endif /* !STRACE_PRINT_FIELDS_H */