2 * Copyright (c) 2016-2017 Dmitry V. Levin <ldv@altlinux.org>
3 * Copyright (c) 2017-2019 The strace developers.
6 * SPDX-License-Identifier: LGPL-2.1-or-later
9 #ifndef STRACE_PRINT_FIELDS_H
10 # define STRACE_PRINT_FIELDS_H
13 * The printf-like function to use in header files
14 * shared between strace and its tests.
16 # ifndef STRACE_PRINTF
17 # define STRACE_PRINTF tprintf
20 # define PRINT_FIELD_D(prefix_, where_, field_) \
21 STRACE_PRINTF("%s%s=%lld", (prefix_), #field_, \
22 sign_extend_unsigned_to_ll((where_).field_))
24 # define PRINT_FIELD_U(prefix_, where_, field_) \
25 STRACE_PRINTF("%s%s=%llu", (prefix_), #field_, \
26 zero_extend_signed_to_ull((where_).field_))
28 # define PRINT_FIELD_U_CAST(prefix_, where_, field_, type_) \
29 STRACE_PRINTF("%s%s=%llu", (prefix_), #field_, \
30 zero_extend_signed_to_ull((type_) (where_).field_))
32 # define PRINT_FIELD_X(prefix_, where_, field_) \
33 STRACE_PRINTF("%s%s=%#llx", (prefix_), #field_, \
34 zero_extend_signed_to_ull((where_).field_))
36 # define PRINT_FIELD_ADDR(prefix_, where_, field_) \
38 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
39 printaddr((where_).field_); \
42 # define PRINT_FIELD_ADDR64(prefix_, where_, field_) \
44 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
45 printaddr64((where_).field_); \
48 # define PRINT_FIELD_0X(prefix_, where_, field_) \
49 STRACE_PRINTF("%s%s=%#0*llx", (prefix_), #field_, \
50 (int) sizeof((where_).field_) * 2, \
51 zero_extend_signed_to_ull((where_).field_))
53 # define PRINT_FIELD_COOKIE(prefix_, where_, field_) \
54 STRACE_PRINTF("%s%s=[%llu, %llu]", (prefix_), #field_, \
55 zero_extend_signed_to_ull((where_).field_[0]), \
56 zero_extend_signed_to_ull((where_).field_[1]))
58 # define PRINT_FIELD_FLAGS(prefix_, where_, field_, xlat_, dflt_) \
60 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
61 printflags64((xlat_), \
62 zero_extend_signed_to_ull((where_).field_),\
66 # define PRINT_FIELD_XVAL(prefix_, where_, field_, xlat_, dflt_) \
68 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
69 printxval64((xlat_), \
70 zero_extend_signed_to_ull((where_).field_), \
74 # define PRINT_FIELD_XVAL_U(prefix_, where_, field_, xlat_, dflt_) \
76 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
77 printxvals_ex(zero_extend_signed_to_ull((where_).field_), \
78 (dflt_), XLAT_STYLE_FMT_U, \
82 # define PRINT_FIELD_ERR_D(prefix_, where_, field_) \
84 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
85 print_err(sign_extend_unsigned_to_ll((where_).field_), \
89 # define PRINT_FIELD_ERR_U(prefix_, where_, field_) \
91 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
92 print_err(zero_extend_signed_to_ull((where_).field_), \
97 * Generic "ID" printing. ID is considered unsigned except for the special value
100 # define PRINT_FIELD_ID(prefix_, where_, field_) \
102 if (sign_extend_unsigned_to_ll((where_).field_) == -1LL) \
103 STRACE_PRINTF("%s%s=-1", (prefix_), #field_); \
105 STRACE_PRINTF("%s%s=%llu", (prefix_), #field_, \
106 zero_extend_signed_to_ull((where_).field_)); \
109 # define PRINT_FIELD_UID PRINT_FIELD_ID
111 # define PRINT_FIELD_UUID(prefix_, where_, field_) \
113 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
114 print_uuid((const unsigned char *) ((where_).field_)); \
117 # define PRINT_FIELD_U64(prefix_, where_, field_) \
119 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
120 if (zero_extend_signed_to_ull((where_).field_) == UINT64_MAX) \
121 print_xlat_u(UINT64_MAX); \
123 STRACE_PRINTF("%llu", \
124 zero_extend_signed_to_ull((where_).field_)); \
127 # define PRINT_FIELD_STRING(prefix_, where_, field_, len_, style_) \
129 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
130 print_quoted_string((const char *)(where_).field_, \
134 # define PRINT_FIELD_CSTRING(prefix_, where_, field_) \
136 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
137 print_quoted_cstring((const char *) (where_).field_, \
138 sizeof((where_).field_) + \
139 MUST_BE_ARRAY((where_).field_)); \
142 # define PRINT_FIELD_CSTRING_SZ(prefix_, where_, field_, size_) \
144 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
145 print_quoted_cstring((const char *) (where_).field_, \
149 # define PRINT_FIELD_HEX_ARRAY(prefix_, where_, field_) \
151 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
152 print_quoted_string((const char *)(where_).field_, \
153 sizeof((where_).field_) + \
154 MUST_BE_ARRAY((where_).field_), \
158 # define PRINT_FIELD_INET_ADDR(prefix_, where_, field_, af_) \
160 STRACE_PRINTF(prefix_); \
161 print_inet_addr((af_), &(where_).field_, \
162 sizeof((where_).field_), #field_); \
165 # define PRINT_FIELD_AX25_ADDR(prefix_, where_, field_) \
167 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
168 print_ax25_addr(&(where_).field_); \
171 # define PRINT_FIELD_X25_ADDR(prefix_, where_, field_) \
173 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
174 print_x25_addr(&(where_).field_); \
177 # define PRINT_FIELD_NET_PORT(prefix_, where_, field_) \
179 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
181 if (xlat_verbose(xlat_verbosity) != XLAT_STYLE_ABBREV) \
182 print_quoted_string((const char *) \
184 sizeof((where_).field_), \
187 if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_RAW) \
190 if (xlat_verbose(xlat_verbosity) \
191 == XLAT_STYLE_VERBOSE) \
192 STRACE_PRINTF(" /* "); \
194 STRACE_PRINTF("htons(%u)", ntohs((where_).field_)); \
196 if (xlat_verbose(xlat_verbosity) \
197 == XLAT_STYLE_VERBOSE) \
198 STRACE_PRINTF(" */"); \
201 # define PRINT_FIELD_IFINDEX(prefix_, where_, field_) \
203 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
204 print_ifindex((where_).field_); \
207 # define PRINT_FIELD_SOCKADDR(prefix_, where_, field_) \
209 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
210 print_sockaddr(&(where_).field_, \
211 sizeof((where_).field_)); \
214 # define PRINT_FIELD_DEV(prefix_, where_, field_) \
216 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
217 print_dev_t((where_).field_); \
220 # define PRINT_FIELD_PTR(prefix_, where_, field_) \
222 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
223 printaddr((mpers_ptr_t) (where_).field_); \
226 # define PRINT_FIELD_FD(prefix_, where_, field_, tcp_) \
228 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
229 printfd((tcp_), (where_).field_); \
232 # define PRINT_FIELD_STRN(prefix_, where_, field_, len_, tcp_) \
234 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
235 printstrn((tcp_), (where_).field_, (len_)); \
239 # define PRINT_FIELD_STR(prefix_, where_, field_, tcp_) \
241 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
242 printstr((tcp_), (where_).field_); \
245 # define PRINT_FIELD_PATH(prefix_, where_, field_, tcp_) \
247 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
248 printpath((tcp_), (where_).field_); \
251 # define PRINT_FIELD_MAC(prefix_, where_, field_) \
252 PRINT_FIELD_MAC_SZ((prefix_), (where_), field_, \
253 ARRAY_SIZE((where_).field_))
255 # define PRINT_FIELD_MAC_SZ(prefix_, where_, field_, size_) \
257 static_assert(sizeof(((where_).field_)[0]) == 1, \
258 "MAC address is not a byte array"); \
259 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
260 print_mac_addr("", (const uint8_t *) ((where_).field_), \
264 # define PRINT_FIELD_HWADDR_SZ(prefix_, where_, field_, size_, hwtype_) \
266 static_assert(sizeof(((where_).field_)[0]) == 1, \
267 "hwaddress is not a byte array"); \
268 STRACE_PRINTF("%s%s=", (prefix_), #field_); \
269 print_hwaddr("", (const uint8_t *) ((where_).field_), \
270 (size_), (hwtype_)); \
273 #endif /* !STRACE_PRINT_FIELDS_H */