Coverage Report

Created: 2026-08-08 06:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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);