Merge pull request #24853 from poettering/resolved-monitor-fixes
resolved: various monitor fixes
This commit is contained in:
+79
-33
@@ -10,6 +10,7 @@
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "errno-util.h"
|
||||
#include "escape.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "float.h"
|
||||
@@ -437,6 +438,19 @@ int json_variant_new_base64(JsonVariant **ret, const void *p, size_t n) {
|
||||
return json_variant_new_stringn(ret, s, k);
|
||||
}
|
||||
|
||||
int json_variant_new_base32hex(JsonVariant **ret, const void *p, size_t n) {
|
||||
_cleanup_free_ char *s = NULL;
|
||||
|
||||
assert_return(ret, -EINVAL);
|
||||
assert_return(n == 0 || p, -EINVAL);
|
||||
|
||||
s = base32hexmem(p, n, false);
|
||||
if (!s)
|
||||
return -ENOMEM;
|
||||
|
||||
return json_variant_new_string(ret, s);
|
||||
}
|
||||
|
||||
int json_variant_new_hex(JsonVariant **ret, const void *p, size_t n) {
|
||||
_cleanup_free_ char *s = NULL;
|
||||
|
||||
@@ -450,6 +464,19 @@ int json_variant_new_hex(JsonVariant **ret, const void *p, size_t n) {
|
||||
return json_variant_new_stringn(ret, s, n*2);
|
||||
}
|
||||
|
||||
int json_variant_new_octescape(JsonVariant **ret, const void *p, size_t n) {
|
||||
_cleanup_free_ char *s = NULL;
|
||||
|
||||
assert_return(ret, -EINVAL);
|
||||
assert_return(n == 0 || p, -EINVAL);
|
||||
|
||||
s = octescape(p, n);
|
||||
if (!s)
|
||||
return -ENOMEM;
|
||||
|
||||
return json_variant_new_string(ret, s);
|
||||
}
|
||||
|
||||
int json_variant_new_id128(JsonVariant **ret, sd_id128_t id) {
|
||||
return json_variant_new_string(ret, SD_ID128_TO_STRING(id));
|
||||
}
|
||||
@@ -3543,7 +3570,10 @@ int json_buildv(JsonVariant **ret, va_list ap) {
|
||||
break;
|
||||
}
|
||||
|
||||
case _JSON_BUILD_BASE64: {
|
||||
case _JSON_BUILD_BASE64:
|
||||
case _JSON_BUILD_BASE32HEX:
|
||||
case _JSON_BUILD_HEX:
|
||||
case _JSON_BUILD_OCTESCAPE: {
|
||||
const void *p;
|
||||
size_t n;
|
||||
|
||||
@@ -3556,37 +3586,10 @@ int json_buildv(JsonVariant **ret, va_list ap) {
|
||||
n = va_arg(ap, size_t);
|
||||
|
||||
if (current->n_suppress == 0) {
|
||||
r = json_variant_new_base64(&add, p, n);
|
||||
if (r < 0)
|
||||
goto finish;
|
||||
}
|
||||
|
||||
n_subtract = 1;
|
||||
|
||||
if (current->expect == EXPECT_TOPLEVEL)
|
||||
current->expect = EXPECT_END;
|
||||
else if (current->expect == EXPECT_OBJECT_VALUE)
|
||||
current->expect = EXPECT_OBJECT_KEY;
|
||||
else
|
||||
assert(current->expect == EXPECT_ARRAY_ELEMENT);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case _JSON_BUILD_HEX: {
|
||||
const void *p;
|
||||
size_t n;
|
||||
|
||||
if (!IN_SET(current->expect, EXPECT_TOPLEVEL, EXPECT_OBJECT_VALUE, EXPECT_ARRAY_ELEMENT)) {
|
||||
r = -EINVAL;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
p = va_arg(ap, const void *);
|
||||
n = va_arg(ap, size_t);
|
||||
|
||||
if (current->n_suppress == 0) {
|
||||
r = json_variant_new_hex(&add, p, n);
|
||||
r = command == _JSON_BUILD_BASE64 ? json_variant_new_base64(&add, p, n) :
|
||||
command == _JSON_BUILD_BASE32HEX ? json_variant_new_base32hex(&add, p, n) :
|
||||
command == _JSON_BUILD_HEX ? json_variant_new_hex(&add, p, n) :
|
||||
json_variant_new_octescape(&add, p, n);
|
||||
if (r < 0)
|
||||
goto finish;
|
||||
}
|
||||
@@ -4208,6 +4211,19 @@ int json_log_internal(
|
||||
NULL);
|
||||
}
|
||||
|
||||
static void *dispatch_userdata(const JsonDispatch *p, void *userdata) {
|
||||
|
||||
/* When the the userdata pointer is passed in as NULL, then we'll just use the offset as a literal
|
||||
* address, and convert it to a pointer. Note that might as well just add the offset to the NULL
|
||||
* pointer, but UndefinedBehaviourSanitizer doesn't like pointer arithmetics based on NULL pointers,
|
||||
* hence we code this explicitly here. */
|
||||
|
||||
if (userdata)
|
||||
return (uint8_t*) userdata + p->offset;
|
||||
|
||||
return SIZE_TO_PTR(p->offset);
|
||||
}
|
||||
|
||||
int json_dispatch(JsonVariant *v, const JsonDispatch table[], JsonDispatchCallback bad, JsonDispatchFlags flags, void *userdata) {
|
||||
size_t m;
|
||||
int r, done = 0;
|
||||
@@ -4271,7 +4287,7 @@ int json_dispatch(JsonVariant *v, const JsonDispatch table[], JsonDispatchCallba
|
||||
found[p-table] = true;
|
||||
|
||||
if (p->callback) {
|
||||
r = p->callback(json_variant_string(key), value, merged_flags, (uint8_t*) userdata + p->offset);
|
||||
r = p->callback(json_variant_string(key), value, merged_flags, dispatch_userdata(p, userdata));
|
||||
if (r < 0) {
|
||||
if (merged_flags & JSON_PERMISSIVE)
|
||||
continue;
|
||||
@@ -4404,6 +4420,36 @@ int json_dispatch_int32(const char *name, JsonVariant *variant, JsonDispatchFlag
|
||||
return 0;
|
||||
}
|
||||
|
||||
int json_dispatch_int16(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
|
||||
int16_t *i = ASSERT_PTR(userdata);
|
||||
|
||||
assert(variant);
|
||||
|
||||
if (!json_variant_is_integer(variant))
|
||||
return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not an integer.", strna(name));
|
||||
|
||||
if (json_variant_integer(variant) < INT16_MIN || json_variant_integer(variant) > INT16_MAX)
|
||||
return json_log(variant, flags, SYNTHETIC_ERRNO(ERANGE), "JSON field '%s' out of bounds.", strna(name));
|
||||
|
||||
*i = (int16_t) json_variant_integer(variant);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int json_dispatch_uint16(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
|
||||
uint16_t *i = ASSERT_PTR(userdata);
|
||||
|
||||
assert(variant);
|
||||
|
||||
if (!json_variant_is_unsigned(variant))
|
||||
return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not an unsigned integer.", strna(name));
|
||||
|
||||
if (json_variant_unsigned(variant) > UINT16_MAX)
|
||||
return json_log(variant, flags, SYNTHETIC_ERRNO(ERANGE), "JSON field '%s' out of bounds.", strna(name));
|
||||
|
||||
*i = (uint16_t) json_variant_unsigned(variant);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int json_dispatch_string(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
|
||||
char **s = ASSERT_PTR(userdata);
|
||||
int r;
|
||||
|
||||
@@ -62,7 +62,9 @@ typedef enum JsonVariantType {
|
||||
|
||||
int json_variant_new_stringn(JsonVariant **ret, const char *s, size_t n);
|
||||
int json_variant_new_base64(JsonVariant **ret, const void *p, size_t n);
|
||||
int json_variant_new_base32hex(JsonVariant **ret, const void *p, size_t n);
|
||||
int json_variant_new_hex(JsonVariant **ret, const void *p, size_t n);
|
||||
int json_variant_new_octescape(JsonVariant **ret, const void *p, size_t n);
|
||||
int json_variant_new_integer(JsonVariant **ret, int64_t i);
|
||||
int json_variant_new_unsigned(JsonVariant **ret, uint64_t u);
|
||||
int json_variant_new_real(JsonVariant **ret, double d);
|
||||
@@ -245,7 +247,9 @@ enum {
|
||||
_JSON_BUILD_LITERAL,
|
||||
_JSON_BUILD_STRV,
|
||||
_JSON_BUILD_BASE64,
|
||||
_JSON_BUILD_BASE32HEX,
|
||||
_JSON_BUILD_HEX,
|
||||
_JSON_BUILD_OCTESCAPE,
|
||||
_JSON_BUILD_ID128,
|
||||
_JSON_BUILD_BYTE_ARRAY,
|
||||
_JSON_BUILD_HW_ADDR,
|
||||
@@ -280,7 +284,9 @@ enum {
|
||||
#define JSON_BUILD_LITERAL(l) _JSON_BUILD_LITERAL, (const char*) { l }
|
||||
#define JSON_BUILD_STRV(l) _JSON_BUILD_STRV, (char**) { l }
|
||||
#define JSON_BUILD_BASE64(p, n) _JSON_BUILD_BASE64, (const void*) { p }, (size_t) { n }
|
||||
#define JSON_BUILD_BASE32HEX(p, n) _JSON_BUILD_BASE32HEX, (const void*) { p }, (size_t) { n }
|
||||
#define JSON_BUILD_HEX(p, n) _JSON_BUILD_HEX, (const void*) { p }, (size_t) { n }
|
||||
#define JSON_BUILD_OCTESCAPE(p, n) _JSON_BUILD_OCTESCAPE, (const void*) { p }, (size_t) { n }
|
||||
#define JSON_BUILD_ID128(id) _JSON_BUILD_ID128, (const sd_id128_t*) { &(id) }
|
||||
#define JSON_BUILD_BYTE_ARRAY(v, n) _JSON_BUILD_BYTE_ARRAY, (const void*) { v }, (size_t) { n }
|
||||
#define JSON_BUILD_CONST_STRING(s) _JSON_BUILD_VARIANT, JSON_VARIANT_STRING_CONST(s)
|
||||
@@ -369,6 +375,8 @@ int json_dispatch_int64(const char *name, JsonVariant *variant, JsonDispatchFlag
|
||||
int json_dispatch_uint64(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_uint32(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_int32(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_uint16(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_int16(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_uid_gid(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_user_group_name(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_id128(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
|
||||
Reference in New Issue
Block a user