size_t sz;
int r;
+ if (sd_json_variant_is_null(variant)) {
+ iovec_done(iov);
+ return 0;
+ }
+
if (!sd_json_variant_is_string(variant))
return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a string.", strna(name));
size_t sz;
int r;
+ if (sd_json_variant_is_null(variant)) {
+ iovec_done(iov);
+ return 0;
+ }
+
if (!sd_json_variant_is_string(variant))
return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a string.", strna(name));
assert(variant);
+ if (sd_json_variant_is_null(variant)) {
+ iovec_done(iov);
+ return 0;
+ }
+
if (!sd_json_variant_is_array(variant))
return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not an array.", strna(name));
_cleanup_(iovec_done) struct iovec iov = {};
int r;
+ if (sd_json_variant_is_null(variant)) {
+ *address = (struct in_addr) {};
+ return 0;
+ }
+
r = json_dispatch_byte_array_iovec(name, variant, flags, &iov);
if (r < 0)
return r;
assert_return(variant, -EINVAL);
assert_return(userdata, -EINVAL);
+ if (sd_json_variant_is_null(variant)) {
+ *b = false;
+ return 0;
+ }
+
if (!sd_json_variant_is_boolean(variant))
return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a boolean.", strna(name));
assert_return(variant, -EINVAL);
assert_return(userdata, -EINVAL);
+ if (sd_json_variant_is_null(variant)) {
+ *b = false;
+ return 0;
+ }
+
if (!sd_json_variant_is_boolean(variant))
return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a boolean.", strna(name));
assert_return(variant, -EINVAL);
assert_return(userdata, -EINVAL);
+ if (sd_json_variant_is_null(variant)) {
+ *i = -1;
+ return 0;
+ }
+
/* Also accept numbers formatted as string, to increase compatibility with less capable JSON
* implementations that cannot do 64bit integers. */
if (sd_json_variant_is_string(variant) && safe_atoi64(sd_json_variant_string(variant), i) >= 0)
assert_return(variant, -EINVAL);
assert_return(userdata, -EINVAL);
+ if (sd_json_variant_is_null(variant)) {
+ *u = UINT64_MAX;
+ return 0;
+ }
+
/* Since 64bit values (in particular unsigned ones) in JSON are problematic, let's also accept them
* formatted as strings. If this is not desired make sure to set the .type field in
* sd_json_dispatch_field to SD_JSON_UNSIGNED rather than _SD_JSON_VARIANT_TYPE_INVALID, so that
assert_return(variant, -EINVAL);
assert_return(userdata, -EINVAL);
+ if (sd_json_variant_is_null(variant)) {
+ *u = UINT32_MAX;
+ return 0;
+ }
+
r = sd_json_dispatch_uint64(name, variant, flags, &u64);
if (r < 0)
return r;
assert_return(variant, -EINVAL);
assert_return(userdata, -EINVAL);
+ if (sd_json_variant_is_null(variant)) {
+ *i = -1;
+ return 0;
+ }
+
r = sd_json_dispatch_int64(name, variant, flags, &i64);
if (r < 0)
return r;
assert_return(variant, -EINVAL);
assert_return(userdata, -EINVAL);
+ if (sd_json_variant_is_null(variant)) {
+ *i = -1;
+ return 0;
+ }
+
r = sd_json_dispatch_int64(name, variant, flags, &i64);
if (r < 0)
return r;
assert_return(variant, -EINVAL);
assert_return(userdata, -EINVAL);
+ if (sd_json_variant_is_null(variant)) {
+ *u = UINT16_MAX;
+ return 0;
+ }
+
r = sd_json_dispatch_uint64(name, variant, flags, &u64);
if (r < 0)
return r;
assert_return(variant, -EINVAL);
assert_return(userdata, -EINVAL);
+ if (sd_json_variant_is_null(variant)) {
+ *i = -1;
+ return 0;
+ }
+
r = sd_json_dispatch_int64(name, variant, flags, &i64);
if (r < 0)
return r;
assert_return(variant, -EINVAL);
assert_return(userdata, -EINVAL);
+ if (sd_json_variant_is_null(variant)) {
+ *u = UINT8_MAX;
+ return 0;
+ }
+
r = sd_json_dispatch_uint64(name, variant, flags, &u64);
if (r < 0)
return r;
assert_return(variant, -EINVAL);
assert_return(userdata, -EINVAL);
+ if (sd_json_variant_is_null(variant)) {
+ *d = NAN;
+ return 0;
+ }
+
/* Note, this will take care of parsing NaN, -Infinity, Infinity for us */
if (sd_json_variant_is_string(variant) && safe_atod(sd_json_variant_string(variant), d) >= 0)
return 0;
assert_return(variant, -EINVAL);
assert_return(userdata, -EINVAL);
+ if (sd_json_variant_is_null(variant)) {
+ *s = mfree(*s);
+ return 0;
+ }
+
r = sd_json_dispatch_const_string(name, variant, flags, &n);
if (r < 0)
return r;