/src/systemd/src/libsystemd/sd-json/json-util.h
Line | Count | Source |
1 | | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
2 | | #pragma once |
3 | | |
4 | | #include <syslog.h> |
5 | | |
6 | | #include "sd-json.h" |
7 | | |
8 | | #include "log.h" |
9 | | #include "forward.h" |
10 | | #include "string-util.h" /* IWYU pragma: keep */ |
11 | | |
12 | | #define JSON_VARIANT_REPLACE(v, q) \ |
13 | 80.5k | do { \ |
14 | 80.5k | typeof(v)* _v = &(v); \ |
15 | 80.5k | typeof(q) _q = (q); \ |
16 | 80.5k | sd_json_variant_unref(*_v); \ |
17 | 80.5k | *_v = _q; \ |
18 | 80.5k | } while(false) |
19 | | |
20 | | #define json_variant_unref_and_replace(a, b) \ |
21 | 31.1M | free_and_replace_full(a, b, sd_json_variant_unref) |
22 | | |
23 | 4.19k | static inline int json_variant_set_field_non_null(sd_json_variant **v, const char *field, sd_json_variant *value) { |
24 | 4.19k | return value && !sd_json_variant_is_null(value) ? sd_json_variant_set_field(v, field, value) : 0; |
25 | 4.19k | } Unexecuted instantiation: udev-dump.c:json_variant_set_field_non_null Unexecuted instantiation: udev-varlink.c:json_variant_set_field_non_null Unexecuted instantiation: nspawn-oci.c:json_variant_set_field_non_null Unexecuted instantiation: resolved-dns-scope.c:json_variant_set_field_non_null Unexecuted instantiation: resolved-dns-server.c:json_variant_set_field_non_null Unexecuted instantiation: resolved-hook.c:json_variant_set_field_non_null Unexecuted instantiation: resolved-manager.c:json_variant_set_field_non_null Unexecuted instantiation: resolved-static-records.c:json_variant_set_field_non_null Unexecuted instantiation: resolved-varlink.c:json_variant_set_field_non_null Unexecuted instantiation: networkd-json.c:json_variant_set_field_non_null Unexecuted instantiation: networkd-link-varlink.c:json_variant_set_field_non_null Unexecuted instantiation: networkd-manager-varlink.c:json_variant_set_field_non_null Unexecuted instantiation: networkd-serialize.c:json_variant_set_field_non_null Unexecuted instantiation: dhcp-message.c:json_variant_set_field_non_null Unexecuted instantiation: sd-dhcp-client-id.c:json_variant_set_field_non_null sd-dhcp-server-lease.c:json_variant_set_field_non_null Line | Count | Source | 23 | 4.19k | static inline int json_variant_set_field_non_null(sd_json_variant **v, const char *field, sd_json_variant *value) { | 24 | 4.19k | return value && !sd_json_variant_is_null(value) ? sd_json_variant_set_field(v, field, value) : 0; | 25 | 4.19k | } |
Unexecuted instantiation: sd-lldp-tx.c:json_variant_set_field_non_null Unexecuted instantiation: tlv-util.c:json_variant_set_field_non_null Unexecuted instantiation: lldp-neighbor.c:json_variant_set_field_non_null Unexecuted instantiation: fuzz-bootspec.c:json_variant_set_field_non_null Unexecuted instantiation: bootspec.c:json_variant_set_field_non_null Unexecuted instantiation: creds-util.c:json_variant_set_field_non_null Unexecuted instantiation: dissect-image.c:json_variant_set_field_non_null Unexecuted instantiation: dns-configuration.c:json_variant_set_field_non_null Unexecuted instantiation: dns-question.c:json_variant_set_field_non_null Unexecuted instantiation: dns-rr.c:json_variant_set_field_non_null Unexecuted instantiation: elf-util.c:json_variant_set_field_non_null Unexecuted instantiation: format-table.c:json_variant_set_field_non_null Unexecuted instantiation: group-record.c:json_variant_set_field_non_null Unexecuted instantiation: luo-util.c:json_variant_set_field_non_null Unexecuted instantiation: machine-bind-user.c:json_variant_set_field_non_null Unexecuted instantiation: machine-register.c:json_variant_set_field_non_null Unexecuted instantiation: metrics.c:json_variant_set_field_non_null Unexecuted instantiation: nsresource.c:json_variant_set_field_non_null Unexecuted instantiation: qmp-client.c:json_variant_set_field_non_null Unexecuted instantiation: resolve-varlink-util.c:json_variant_set_field_non_null Unexecuted instantiation: storage-util.c:json_variant_set_field_non_null Unexecuted instantiation: swtpm-util.c:json_variant_set_field_non_null Unexecuted instantiation: tpm2-util.c:json_variant_set_field_non_null Unexecuted instantiation: user-record-nss.c:json_variant_set_field_non_null Unexecuted instantiation: user-record.c:json_variant_set_field_non_null Unexecuted instantiation: userdb.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-io.systemd.service.c:json_variant_set_field_non_null Unexecuted instantiation: bus-dump-json.c:json_variant_set_field_non_null Unexecuted instantiation: json-util.c:json_variant_set_field_non_null Unexecuted instantiation: sd-json.c:json_variant_set_field_non_null Unexecuted instantiation: sd-varlink.c:json_variant_set_field_non_null Unexecuted instantiation: sd-varlink-idl.c:json_variant_set_field_non_null Unexecuted instantiation: luo.c:json_variant_set_field_non_null Unexecuted instantiation: varlink.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-automount.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-cgroup.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-common.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-dynamic-user.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-execute.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-job.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-kill.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-manager.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-mount.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-path.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-scope.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-service.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-socket.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-swap.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-timer.c:json_variant_set_field_non_null Unexecuted instantiation: varlink-unit.c:json_variant_set_field_non_null |
26 | | |
27 | | struct json_variant_foreach_state { |
28 | | sd_json_variant *variant; |
29 | | size_t idx; |
30 | | }; |
31 | | |
32 | | #define _JSON_VARIANT_ARRAY_FOREACH(i, v, state) \ |
33 | 56.7k | for (struct json_variant_foreach_state state = { (v), 0 }; \ |
34 | 1.23M | sd_json_variant_is_array(state.variant) && \ |
35 | 1.23M | state.idx < sd_json_variant_elements(state.variant) && \ |
36 | 1.23M | ({ i = sd_json_variant_by_index(state.variant, state.idx); \ |
37 | 1.19M | true; }); \ |
38 | 1.18M | state.idx++) |
39 | | #define JSON_VARIANT_ARRAY_FOREACH(i, v) \ |
40 | 56.7k | _JSON_VARIANT_ARRAY_FOREACH(i, v, UNIQ_T(state, UNIQ)) |
41 | | |
42 | | #define _JSON_VARIANT_OBJECT_FOREACH(k, e, v, state) \ |
43 | 694k | for (struct json_variant_foreach_state state = { (v), 0 }; \ |
44 | 1.60M | sd_json_variant_is_object(state.variant) && \ |
45 | 1.60M | state.idx < sd_json_variant_elements(state.variant) && \ |
46 | 1.60M | ({ k = sd_json_variant_string(sd_json_variant_by_index(state.variant, state.idx)); \ |
47 | 915k | e = sd_json_variant_by_index(state.variant, state.idx + 1); \ |
48 | 915k | true; }); \ |
49 | 907k | state.idx += 2) |
50 | | #define JSON_VARIANT_OBJECT_FOREACH(k, e, v) \ |
51 | 694k | _JSON_VARIANT_OBJECT_FOREACH(k, e, v, UNIQ_T(state, UNIQ)) |
52 | | |
53 | | #define JSON_DISPATCH_ENUM_DEFINE(name, type, func) \ |
54 | 11.9k | int name(const char *n, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata) { \ |
55 | 11.9k | type *c = ASSERT_PTR(userdata); \ |
56 | 0 | \ |
57 | 11.9k | assert(variant); \ |
58 | 0 | \ |
59 | 11.9k | if (sd_json_variant_is_null(variant)) { \ |
60 | 0 | *c = (type) -EINVAL; \ |
61 | 0 | return 0; \ |
62 | 0 | } \ |
63 | 0 | \ |
64 | 11.9k | if (!sd_json_variant_is_string(variant)) \ |
65 | 11.9k | return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a string.", strna(n)); \ |
66 | 11.9k | \ |
67 | 11.9k | type cc = func(sd_json_variant_string(variant)); \ |
68 | 11.9k | if (cc < 0) { \ |
69 | 311 | /* Maybe this enum is recognizable if we replace "_" (i.e. Varlink syntax) with "-" (how we usually prefer it). */ \ |
70 | 311 | _cleanup_free_ char *z = strdup(sd_json_variant_string(variant)); \ |
71 | 311 | if (!z) \ |
72 | 311 | return json_log_oom(variant, flags); \ |
73 | 311 | \ |
74 | 311 | cc = func(json_dashify(z)); \ |
75 | 311 | if (cc < 0) \ |
76 | 311 | return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "Value of JSON field '%s' not recognized: %s", strna(n), sd_json_variant_string(variant)); \ |
77 | 311 | } \ |
78 | 11.9k | \ |
79 | 11.9k | *c = cc; \ |
80 | 11.6k | return 0; \ |
81 | 11.9k | } |
82 | | |
83 | 361k | static inline int json_dispatch_level(sd_json_dispatch_flags_t flags) { |
84 | | |
85 | | /* Did the user request no logging? If so, then never log higher than LOG_DEBUG. Also, if this is marked as |
86 | | * debug message, then also log at debug level. */ |
87 | | |
88 | 361k | if (!(flags & SD_JSON_LOG) || |
89 | 1.23k | (flags & SD_JSON_DEBUG)) |
90 | 360k | return LOG_DEBUG; |
91 | | |
92 | | /* Are we invoked in permissive mode, or is this explicitly marked as warning message? Then this should be |
93 | | * printed at LOG_WARNING */ |
94 | 1.23k | if (flags & (SD_JSON_PERMISSIVE|SD_JSON_WARNING)) |
95 | 8 | return LOG_WARNING; |
96 | | |
97 | | /* Otherwise it's an error. */ |
98 | 1.22k | return LOG_ERR; |
99 | 1.23k | } Unexecuted instantiation: udev-dump.c:json_dispatch_level Unexecuted instantiation: udev-varlink.c:json_dispatch_level nspawn-oci.c:json_dispatch_level Line | Count | Source | 83 | 12.0k | static inline int json_dispatch_level(sd_json_dispatch_flags_t flags) { | 84 | | | 85 | | /* Did the user request no logging? If so, then never log higher than LOG_DEBUG. Also, if this is marked as | 86 | | * debug message, then also log at debug level. */ | 87 | | | 88 | 12.0k | if (!(flags & SD_JSON_LOG) || | 89 | 1.22k | (flags & SD_JSON_DEBUG)) | 90 | 10.7k | return LOG_DEBUG; | 91 | | | 92 | | /* Are we invoked in permissive mode, or is this explicitly marked as warning message? Then this should be | 93 | | * printed at LOG_WARNING */ | 94 | 1.22k | if (flags & (SD_JSON_PERMISSIVE|SD_JSON_WARNING)) | 95 | 0 | return LOG_WARNING; | 96 | | | 97 | | /* Otherwise it's an error. */ | 98 | 1.22k | return LOG_ERR; | 99 | 1.22k | } |
Unexecuted instantiation: resolved-dns-scope.c:json_dispatch_level Unexecuted instantiation: resolved-dns-server.c:json_dispatch_level Unexecuted instantiation: resolved-hook.c:json_dispatch_level Unexecuted instantiation: resolved-manager.c:json_dispatch_level Unexecuted instantiation: resolved-static-records.c:json_dispatch_level Unexecuted instantiation: resolved-varlink.c:json_dispatch_level Unexecuted instantiation: networkd-json.c:json_dispatch_level Unexecuted instantiation: networkd-link-varlink.c:json_dispatch_level Unexecuted instantiation: networkd-manager-varlink.c:json_dispatch_level Unexecuted instantiation: networkd-serialize.c:json_dispatch_level Unexecuted instantiation: dhcp-message.c:json_dispatch_level Unexecuted instantiation: sd-dhcp-client-id.c:json_dispatch_level Unexecuted instantiation: sd-dhcp-server-lease.c:json_dispatch_level Unexecuted instantiation: sd-lldp-tx.c:json_dispatch_level Unexecuted instantiation: tlv-util.c:json_dispatch_level Unexecuted instantiation: lldp-neighbor.c:json_dispatch_level Unexecuted instantiation: fuzz-bootspec.c:json_dispatch_level Unexecuted instantiation: bootspec.c:json_dispatch_level Unexecuted instantiation: creds-util.c:json_dispatch_level Unexecuted instantiation: dissect-image.c:json_dispatch_level Unexecuted instantiation: dns-configuration.c:json_dispatch_level Unexecuted instantiation: dns-question.c:json_dispatch_level Unexecuted instantiation: dns-rr.c:json_dispatch_level Unexecuted instantiation: elf-util.c:json_dispatch_level Unexecuted instantiation: format-table.c:json_dispatch_level Unexecuted instantiation: group-record.c:json_dispatch_level Unexecuted instantiation: luo-util.c:json_dispatch_level Unexecuted instantiation: machine-bind-user.c:json_dispatch_level Unexecuted instantiation: machine-register.c:json_dispatch_level Unexecuted instantiation: metrics.c:json_dispatch_level Unexecuted instantiation: nsresource.c:json_dispatch_level Unexecuted instantiation: qmp-client.c:json_dispatch_level Unexecuted instantiation: resolve-varlink-util.c:json_dispatch_level Unexecuted instantiation: storage-util.c:json_dispatch_level Unexecuted instantiation: swtpm-util.c:json_dispatch_level Unexecuted instantiation: tpm2-util.c:json_dispatch_level Unexecuted instantiation: user-record-nss.c:json_dispatch_level user-record.c:json_dispatch_level Line | Count | Source | 83 | 90.7k | static inline int json_dispatch_level(sd_json_dispatch_flags_t flags) { | 84 | | | 85 | | /* Did the user request no logging? If so, then never log higher than LOG_DEBUG. Also, if this is marked as | 86 | | * debug message, then also log at debug level. */ | 87 | | | 88 | 90.7k | if (!(flags & SD_JSON_LOG) || | 89 | 0 | (flags & SD_JSON_DEBUG)) | 90 | 90.7k | return LOG_DEBUG; | 91 | | | 92 | | /* Are we invoked in permissive mode, or is this explicitly marked as warning message? Then this should be | 93 | | * printed at LOG_WARNING */ | 94 | 0 | if (flags & (SD_JSON_PERMISSIVE|SD_JSON_WARNING)) | 95 | 0 | return LOG_WARNING; | 96 | | | 97 | | /* Otherwise it's an error. */ | 98 | 0 | return LOG_ERR; | 99 | 0 | } |
Unexecuted instantiation: userdb.c:json_dispatch_level Unexecuted instantiation: varlink-io.systemd.service.c:json_dispatch_level Unexecuted instantiation: bus-dump-json.c:json_dispatch_level json-util.c:json_dispatch_level Line | Count | Source | 83 | 5.05k | static inline int json_dispatch_level(sd_json_dispatch_flags_t flags) { | 84 | | | 85 | | /* Did the user request no logging? If so, then never log higher than LOG_DEBUG. Also, if this is marked as | 86 | | * debug message, then also log at debug level. */ | 87 | | | 88 | 5.05k | if (!(flags & SD_JSON_LOG) || | 89 | 0 | (flags & SD_JSON_DEBUG)) | 90 | 5.05k | return LOG_DEBUG; | 91 | | | 92 | | /* Are we invoked in permissive mode, or is this explicitly marked as warning message? Then this should be | 93 | | * printed at LOG_WARNING */ | 94 | 0 | if (flags & (SD_JSON_PERMISSIVE|SD_JSON_WARNING)) | 95 | 0 | return LOG_WARNING; | 96 | | | 97 | | /* Otherwise it's an error. */ | 98 | 0 | return LOG_ERR; | 99 | 0 | } |
sd-json.c:json_dispatch_level Line | Count | Source | 83 | 253k | static inline int json_dispatch_level(sd_json_dispatch_flags_t flags) { | 84 | | | 85 | | /* Did the user request no logging? If so, then never log higher than LOG_DEBUG. Also, if this is marked as | 86 | | * debug message, then also log at debug level. */ | 87 | | | 88 | 253k | if (!(flags & SD_JSON_LOG) || | 89 | 8 | (flags & SD_JSON_DEBUG)) | 90 | 253k | return LOG_DEBUG; | 91 | | | 92 | | /* Are we invoked in permissive mode, or is this explicitly marked as warning message? Then this should be | 93 | | * printed at LOG_WARNING */ | 94 | 8 | if (flags & (SD_JSON_PERMISSIVE|SD_JSON_WARNING)) | 95 | 8 | return LOG_WARNING; | 96 | | | 97 | | /* Otherwise it's an error. */ | 98 | 0 | return LOG_ERR; | 99 | 8 | } |
Unexecuted instantiation: sd-varlink.c:json_dispatch_level Unexecuted instantiation: sd-varlink-idl.c:json_dispatch_level Unexecuted instantiation: luo.c:json_dispatch_level Unexecuted instantiation: varlink.c:json_dispatch_level Unexecuted instantiation: varlink-automount.c:json_dispatch_level Unexecuted instantiation: varlink-cgroup.c:json_dispatch_level Unexecuted instantiation: varlink-common.c:json_dispatch_level Unexecuted instantiation: varlink-dynamic-user.c:json_dispatch_level Unexecuted instantiation: varlink-execute.c:json_dispatch_level Unexecuted instantiation: varlink-job.c:json_dispatch_level Unexecuted instantiation: varlink-kill.c:json_dispatch_level Unexecuted instantiation: varlink-manager.c:json_dispatch_level Unexecuted instantiation: varlink-mount.c:json_dispatch_level Unexecuted instantiation: varlink-path.c:json_dispatch_level Unexecuted instantiation: varlink-scope.c:json_dispatch_level Unexecuted instantiation: varlink-service.c:json_dispatch_level Unexecuted instantiation: varlink-socket.c:json_dispatch_level Unexecuted instantiation: varlink-swap.c:json_dispatch_level Unexecuted instantiation: varlink-timer.c:json_dispatch_level Unexecuted instantiation: varlink-unit.c:json_dispatch_level |
100 | | |
101 | | int json_log_internal(sd_json_variant *variant, int level, int error, const char *file, int line, const char *func, const char *format, ...) _printf_(7, 8); |
102 | | |
103 | | #define json_log(variant, flags, error, ...) \ |
104 | 375k | ({ \ |
105 | 27.4k | int _level = json_dispatch_level(flags), _e = (error); \ |
106 | 361k | (log_get_max_level() >= LOG_PRI(_level)) \ |
107 | 27.4k | ? json_log_internal(variant, _level, _e, PROJECT_FILE, __LINE__, __func__, __VA_ARGS__) \ |
108 | 361k | : -ERRNO_VALUE(_e); \ |
109 | 27.4k | }) |
110 | | |
111 | | #define json_log_oom(variant, flags) \ |
112 | 0 | json_log(variant, flags, SYNTHETIC_ERRNO(ENOMEM), "Out of memory.") |
113 | | |
114 | | int json_dispatch_unhex_iovec(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
115 | | int json_dispatch_unbase64_iovec(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
116 | | int json_dispatch_byte_array_iovec(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
117 | | int json_dispatch_user_group_name(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
118 | | int json_dispatch_const_user_group_name(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
119 | | int json_dispatch_const_unit_name(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
120 | | int json_dispatch_in_addr(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
121 | | int json_dispatch_in6_addr(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
122 | | int json_dispatch_in_addr_data(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
123 | | int json_dispatch_dual_timestamp(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
124 | | int json_dispatch_path(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
125 | | int json_dispatch_const_path(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
126 | | int json_dispatch_strv_path(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
127 | | int json_dispatch_filename(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
128 | | int json_dispatch_const_filename(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
129 | | int json_dispatch_version(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
130 | | int json_dispatch_const_version(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
131 | | int json_dispatch_pidref(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
132 | | int json_dispatch_devnum(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
133 | | int json_dispatch_ifindex(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
134 | | int json_dispatch_log_level(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
135 | | int json_dispatch_strv_environment(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
136 | | int json_dispatch_access_mode(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
137 | | int json_dispatch_job_id(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
138 | | int json_dispatch_address_family(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); |
139 | | |
140 | 0 | static inline int json_variant_unbase64_iovec(sd_json_variant *v, struct iovec *ret) { |
141 | 0 | return sd_json_variant_unbase64(v, ret ? &ret->iov_base : NULL, ret ? &ret->iov_len : NULL); |
142 | 0 | } Unexecuted instantiation: udev-dump.c:json_variant_unbase64_iovec Unexecuted instantiation: udev-varlink.c:json_variant_unbase64_iovec Unexecuted instantiation: nspawn-oci.c:json_variant_unbase64_iovec Unexecuted instantiation: resolved-dns-scope.c:json_variant_unbase64_iovec Unexecuted instantiation: resolved-dns-server.c:json_variant_unbase64_iovec Unexecuted instantiation: resolved-hook.c:json_variant_unbase64_iovec Unexecuted instantiation: resolved-manager.c:json_variant_unbase64_iovec Unexecuted instantiation: resolved-static-records.c:json_variant_unbase64_iovec Unexecuted instantiation: resolved-varlink.c:json_variant_unbase64_iovec Unexecuted instantiation: networkd-json.c:json_variant_unbase64_iovec Unexecuted instantiation: networkd-link-varlink.c:json_variant_unbase64_iovec Unexecuted instantiation: networkd-manager-varlink.c:json_variant_unbase64_iovec Unexecuted instantiation: networkd-serialize.c:json_variant_unbase64_iovec Unexecuted instantiation: dhcp-message.c:json_variant_unbase64_iovec Unexecuted instantiation: sd-dhcp-client-id.c:json_variant_unbase64_iovec Unexecuted instantiation: sd-dhcp-server-lease.c:json_variant_unbase64_iovec Unexecuted instantiation: sd-lldp-tx.c:json_variant_unbase64_iovec Unexecuted instantiation: tlv-util.c:json_variant_unbase64_iovec Unexecuted instantiation: lldp-neighbor.c:json_variant_unbase64_iovec Unexecuted instantiation: fuzz-bootspec.c:json_variant_unbase64_iovec Unexecuted instantiation: bootspec.c:json_variant_unbase64_iovec Unexecuted instantiation: creds-util.c:json_variant_unbase64_iovec Unexecuted instantiation: dissect-image.c:json_variant_unbase64_iovec Unexecuted instantiation: dns-configuration.c:json_variant_unbase64_iovec Unexecuted instantiation: dns-question.c:json_variant_unbase64_iovec Unexecuted instantiation: dns-rr.c:json_variant_unbase64_iovec Unexecuted instantiation: elf-util.c:json_variant_unbase64_iovec Unexecuted instantiation: format-table.c:json_variant_unbase64_iovec Unexecuted instantiation: group-record.c:json_variant_unbase64_iovec Unexecuted instantiation: luo-util.c:json_variant_unbase64_iovec Unexecuted instantiation: machine-bind-user.c:json_variant_unbase64_iovec Unexecuted instantiation: machine-register.c:json_variant_unbase64_iovec Unexecuted instantiation: metrics.c:json_variant_unbase64_iovec Unexecuted instantiation: nsresource.c:json_variant_unbase64_iovec Unexecuted instantiation: qmp-client.c:json_variant_unbase64_iovec Unexecuted instantiation: resolve-varlink-util.c:json_variant_unbase64_iovec Unexecuted instantiation: storage-util.c:json_variant_unbase64_iovec Unexecuted instantiation: swtpm-util.c:json_variant_unbase64_iovec Unexecuted instantiation: tpm2-util.c:json_variant_unbase64_iovec Unexecuted instantiation: user-record-nss.c:json_variant_unbase64_iovec Unexecuted instantiation: user-record.c:json_variant_unbase64_iovec Unexecuted instantiation: userdb.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-io.systemd.service.c:json_variant_unbase64_iovec Unexecuted instantiation: bus-dump-json.c:json_variant_unbase64_iovec Unexecuted instantiation: json-util.c:json_variant_unbase64_iovec Unexecuted instantiation: sd-json.c:json_variant_unbase64_iovec Unexecuted instantiation: sd-varlink.c:json_variant_unbase64_iovec Unexecuted instantiation: sd-varlink-idl.c:json_variant_unbase64_iovec Unexecuted instantiation: luo.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-automount.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-cgroup.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-common.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-dynamic-user.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-execute.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-job.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-kill.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-manager.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-mount.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-path.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-scope.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-service.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-socket.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-swap.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-timer.c:json_variant_unbase64_iovec Unexecuted instantiation: varlink-unit.c:json_variant_unbase64_iovec |
143 | | |
144 | 0 | static inline int json_variant_unhex_iovec(sd_json_variant *v, struct iovec *ret) { |
145 | 0 | return sd_json_variant_unhex(v, ret ? &ret->iov_base : NULL, ret ? &ret->iov_len : NULL); |
146 | 0 | } Unexecuted instantiation: udev-dump.c:json_variant_unhex_iovec Unexecuted instantiation: udev-varlink.c:json_variant_unhex_iovec Unexecuted instantiation: nspawn-oci.c:json_variant_unhex_iovec Unexecuted instantiation: resolved-dns-scope.c:json_variant_unhex_iovec Unexecuted instantiation: resolved-dns-server.c:json_variant_unhex_iovec Unexecuted instantiation: resolved-hook.c:json_variant_unhex_iovec Unexecuted instantiation: resolved-manager.c:json_variant_unhex_iovec Unexecuted instantiation: resolved-static-records.c:json_variant_unhex_iovec Unexecuted instantiation: resolved-varlink.c:json_variant_unhex_iovec Unexecuted instantiation: networkd-json.c:json_variant_unhex_iovec Unexecuted instantiation: networkd-link-varlink.c:json_variant_unhex_iovec Unexecuted instantiation: networkd-manager-varlink.c:json_variant_unhex_iovec Unexecuted instantiation: networkd-serialize.c:json_variant_unhex_iovec Unexecuted instantiation: dhcp-message.c:json_variant_unhex_iovec Unexecuted instantiation: sd-dhcp-client-id.c:json_variant_unhex_iovec Unexecuted instantiation: sd-dhcp-server-lease.c:json_variant_unhex_iovec Unexecuted instantiation: sd-lldp-tx.c:json_variant_unhex_iovec Unexecuted instantiation: tlv-util.c:json_variant_unhex_iovec Unexecuted instantiation: lldp-neighbor.c:json_variant_unhex_iovec Unexecuted instantiation: fuzz-bootspec.c:json_variant_unhex_iovec Unexecuted instantiation: bootspec.c:json_variant_unhex_iovec Unexecuted instantiation: creds-util.c:json_variant_unhex_iovec Unexecuted instantiation: dissect-image.c:json_variant_unhex_iovec Unexecuted instantiation: dns-configuration.c:json_variant_unhex_iovec Unexecuted instantiation: dns-question.c:json_variant_unhex_iovec Unexecuted instantiation: dns-rr.c:json_variant_unhex_iovec Unexecuted instantiation: elf-util.c:json_variant_unhex_iovec Unexecuted instantiation: format-table.c:json_variant_unhex_iovec Unexecuted instantiation: group-record.c:json_variant_unhex_iovec Unexecuted instantiation: luo-util.c:json_variant_unhex_iovec Unexecuted instantiation: machine-bind-user.c:json_variant_unhex_iovec Unexecuted instantiation: machine-register.c:json_variant_unhex_iovec Unexecuted instantiation: metrics.c:json_variant_unhex_iovec Unexecuted instantiation: nsresource.c:json_variant_unhex_iovec Unexecuted instantiation: qmp-client.c:json_variant_unhex_iovec Unexecuted instantiation: resolve-varlink-util.c:json_variant_unhex_iovec Unexecuted instantiation: storage-util.c:json_variant_unhex_iovec Unexecuted instantiation: swtpm-util.c:json_variant_unhex_iovec Unexecuted instantiation: tpm2-util.c:json_variant_unhex_iovec Unexecuted instantiation: user-record-nss.c:json_variant_unhex_iovec Unexecuted instantiation: user-record.c:json_variant_unhex_iovec Unexecuted instantiation: userdb.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-io.systemd.service.c:json_variant_unhex_iovec Unexecuted instantiation: bus-dump-json.c:json_variant_unhex_iovec Unexecuted instantiation: json-util.c:json_variant_unhex_iovec Unexecuted instantiation: sd-json.c:json_variant_unhex_iovec Unexecuted instantiation: sd-varlink.c:json_variant_unhex_iovec Unexecuted instantiation: sd-varlink-idl.c:json_variant_unhex_iovec Unexecuted instantiation: luo.c:json_variant_unhex_iovec Unexecuted instantiation: varlink.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-automount.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-cgroup.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-common.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-dynamic-user.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-execute.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-job.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-kill.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-manager.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-mount.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-path.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-scope.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-service.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-socket.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-swap.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-timer.c:json_variant_unhex_iovec Unexecuted instantiation: varlink-unit.c:json_variant_unhex_iovec |
147 | | |
148 | 0 | #define JSON_VARIANT_STRING_CONST(x) _JSON_VARIANT_STRING_CONST(UNIQ, (x)) |
149 | | |
150 | | #define _JSON_VARIANT_STRING_CONST(xq, x) \ |
151 | 0 | ({ \ |
152 | 0 | _align_(2) static const char UNIQ_T(json_string_const, xq)[] = (x); \ |
153 | 0 | assert((((uintptr_t) UNIQ_T(json_string_const, xq)) & 1) == 0); \ |
154 | 0 | (sd_json_variant*) ((uintptr_t) UNIQ_T(json_string_const, xq) + 1); \ |
155 | 0 | }) |
156 | | |
157 | | enum { |
158 | | /* This extends the _SD_JSON_BUILD_* enums we define in the public API with some additional values |
159 | | * that we want to keep private for now. (Mostly because the underlying structures are not public, or |
160 | | * because we aren't sure yet they are useful for others). */ |
161 | | _JSON_BUILD_STRV_ENV_PAIR = _SD_JSON_BUILD_MAX, |
162 | | _JSON_BUILD_IOVEC_BASE64, |
163 | | _JSON_BUILD_IOVEC_HEX, |
164 | | _JSON_BUILD_HW_ADDR, |
165 | | _JSON_BUILD_STRING_SET, |
166 | | _JSON_BUILD_STRING_ORDERED_SET, |
167 | | _JSON_BUILD_STRING_UNDERSCORIFY, |
168 | | _JSON_BUILD_DUAL_TIMESTAMP, |
169 | | _JSON_BUILD_RATELIMIT, |
170 | | _JSON_BUILD_TRISTATE, |
171 | | _JSON_BUILD_PIDREF, |
172 | | _JSON_BUILD_DEVNUM, |
173 | | |
174 | | _JSON_BUILD_PAIR_INTEGER_NON_ZERO, |
175 | | _JSON_BUILD_PAIR_INTEGER_NON_NEGATIVE, |
176 | | _JSON_BUILD_PAIR_UNSIGNED_NON_ZERO, |
177 | | _JSON_BUILD_PAIR_UNSIGNED_NOT_EQUAL, |
178 | | _JSON_BUILD_PAIR_FINITE_USEC, |
179 | | _JSON_BUILD_PAIR_FINITE_USEC_NON_ZERO, |
180 | | _JSON_BUILD_PAIR_STRING_NON_EMPTY, |
181 | | _JSON_BUILD_PAIR_STRING_NON_EMPTY_UNDERSCORIFY, |
182 | | _JSON_BUILD_PAIR_STRV_NON_EMPTY, |
183 | | _JSON_BUILD_PAIR_STRV_ENV_PAIR_NON_EMPTY, |
184 | | _JSON_BUILD_PAIR_VARIANT_NON_NULL, |
185 | | _JSON_BUILD_PAIR_VARIANT_NON_EMPTY, |
186 | | /* _SD_JSON_BUILD_PAIR_VARIANT_ARRAY_NON_EMPTY, */ |
187 | | _JSON_BUILD_PAIR_BYTE_ARRAY_NON_EMPTY, |
188 | | _JSON_BUILD_PAIR_IN_ADDR_NON_NULL, |
189 | | _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING, |
190 | | _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING_NON_NULL, |
191 | | _JSON_BUILD_PAIR_ETHER_ADDR_NON_NULL, |
192 | | _JSON_BUILD_PAIR_HW_ADDR_NON_NULL, |
193 | | _JSON_BUILD_PAIR_DUAL_TIMESTAMP_NON_NULL, |
194 | | _JSON_BUILD_PAIR_RATELIMIT_ENABLED, |
195 | | _JSON_BUILD_PAIR_CALLBACK_NON_NULL, |
196 | | _JSON_BUILD_PAIR_BASE64_NON_EMPTY, |
197 | | _JSON_BUILD_PAIR_BASE32HEX_NON_EMPTY, |
198 | | _JSON_BUILD_PAIR_HEX_NON_EMPTY, |
199 | | _JSON_BUILD_PAIR_OCTESCAPE_NON_EMPTY, |
200 | | _JSON_BUILD_PAIR_TRISTATE_NON_NULL, |
201 | | _JSON_BUILD_PAIR_PIDREF_NON_NULL, |
202 | | _JSON_BUILD_PAIR_DEVNUM, |
203 | | |
204 | | _SD_JSON_BUILD_REALLYMAX, |
205 | | }; |
206 | | |
207 | | #define JSON_BUILD_STRV_ENV_PAIR(l) _JSON_BUILD_STRV_ENV_PAIR, (char**) { l } |
208 | 0 | #define JSON_BUILD_IOVEC_BASE64(iov) _JSON_BUILD_IOVEC_BASE64, (const struct iovec*) { iov } |
209 | | #define JSON_BUILD_IOVEC_HEX(iov) _JSON_BUILD_IOVEC_HEX, (const struct iovec*) { iov } |
210 | 0 | #define JSON_BUILD_CONST_STRING(s) _SD_JSON_BUILD_VARIANT, JSON_VARIANT_STRING_CONST(s) |
211 | 0 | #define JSON_BUILD_IN4_ADDR(v) SD_JSON_BUILD_BYTE_ARRAY((const struct in_addr*) { v }, sizeof(struct in_addr)) |
212 | | #define JSON_BUILD_IN6_ADDR(v) SD_JSON_BUILD_BYTE_ARRAY((const struct in6_addr*) { v }, sizeof(struct in6_addr)) |
213 | 0 | #define JSON_BUILD_IN_ADDR(f, v) SD_JSON_BUILD_BYTE_ARRAY(((const union in_addr_union*) { v })->bytes, FAMILY_ADDRESS_SIZE_SAFE(f)) |
214 | | #define JSON_BUILD_ETHER_ADDR(v) SD_JSON_BUILD_BYTE_ARRAY(((const struct ether_addr*) { v })->ether_addr_octet, sizeof(struct ether_addr)) |
215 | | #define JSON_BUILD_HW_ADDR(v) _JSON_BUILD_HW_ADDR, (const struct hw_addr_data*) { v } |
216 | | #define JSON_BUILD_STRING_SET(s) _JSON_BUILD_STRING_SET, (Set *) { s } |
217 | | #define JSON_BUILD_STRING_ORDERED_SET(s) _JSON_BUILD_STRING_ORDERED_SET, (OrderedSet *) { s } |
218 | 0 | #define JSON_BUILD_STRING_UNDERSCORIFY(s) _JSON_BUILD_STRING_UNDERSCORIFY, (const char *) { s } |
219 | | #define JSON_BUILD_DUAL_TIMESTAMP(t) _JSON_BUILD_DUAL_TIMESTAMP, (dual_timestamp*) { t } |
220 | | #define JSON_BUILD_RATELIMIT(rl) _JSON_BUILD_RATELIMIT, (const RateLimit*) { rl } |
221 | | #define JSON_BUILD_TRISTATE(i) _JSON_BUILD_TRISTATE, (int) { i } |
222 | | #define JSON_BUILD_PIDREF(p) _JSON_BUILD_PIDREF, (const PidRef*) { p } |
223 | 0 | #define JSON_BUILD_DEVNUM(d) _JSON_BUILD_DEVNUM, (dev_t) { d } |
224 | | |
225 | | #define JSON_BUILD_PAIR_INTEGER_NON_ZERO(name, i) _JSON_BUILD_PAIR_INTEGER_NON_ZERO, (const char*) { name }, (int64_t) { i } |
226 | | #define JSON_BUILD_PAIR_INTEGER_NON_NEGATIVE(name, i) _JSON_BUILD_PAIR_INTEGER_NON_NEGATIVE, (const char*) { name }, (int64_t) { i } |
227 | | #define JSON_BUILD_PAIR_UNSIGNED_NON_ZERO(name, u) _JSON_BUILD_PAIR_UNSIGNED_NON_ZERO, (const char*) { name }, (uint64_t) { u } |
228 | | #define JSON_BUILD_PAIR_UNSIGNED_NOT_EQUAL(name, u, eq) _JSON_BUILD_PAIR_UNSIGNED_NOT_EQUAL, (const char*) { name }, (uint64_t) { u }, (uint64_t) { eq } |
229 | | #define JSON_BUILD_PAIR_FINITE_USEC(name, u) _JSON_BUILD_PAIR_FINITE_USEC, (const char*) { name }, (usec_t) { u } |
230 | | #define JSON_BUILD_PAIR_FINITE_USEC_NON_ZERO(name, u) _JSON_BUILD_PAIR_FINITE_USEC_NON_ZERO, (const char*) { name }, (usec_t) { u } |
231 | | #define JSON_BUILD_PAIR_STRING_NON_EMPTY(name, s) _JSON_BUILD_PAIR_STRING_NON_EMPTY, (const char*) { name }, (const char*) { s } |
232 | | #define JSON_BUILD_PAIR_STRING_NON_EMPTY_UNDERSCORIFY(name, s) _JSON_BUILD_PAIR_STRING_NON_EMPTY_UNDERSCORIFY, (const char*) { name }, (const char*) { s } |
233 | | #define JSON_BUILD_PAIR_STRV_NON_EMPTY(name, l) _JSON_BUILD_PAIR_STRV_NON_EMPTY, (const char*) { name }, (char**) { l } |
234 | | #define JSON_BUILD_PAIR_STRV_ENV_PAIR_NON_EMPTY(name, l) _JSON_BUILD_PAIR_STRV_ENV_PAIR_NON_EMPTY, (const char*) { name }, (char**) { l } |
235 | | #define JSON_BUILD_PAIR_VARIANT_NON_NULL(name, v) _JSON_BUILD_PAIR_VARIANT_NON_NULL, (const char*) { name }, (sd_json_variant*) { v } |
236 | | #define JSON_BUILD_PAIR_VARIANT_NON_EMPTY(name, v) _JSON_BUILD_PAIR_VARIANT_NON_EMPTY, (const char*) { name }, (sd_json_variant*) { v } |
237 | | #define JSON_BUILD_PAIR_BYTE_ARRAY_NON_EMPTY(name, v, n) _JSON_BUILD_PAIR_BYTE_ARRAY_NON_EMPTY, (const char*) { name }, (const void*) { v }, (size_t) { n } |
238 | | #define JSON_BUILD_PAIR_IN_ADDR_NON_NULL(name, f, v) _JSON_BUILD_PAIR_IN_ADDR_NON_NULL, (const char*) { name }, (int) { f }, (const union in_addr_union*) { v } |
239 | | #define JSON_BUILD_PAIR_IN4_ADDR_NON_NULL(name, v) _JSON_BUILD_PAIR_IN_ADDR_NON_NULL, (const char*) { name }, AF_INET, &(union in_addr_union) { .in = *(v) } |
240 | | #define JSON_BUILD_PAIR_IN6_ADDR_NON_NULL(name, v) _JSON_BUILD_PAIR_IN_ADDR_NON_NULL, (const char*) { name }, AF_INET6, &(union in_addr_union) { .in6 = *(v) } |
241 | | #define JSON_BUILD_PAIR_IN_ADDR_WITH_STRING(name, f, v) _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING, (const char*) { name }, (int) { f }, (const union in_addr_union*) { v } |
242 | | #define JSON_BUILD_PAIR_IN4_ADDR_WITH_STRING(name, v) _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING, (const char*) { name }, AF_INET, &(union in_addr_union) { .in = *(v) } |
243 | | #define JSON_BUILD_PAIR_IN6_ADDR_WITH_STRING(name, v) _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING, (const char*) { name }, AF_INET6, &(union in_addr_union) { .in6 = *(v) } |
244 | | #define JSON_BUILD_PAIR_IN_ADDR_WITH_STRING_NON_NULL(name, f, v) _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING_NON_NULL, (const char*) { name }, (int) { f }, (const union in_addr_union*) { v } |
245 | | #define JSON_BUILD_PAIR_IN4_ADDR_WITH_STRING_NON_NULL(name, v) _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING_NON_NULL, (const char*) { name }, AF_INET, &(union in_addr_union) { .in = *(v) } |
246 | | #define JSON_BUILD_PAIR_IN6_ADDR_WITH_STRING_NON_NULL(name, v) _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING_NON_NULL, (const char*) { name }, AF_INET6, &(union in_addr_union) { .in6 = *(v) } |
247 | | #define JSON_BUILD_PAIR_ETHER_ADDR_NON_NULL(name, v) _JSON_BUILD_PAIR_ETHER_ADDR_NON_NULL, (const char*) { name }, (const struct ether_addr*) { v } |
248 | | #define JSON_BUILD_PAIR_HW_ADDR_NON_NULL(name, v) _JSON_BUILD_PAIR_HW_ADDR_NON_NULL, (const char*) { name }, (const struct hw_addr_data*) { v } |
249 | | #define JSON_BUILD_PAIR_DUAL_TIMESTAMP_NON_NULL(name, t) _JSON_BUILD_PAIR_DUAL_TIMESTAMP_NON_NULL, (const char*) { name }, (dual_timestamp*) { t } |
250 | | #define JSON_BUILD_PAIR_RATELIMIT_ENABLED(name, rl) _JSON_BUILD_PAIR_RATELIMIT_ENABLED, (const char*) { name }, (const RateLimit*) { rl } |
251 | | #define JSON_BUILD_PAIR_CALLBACK_NON_NULL(name, c, u) _JSON_BUILD_PAIR_CALLBACK_NON_NULL, (const char*) { name }, (sd_json_build_callback_t) { c }, (void*) { u } |
252 | | #define JSON_BUILD_PAIR_BASE64_NON_EMPTY(name, v, n) _JSON_BUILD_PAIR_BASE64_NON_EMPTY, (const char*) { name }, (const void*) { v }, (size_t) { n } |
253 | | #define JSON_BUILD_PAIR_BASE32HEX_NON_EMPTY(name, v, n) _JSON_BUILD_PAIR_BASE32HEX_NON_EMPTY, (const char*) { name }, (const void*) { v }, (size_t) { n } |
254 | | #define JSON_BUILD_PAIR_HEX_NON_EMPTY(name, v, n) _JSON_BUILD_PAIR_HEX_NON_EMPTY, (const char*) { name }, (const void*) { v }, (size_t) { n } |
255 | | #define JSON_BUILD_PAIR_OCTESCAPE_NON_EMPTY(name, v, n) _JSON_BUILD_PAIR_HEX_NON_EMPTY, (const char*) { name }, (const void*) { v }, (size_t) { n } |
256 | | #define JSON_BUILD_PAIR_TRISTATE_NON_NULL(name, i) _JSON_BUILD_PAIR_TRISTATE_NON_NULL, (const char*) { name }, (int) { i } |
257 | | #define JSON_BUILD_PAIR_PIDREF_NON_NULL(name, p) _JSON_BUILD_PAIR_PIDREF_NON_NULL, (const char*) { name }, (const PidRef*) { p } |
258 | | |
259 | | #define JSON_BUILD_PAIR_IOVEC_BASE64(name, iov) SD_JSON_BUILD_PAIR(name, JSON_BUILD_IOVEC_BASE64(iov)) |
260 | | #define JSON_BUILD_PAIR_IOVEC_HEX(name, iov) SD_JSON_BUILD_PAIR(name, JSON_BUILD_IOVEC_HEX(iov)) |
261 | | #define JSON_BUILD_PAIR_IN4_ADDR(name, v) SD_JSON_BUILD_PAIR(name, JSON_BUILD_IN4_ADDR(v)) |
262 | | #define JSON_BUILD_PAIR_IN6_ADDR(name, v) SD_JSON_BUILD_PAIR(name, JSON_BUILD_IN6_ADDR(v)) |
263 | | #define JSON_BUILD_PAIR_IN_ADDR(name, f, v) SD_JSON_BUILD_PAIR(name, JSON_BUILD_IN_ADDR(f, v)) |
264 | | #define JSON_BUILD_PAIR_ETHER_ADDR(name, v) SD_JSON_BUILD_PAIR(name, JSON_BUILD_ETHER_ADDR(v)) |
265 | | #define JSON_BUILD_PAIR_HW_ADDR(name, v) SD_JSON_BUILD_PAIR(name, JSON_BUILD_HW_ADDR(v)) |
266 | | #define JSON_BUILD_PAIR_STRING_SET(name, s) SD_JSON_BUILD_PAIR(name, JSON_BUILD_STRING_SET(s)) |
267 | | #define JSON_BUILD_PAIR_STRING_ORDERED_SET(name, s) SD_JSON_BUILD_PAIR(name, JSON_BUILD_STRING_ORDERED_SET(s)) |
268 | | #define JSON_BUILD_PAIR_DUAL_TIMESTAMP(name, t) SD_JSON_BUILD_PAIR(name, JSON_BUILD_DUAL_TIMESTAMP(t)) |
269 | | #define JSON_BUILD_PAIR_RATELIMIT(name, rl) SD_JSON_BUILD_PAIR(name, JSON_BUILD_RATELIMIT(rl)) |
270 | | #define JSON_BUILD_PAIR_TRISTATE(name, i) SD_JSON_BUILD_PAIR(name, JSON_BUILD_TRISTATE(i)) |
271 | | #define JSON_BUILD_PAIR_PIDREF(name, p) SD_JSON_BUILD_PAIR(name, JSON_BUILD_PIDREF(p)) |
272 | | #define JSON_BUILD_PAIR_DEVNUM(name, d) SD_JSON_BUILD_PAIR(name, JSON_BUILD_DEVNUM(d)) |
273 | | #define JSON_BUILD_PAIR_ENUM(name, s) SD_JSON_BUILD_PAIR(name, JSON_BUILD_STRING_UNDERSCORIFY(s)) |
274 | | #define JSON_BUILD_PAIR_ENUM_NON_EMPTY(name, s) JSON_BUILD_PAIR_STRING_NON_EMPTY_UNDERSCORIFY(name, s) |
275 | | #define JSON_BUILD_PAIR_YES_NO(name, b) SD_JSON_BUILD_PAIR(name, SD_JSON_BUILD_STRING(yes_no(b))) |
276 | | |
277 | | #define JSON_BUILD_PAIR_CONDITION_UNSIGNED(condition, name, value) \ |
278 | | SD_JSON_BUILD_PAIR_CONDITION(condition, name, SD_JSON_BUILD_UNSIGNED(value)) |
279 | | #define JSON_BUILD_PAIR_CONDITION_BOOLEAN(condition, name, value) \ |
280 | | SD_JSON_BUILD_PAIR_CONDITION(condition, name, SD_JSON_BUILD_BOOLEAN(value)) |
281 | | #define JSON_BUILD_PAIR_CONDITION_STRING(condition, name, value) \ |
282 | | SD_JSON_BUILD_PAIR_CONDITION(condition, name, SD_JSON_BUILD_STRING(value)) |
283 | | #define JSON_BUILD_PAIR_CONDITION_STRV(condition, name, value) \ |
284 | | SD_JSON_BUILD_PAIR_CONDITION(condition, name, SD_JSON_BUILD_STRV(value)) |
285 | | |
286 | | int json_variant_new_pidref(sd_json_variant **ret, PidRef *pidref); |
287 | | int json_variant_new_devnum(sd_json_variant **ret, dev_t devnum); |
288 | | int json_variant_new_fd_info(sd_json_variant **ret, int fd); |
289 | | |
290 | | char *json_underscorify(char *p); |
291 | | char *json_dashify(char *p); |
292 | | |
293 | | int json_variant_compare(sd_json_variant *a, sd_json_variant *b); |