Merge pull request #12290 from poettering/json-foreach-love

some small JSON foreach macro love
This commit is contained in:
Yu Watanabe 2019-04-13 18:19:38 +09:00 committed by GitHub
commit eeda619a1e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 16 deletions

View file

@ -1621,26 +1621,26 @@ static bool sysctl_key_valid(const char *s) {
static int oci_sysctl(const char *name, JsonVariant *v, JsonDispatchFlags flags, void *userdata) { static int oci_sysctl(const char *name, JsonVariant *v, JsonDispatchFlags flags, void *userdata) {
Settings *s = userdata; Settings *s = userdata;
JsonVariant *k, *w; JsonVariant *w;
const char *k;
int r; int r;
assert(s); assert(s);
JSON_VARIANT_OBJECT_FOREACH(k, w, v) { JSON_VARIANT_OBJECT_FOREACH(k, w, v) {
const char *n, *m; const char *m;
if (!json_variant_is_string(w)) if (!json_variant_is_string(w))
return json_log(v, flags, SYNTHETIC_ERRNO(EINVAL), return json_log(v, flags, SYNTHETIC_ERRNO(EINVAL),
"sysctl parameter is not a string, refusing."); "sysctl parameter is not a string, refusing.");
assert_se(n = json_variant_string(k));
assert_se(m = json_variant_string(w)); assert_se(m = json_variant_string(w));
if (sysctl_key_valid(n)) if (sysctl_key_valid(k))
return json_log(v, flags, SYNTHETIC_ERRNO(EINVAL), return json_log(v, flags, SYNTHETIC_ERRNO(EINVAL),
"sysctl key invalid, refusing: %s", n); "sysctl key invalid, refusing: %s", k);
r = strv_extend_strv(&s->sysctl, STRV_MAKE(n, m), false); r = strv_extend_strv(&s->sysctl, STRV_MAKE(k, m), false);
if (r < 0) if (r < 0)
return log_oom(); return log_oom();
} }
@ -2171,22 +2171,20 @@ static int oci_hooks(const char *name, JsonVariant *v, JsonDispatchFlags flags,
} }
static int oci_annotations(const char *name, JsonVariant *v, JsonDispatchFlags flags, void *userdata) { static int oci_annotations(const char *name, JsonVariant *v, JsonDispatchFlags flags, void *userdata) {
JsonVariant *k, *w; JsonVariant *w;
const char *k;
JSON_VARIANT_OBJECT_FOREACH(k, w, v) { JSON_VARIANT_OBJECT_FOREACH(k, w, v) {
const char *n;
assert_se(n = json_variant_string(k)); if (isempty(k))
return json_log(v, flags, SYNTHETIC_ERRNO(EINVAL),
if (isempty(n))
return json_log(k, flags, SYNTHETIC_ERRNO(EINVAL),
"Annotation with empty key, refusing."); "Annotation with empty key, refusing.");
if (!json_variant_is_string(w)) if (!json_variant_is_string(w))
return json_log(w, flags, SYNTHETIC_ERRNO(EINVAL), return json_log(w, flags, SYNTHETIC_ERRNO(EINVAL),
"Annotation has non-string value, refusing."); "Annotation has non-string value, refusing.");
json_log(k, flags|JSON_DEBUG, 0, "Ignoring annotation '%s' with value '%s'.", n, json_variant_string(w)); json_log(w, flags|JSON_DEBUG, 0, "Ignoring annotation '%s' with value '%s'.", k, json_variant_string(w));
} }
return 0; return 0;

View file

@ -135,15 +135,17 @@ struct json_variant_foreach_state {
#define JSON_VARIANT_ARRAY_FOREACH(i, v) \ #define JSON_VARIANT_ARRAY_FOREACH(i, v) \
for (struct json_variant_foreach_state _state = { (v), 0 }; \ for (struct json_variant_foreach_state _state = { (v), 0 }; \
_state.idx < json_variant_elements(_state.variant) && \ json_variant_is_array(_state.variant) && \
_state.idx < json_variant_elements(_state.variant) && \
({ i = json_variant_by_index(_state.variant, _state.idx); \ ({ i = json_variant_by_index(_state.variant, _state.idx); \
true; }); \ true; }); \
_state.idx++) _state.idx++)
#define JSON_VARIANT_OBJECT_FOREACH(k, e, v) \ #define JSON_VARIANT_OBJECT_FOREACH(k, e, v) \
for (struct json_variant_foreach_state _state = { (v), 0 }; \ for (struct json_variant_foreach_state _state = { (v), 0 }; \
_state.idx < json_variant_elements(_state.variant) && \ json_variant_is_object(_state.variant) && \
({ k = json_variant_by_index(_state.variant, _state.idx); \ _state.idx < json_variant_elements(_state.variant) && \
({ k = json_variant_string(json_variant_by_index(_state.variant, _state.idx)); \
e = json_variant_by_index(_state.variant, _state.idx + 1); \ e = json_variant_by_index(_state.variant, _state.idx + 1); \
true; }); \ true; }); \
_state.idx += 2) _state.idx += 2)