]> granicus.if.org Git - strace/blobdiff - print_fields.h
nlattr: add UID/GID netlink attribute decoders
[strace] / print_fields.h
index 401ff04fbba5f24c8a8c02144483e2ef7dc9a398..ffcabf46b1881d9a3e67da8e60ae452cb54b17a3 100644 (file)
        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,                \
                            (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_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_ex(UINT64_MAX, "UINT64_MAX", XLAT_STYLE_FMT_U);      \
+               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_);             \
 #define PRINT_FIELD_CSTRING(prefix_, where_, field_)                   \
        do {                                                            \
                STRACE_PRINTF("%s%s=", (prefix_), #field_);             \
-               print_quoted_cstring((const char *)(where_).field_,     \
-                                    sizeof((where_).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_) +          \
+                                   sizeof((where_).field_) +           \
                                            MUST_BE_ARRAY((where_).field_), \
                                    QUOTE_FORCE_HEX); \
        } while (0)
                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 */