^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) // Copyright (C) 2018 Facebook
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #ifndef _NETLINK_DUMPER_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #define _NETLINK_DUMPER_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define NET_START_OBJECT \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) if (json_output) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) jsonw_start_object(json_wtr); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define NET_START_OBJECT_NESTED(name) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) if (json_output) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) jsonw_name(json_wtr, name); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) jsonw_start_object(json_wtr); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) } else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) fprintf(stdout, "%s {", name); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define NET_START_OBJECT_NESTED2 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) if (json_output) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) jsonw_start_object(json_wtr); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) fprintf(stdout, "{"); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define NET_END_OBJECT_NESTED \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) if (json_output) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) jsonw_end_object(json_wtr); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) fprintf(stdout, "}"); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define NET_END_OBJECT \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) if (json_output) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) jsonw_end_object(json_wtr); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define NET_END_OBJECT_FINAL \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) if (json_output) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) jsonw_end_object(json_wtr); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) fprintf(stdout, "\n"); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define NET_START_ARRAY(name, fmt_str) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) if (json_output) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) jsonw_name(json_wtr, name); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) jsonw_start_array(json_wtr); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) } else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) fprintf(stdout, fmt_str, name); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define NET_END_ARRAY(endstr) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) if (json_output) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) jsonw_end_array(json_wtr); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) fprintf(stdout, "%s", endstr); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define NET_DUMP_UINT(name, fmt_str, val) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) if (json_output) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) jsonw_uint_field(json_wtr, name, val); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) fprintf(stdout, fmt_str, val); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define NET_DUMP_STR(name, fmt_str, str) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) if (json_output) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) jsonw_string_field(json_wtr, name, str);\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) fprintf(stdout, fmt_str, str); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define NET_DUMP_STR_ONLY(str) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) if (json_output) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) jsonw_string(json_wtr, str); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) fprintf(stdout, "%s ", str); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #endif