r = sd_json_variant_append_arraybo(
&v,
SD_JSON_BUILD_PAIR_INTEGER("family", i->family),
- JSON_BUILD_PAIR_IN_ADDR("address", &i->address, i->family),
+ JSON_BUILD_PAIR_IN_ADDR("address", i->family, &i->address),
SD_JSON_BUILD_PAIR_UNSIGNED("prefixLength", i->prefixlen));
if (r < 0)
return r;
_JSON_BUILD_PAIR_VARIANT_NON_EMPTY,
/* _SD_JSON_BUILD_PAIR_VARIANT_ARRAY_NON_EMPTY, */
_JSON_BUILD_PAIR_BYTE_ARRAY_NON_EMPTY,
- _JSON_BUILD_PAIR_IN4_ADDR_NON_NULL,
- _JSON_BUILD_PAIR_IN6_ADDR_NON_NULL,
_JSON_BUILD_PAIR_IN_ADDR_NON_NULL,
+ _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING,
+ _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING_NON_NULL,
_JSON_BUILD_PAIR_ETHER_ADDR_NON_NULL,
_JSON_BUILD_PAIR_HW_ADDR_NON_NULL,
_JSON_BUILD_PAIR_DUAL_TIMESTAMP_NON_NULL,
_JSON_BUILD_PAIR_TRISTATE_NON_NULL,
_JSON_BUILD_PAIR_PIDREF_NON_NULL,
_JSON_BUILD_PAIR_DEVNUM,
- _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING,
- _JSON_BUILD_PAIR_IN6_ADDR_WITH_STRING,
- _JSON_BUILD_PAIR_IN4_ADDR_WITH_STRING,
- _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING_NON_NULL,
- _JSON_BUILD_PAIR_IN6_ADDR_WITH_STRING_NON_NULL,
- _JSON_BUILD_PAIR_IN4_ADDR_WITH_STRING_NON_NULL,
_SD_JSON_BUILD_REALLYMAX,
};
#define JSON_BUILD_CONST_STRING(s) _SD_JSON_BUILD_VARIANT, JSON_VARIANT_STRING_CONST(s)
#define JSON_BUILD_IN4_ADDR(v) SD_JSON_BUILD_BYTE_ARRAY((const struct in_addr*) { v }, sizeof(struct in_addr))
#define JSON_BUILD_IN6_ADDR(v) SD_JSON_BUILD_BYTE_ARRAY((const struct in6_addr*) { v }, sizeof(struct in6_addr))
-#define JSON_BUILD_IN_ADDR(v, f) SD_JSON_BUILD_BYTE_ARRAY(((const union in_addr_union*) { v })->bytes, FAMILY_ADDRESS_SIZE_SAFE(f))
+#define JSON_BUILD_IN_ADDR(f, v) SD_JSON_BUILD_BYTE_ARRAY(((const union in_addr_union*) { v })->bytes, FAMILY_ADDRESS_SIZE_SAFE(f))
#define JSON_BUILD_ETHER_ADDR(v) SD_JSON_BUILD_BYTE_ARRAY(((const struct ether_addr*) { v })->ether_addr_octet, sizeof(struct ether_addr))
#define JSON_BUILD_HW_ADDR(v) _JSON_BUILD_HW_ADDR, (const struct hw_addr_data*) { v }
#define JSON_BUILD_STRING_SET(s) _JSON_BUILD_STRING_SET, (Set *) { s }
#define JSON_BUILD_PAIR_VARIANT_NON_NULL(name, v) _JSON_BUILD_PAIR_VARIANT_NON_NULL, (const char*) { name }, (sd_json_variant*) { v }
#define JSON_BUILD_PAIR_VARIANT_NON_EMPTY(name, v) _JSON_BUILD_PAIR_VARIANT_NON_EMPTY, (const char*) { name }, (sd_json_variant*) { v }
#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 }
-#define JSON_BUILD_PAIR_IN4_ADDR_NON_NULL(name, v) _JSON_BUILD_PAIR_IN4_ADDR_NON_NULL, (const char*) { name }, (const struct in_addr*) { v }
-#define JSON_BUILD_PAIR_IN6_ADDR_NON_NULL(name, v) _JSON_BUILD_PAIR_IN6_ADDR_NON_NULL, (const char*) { name }, (const struct in6_addr*) { v }
-#define JSON_BUILD_PAIR_IN_ADDR_NON_NULL(name, v, f) _JSON_BUILD_PAIR_IN_ADDR_NON_NULL, (const char*) { name }, (const union in_addr_union*) { v }, (int) { f }
+#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 }
+#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) }
+#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) }
+#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 }
+#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) }
+#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) }
+#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 }
+#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) }
+#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) }
#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 }
#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 }
#define JSON_BUILD_PAIR_DUAL_TIMESTAMP_NON_NULL(name, t) _JSON_BUILD_PAIR_DUAL_TIMESTAMP_NON_NULL, (const char*) { name }, (dual_timestamp*) { t }
#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 }
#define JSON_BUILD_PAIR_TRISTATE_NON_NULL(name, i) _JSON_BUILD_PAIR_TRISTATE_NON_NULL, (const char*) { name }, (int) { i }
#define JSON_BUILD_PAIR_PIDREF_NON_NULL(name, p) _JSON_BUILD_PAIR_PIDREF_NON_NULL, (const char*) { name }, (const PidRef*) { p }
-#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 }
-#define JSON_BUILD_PAIR_IN6_ADDR_WITH_STRING(name, v) _JSON_BUILD_PAIR_IN6_ADDR_WITH_STRING, (const char*) { name }, (const struct in6_addr*) { v }
-#define JSON_BUILD_PAIR_IN4_ADDR_WITH_STRING(name, v) _JSON_BUILD_PAIR_IN4_ADDR_WITH_STRING, (const char*) { name }, (const struct in_addr*) { v }
-#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 }
-#define JSON_BUILD_PAIR_IN6_ADDR_WITH_STRING_NON_NULL(name, v) _JSON_BUILD_PAIR_IN6_ADDR_WITH_STRING_NON_NULL, (const char*) { name }, (const struct in6_addr*) { v }
-#define JSON_BUILD_PAIR_IN4_ADDR_WITH_STRING_NON_NULL(name, v) _JSON_BUILD_PAIR_IN4_ADDR_WITH_STRING_NON_NULL, (const char*) { name }, (const struct in_addr*) { v }
#define JSON_BUILD_PAIR_IOVEC_BASE64(name, iov) SD_JSON_BUILD_PAIR(name, JSON_BUILD_IOVEC_BASE64(iov))
#define JSON_BUILD_PAIR_IOVEC_HEX(name, iov) SD_JSON_BUILD_PAIR(name, JSON_BUILD_IOVEC_HEX(iov))
#define JSON_BUILD_PAIR_IN4_ADDR(name, v) SD_JSON_BUILD_PAIR(name, JSON_BUILD_IN4_ADDR(v))
#define JSON_BUILD_PAIR_IN6_ADDR(name, v) SD_JSON_BUILD_PAIR(name, JSON_BUILD_IN6_ADDR(v))
-#define JSON_BUILD_PAIR_IN_ADDR(name, v, f) SD_JSON_BUILD_PAIR(name, JSON_BUILD_IN_ADDR(v, f))
+#define JSON_BUILD_PAIR_IN_ADDR(name, f, v) SD_JSON_BUILD_PAIR(name, JSON_BUILD_IN_ADDR(f, v))
#define JSON_BUILD_PAIR_ETHER_ADDR(name, v) SD_JSON_BUILD_PAIR(name, JSON_BUILD_ETHER_ADDR(v))
#define JSON_BUILD_PAIR_HW_ADDR(name, v) SD_JSON_BUILD_PAIR(name, JSON_BUILD_HW_ADDR(v))
#define JSON_BUILD_PAIR_STRING_SET(name, s) SD_JSON_BUILD_PAIR(name, JSON_BUILD_STRING_SET(s))
break;
}
- case _JSON_BUILD_PAIR_IN4_ADDR_NON_NULL: {
- const struct in_addr *a;
+ case _JSON_BUILD_PAIR_IN_ADDR_NON_NULL:
+ case _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING_NON_NULL:
+ case _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING: {
+ const union in_addr_union *a;
const char *n;
+ int f;
if (current->expect != EXPECT_OBJECT_KEY) {
r = -EINVAL;
}
n = va_arg(ap, const char *);
- a = va_arg(ap, const struct in_addr *);
-
- if (a && in4_addr_is_set(a) && current->n_suppress == 0) {
- r = sd_json_variant_new_string(&add, n);
- if (r < 0)
- goto finish;
-
- r = sd_json_variant_new_array_bytes(&add_more, a, sizeof(struct in_addr));
- if (r < 0)
- goto finish;
- }
-
- n_subtract = 2; /* we generated two items */
-
- current->expect = EXPECT_OBJECT_KEY;
- break;
- }
-
- case _JSON_BUILD_PAIR_IN6_ADDR_NON_NULL: {
- const struct in6_addr *a;
- const char *n;
+ f = va_arg(ap, int);
+ a = va_arg(ap, const union in_addr_union *);
- if (current->expect != EXPECT_OBJECT_KEY) {
- r = -EINVAL;
- goto finish;
- }
+ if (current->n_suppress == 0 &&
+ ((a && in_addr_is_set(f, a)) ||
+ command == _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING)) {
- n = va_arg(ap, const char *);
- a = va_arg(ap, const struct in6_addr *);
+ if (!a)
+ a = &IN_ADDR_NULL;
- if (a && in6_addr_is_set(a) && current->n_suppress == 0) {
r = sd_json_variant_new_string(&add, n);
if (r < 0)
goto finish;
- r = sd_json_variant_new_array_bytes(&add_more, a, sizeof(struct in6_addr));
+ r = sd_json_variant_new_array_bytes(&add_more, a->bytes, FAMILY_ADDRESS_SIZE_SAFE(f));
if (r < 0)
goto finish;
- }
- n_subtract = 2; /* we generated two items */
-
- current->expect = EXPECT_OBJECT_KEY;
- break;
- }
+ if (IN_SET(command, _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING, _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING_NON_NULL)) {
+ _cleanup_free_ char *string_key_name = NULL;
+ _cleanup_(sd_json_variant_unrefp) sd_json_variant *string_key = NULL, *string_value = NULL;
- case _JSON_BUILD_PAIR_IN_ADDR_NON_NULL: {
- const union in_addr_union *a;
- const char *n;
- int f;
+ string_key_name = strjoin(n, "String");
+ if (!string_key_name) {
+ r = -ENOMEM;
+ goto finish;
+ }
- if (current->expect != EXPECT_OBJECT_KEY) {
- r = -EINVAL;
- goto finish;
- }
+ r = sd_json_variant_new_string(&string_key, string_key_name);
+ if (r < 0)
+ goto finish;
- n = va_arg(ap, const char *);
- a = va_arg(ap, const union in_addr_union *);
- f = va_arg(ap, int);
+ r = sd_json_variant_new_string(&string_value, IN_ADDR_TO_STRING(f, a));
+ if (r < 0)
+ goto finish;
- if (a && in_addr_is_set(f, a) && current->n_suppress == 0) {
- r = sd_json_variant_new_string(&add, n);
- if (r < 0)
- goto finish;
+ if (!GREEDY_REALLOC(current->elements, current->n_elements + 2)) {
+ r = -ENOMEM;
+ goto finish;
+ }
- r = sd_json_variant_new_array_bytes(&add_more, a->bytes, FAMILY_ADDRESS_SIZE_SAFE(f));
- if (r < 0)
- goto finish;
+ current->elements[current->n_elements++] = TAKE_PTR(string_key);
+ current->elements[current->n_elements++] = TAKE_PTR(string_value);
+ }
}
- n_subtract = 2; /* we generated two items */
+ n_subtract = command == _JSON_BUILD_PAIR_IN_ADDR_NON_NULL ? 2 : 4;
current->expect = EXPECT_OBJECT_KEY;
break;
break;
}
- case _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING_NON_NULL:
- case _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING: {
- const union in_addr_union *a;
- const char *n;
- int f;
-
- if (current->expect != EXPECT_OBJECT_KEY) {
- r = -EINVAL;
- goto finish;
- }
-
- n = va_arg(ap, const char *);
- f = va_arg(ap, int);
- a = va_arg(ap, const union in_addr_union *);
-
- if (current->n_suppress == 0) {
- bool have_address = a && in_addr_is_set(f, a);
-
- if (have_address || command != _JSON_BUILD_PAIR_IN_ADDR_WITH_STRING_NON_NULL) {
- _cleanup_free_ char *addr_str = NULL, *string_key_name = NULL;
- _cleanup_(sd_json_variant_unrefp) sd_json_variant *string_key = NULL, *string_value = NULL;
-
- /* For non-NON_NULL variant, always convert address to string (even if all zeros).
- * For NON_NULL variant, we only get here when have_address is true. */
- if (a) {
- r = in_addr_to_string(f, a, &addr_str);
- if (r < 0)
- goto finish;
- }
-
- string_key_name = strjoin(n, "String");
- if (!string_key_name) {
- r = -ENOMEM;
- goto finish;
- }
-
- r = sd_json_variant_new_string(&add, n);
- if (r < 0)
- goto finish;
-
- r = sd_json_variant_new_array_bytes(&add_more, a->bytes, FAMILY_ADDRESS_SIZE_SAFE(f));
- if (r < 0)
- goto finish;
-
- r = sd_json_variant_new_string(&string_key, string_key_name);
- if (r < 0)
- goto finish;
-
- r = sd_json_variant_new_string(&string_value, addr_str);
- if (r < 0)
- goto finish;
-
- if (!GREEDY_REALLOC(current->elements, current->n_elements + 2)) {
- r = -ENOMEM;
- goto finish;
- }
-
- current->elements[current->n_elements++] = TAKE_PTR(string_key);
- current->elements[current->n_elements++] = TAKE_PTR(string_value);
- }
- }
-
- n_subtract = 4; /* we generated two pairs (binary and string) */
-
- current->expect = EXPECT_OBJECT_KEY;
- break;
- }
-
- case _JSON_BUILD_PAIR_IN6_ADDR_WITH_STRING_NON_NULL:
- case _JSON_BUILD_PAIR_IN6_ADDR_WITH_STRING: {
- const struct in6_addr *a;
- const char *n;
-
- if (current->expect != EXPECT_OBJECT_KEY) {
- r = -EINVAL;
- goto finish;
- }
-
- n = va_arg(ap, const char *);
- a = va_arg(ap, const struct in6_addr *);
-
- if (current->n_suppress == 0) {
- bool have_address = a && in6_addr_is_set(a);
-
- if (have_address || command != _JSON_BUILD_PAIR_IN6_ADDR_WITH_STRING_NON_NULL) {
- _cleanup_free_ char *addr_str = NULL, *string_key_name = NULL;
- _cleanup_(sd_json_variant_unrefp) sd_json_variant *string_key = NULL, *string_value = NULL;
-
- /* For non-NON_NULL variant, always convert address to string (even if all zeros).
- * For NON_NULL variant, we only get here when have_address is true. */
- if (a) {
- r = in6_addr_to_string(a, &addr_str);
- if (r < 0)
- goto finish;
- }
-
- string_key_name = strjoin(n, "String");
- if (!string_key_name) {
- r = -ENOMEM;
- goto finish;
- }
-
- r = sd_json_variant_new_string(&add, n);
- if (r < 0)
- goto finish;
-
- r = sd_json_variant_new_array_bytes(&add_more, a, sizeof(struct in6_addr));
- if (r < 0)
- goto finish;
-
- r = sd_json_variant_new_string(&string_key, string_key_name);
- if (r < 0)
- goto finish;
-
- r = sd_json_variant_new_string(&string_value, addr_str);
- if (r < 0)
- goto finish;
-
- if (!GREEDY_REALLOC(current->elements, current->n_elements + 2)) {
- r = -ENOMEM;
- goto finish;
- }
-
- current->elements[current->n_elements++] = TAKE_PTR(string_key);
- current->elements[current->n_elements++] = TAKE_PTR(string_value);
- }
- }
-
- n_subtract = 4; /* we generated two pairs (binary and string) */
-
- current->expect = EXPECT_OBJECT_KEY;
- break;
- }
-
- case _JSON_BUILD_PAIR_IN4_ADDR_WITH_STRING_NON_NULL:
- case _JSON_BUILD_PAIR_IN4_ADDR_WITH_STRING: {
- const struct in_addr *a;
- const char *n;
-
- if (current->expect != EXPECT_OBJECT_KEY) {
- r = -EINVAL;
- goto finish;
- }
-
- n = va_arg(ap, const char *);
- a = va_arg(ap, const struct in_addr *);
-
- if (current->n_suppress == 0) {
- bool have_address = a && !in4_addr_is_null(a);
-
- if (have_address || command != _JSON_BUILD_PAIR_IN4_ADDR_WITH_STRING_NON_NULL) {
- _cleanup_free_ char *addr_str = NULL, *string_key_name = NULL;
- _cleanup_(sd_json_variant_unrefp) sd_json_variant *string_key = NULL, *string_value = NULL;
-
- /* For non-NON_NULL variant, always convert address to string (even if all zeros).
- * For NON_NULL variant, we only get here when have_address is true. */
- if (a) {
- union in_addr_union addr_union = { .in = *a };
- r = in_addr_to_string(AF_INET, &addr_union, &addr_str);
- if (r < 0)
- goto finish;
- }
-
- string_key_name = strjoin(n, "String");
- if (!string_key_name) {
- r = -ENOMEM;
- goto finish;
- }
-
- r = sd_json_variant_new_string(&add, n);
- if (r < 0)
- goto finish;
-
- r = sd_json_variant_new_array_bytes(&add_more, a, sizeof(struct in_addr));
- if (r < 0)
- goto finish;
-
- r = sd_json_variant_new_string(&string_key, string_key_name);
- if (r < 0)
- goto finish;
-
- r = sd_json_variant_new_string(&string_value, addr_str);
- if (r < 0)
- goto finish;
-
- if (!GREEDY_REALLOC(current->elements, current->n_elements + 2)) {
- r = -ENOMEM;
- goto finish;
- }
-
- current->elements[current->n_elements++] = TAKE_PTR(string_key);
- current->elements[current->n_elements++] = TAKE_PTR(string_value);
- }
- }
-
- n_subtract = 4; /* we generated two pairs (binary and string) */
-
- current->expect = EXPECT_OBJECT_KEY;
- break;
- }
-
case _JSON_BUILD_PAIR_CALLBACK_NON_NULL: {
sd_json_build_callback_t cb;
void *userdata;
FOREACH_ARRAY(addr, res->addrs, res->n_addrs) {
r = sd_json_variant_append_arrayb(
&addrs_array,
- JSON_BUILD_IN_ADDR(addr, res->family));
+ JSON_BUILD_IN_ADDR(res->family, addr));
if (r < 0)
return r;
}
JSON_BUILD_PAIR_STRING_NON_EMPTY("DoHPath", res->dohpath),
JSON_BUILD_PAIR_STRV_NON_EMPTY("Transports", transports),
SD_JSON_BUILD_PAIR_STRING("ConfigSource", network_config_source_to_string(s)),
- JSON_BUILD_PAIR_IN_ADDR_NON_NULL("ConfigProvider", p, res->family)));
+ JSON_BUILD_PAIR_IN_ADDR_NON_NULL("ConfigProvider", res->family, p)));
}
static int dnr_append_json(Link *link, sd_json_variant **v) {
return sd_json_variant_append_arraybo(
array,
SD_JSON_BUILD_PAIR_INTEGER("Family", family),
- JSON_BUILD_PAIR_IN_ADDR("Address", a, family),
+ JSON_BUILD_PAIR_IN_ADDR("Address", family, a),
SD_JSON_BUILD_PAIR_STRING("AddressString", address_str),
SD_JSON_BUILD_PAIR_STRING("ConfigSource", network_config_source_to_string(s)),
JSON_BUILD_PAIR_IN_ADDR_WITH_STRING_NON_NULL("ConfigProvider", family, p));
return sd_json_buildo(
ret,
JSON_BUILD_PAIR_STRING_NON_EMPTY("addressString", dns_server_string(server)),
- JSON_BUILD_PAIR_IN_ADDR("address", &server->address, server->family),
+ JSON_BUILD_PAIR_IN_ADDR("address", server->family, &server->address),
SD_JSON_BUILD_PAIR_INTEGER("family", server->family),
SD_JSON_BUILD_PAIR_UNSIGNED("port", dns_server_port(server)),
SD_JSON_BUILD_PAIR_CONDITION(ifindex > 0, "ifindex", SD_JSON_BUILD_UNSIGNED(ifindex)),