]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-json: introduce json_dispatch_log_level()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 4 Jan 2025 04:57:30 +0000 (13:57 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 4 Jan 2025 11:57:06 +0000 (20:57 +0900)
Then, use it in io.systemd.service.SetLogLevel method.

src/libsystemd/sd-json/json-util.c
src/libsystemd/sd-json/json-util.h
src/shared/varlink-io.systemd.service.c

index 53af2bac83f7cbbbefc78074c48d7395effe1ef4..ea64205c14e29cdb0feb076c2cdf72c5fc7c5568 100644 (file)
@@ -341,6 +341,26 @@ int json_dispatch_ifindex(const char *name, sd_json_variant *variant, sd_json_di
         return 0;
 }
 
+int json_dispatch_log_level(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata) {
+        int *log_level = ASSERT_PTR(userdata), r, t;
+
+        if (sd_json_variant_is_null(variant)) {
+                *log_level = -1;
+                return 0;
+        }
+
+        r = sd_json_dispatch_int(name, variant, flags, &t);
+        if (r < 0)
+                return r;
+
+        /* If SD_JSON_RELAX is set allow a zero interface index, otherwise refuse. */
+        if (LOG_PRI(t) != t)
+                return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a valid log level.", strna(name));
+
+        *log_level = t;
+        return 0;
+}
+
 int json_variant_new_devnum(sd_json_variant **ret, dev_t devnum) {
         if (devnum == 0)
                 return sd_json_variant_new_null(ret);
index 58098241d38172c17c5f32d6e7ccf84587e6fd0c..9150ad1063301a584228821c0abeccf3016c3883 100644 (file)
@@ -117,6 +117,7 @@ int json_dispatch_const_path(const char *name, sd_json_variant *variant, sd_json
 int json_dispatch_pidref(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata);
 int json_dispatch_devnum(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata);
 int json_dispatch_ifindex(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata);
+int json_dispatch_log_level(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata);
 int json_dispatch_strv_environment(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata);
 
 static inline int json_variant_unbase64_iovec(sd_json_variant *v, struct iovec *ret) {
index 666778bd41c0d4b4040d26c8e0e1b4450107e7d2..62cfc9b637ea7126f22606d8cbd89d71aaa67291 100644 (file)
@@ -2,7 +2,7 @@
 
 #include <unistd.h>
 
-#include "macro.h"
+#include "json-util.h"
 #include "varlink-io.systemd.service.h"
 
 static SD_VARLINK_DEFINE_METHOD(Ping);
@@ -33,13 +33,12 @@ int varlink_method_ping(sd_varlink *link, sd_json_variant *parameters, sd_varlin
 
 int varlink_method_set_log_level(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
         static const sd_json_dispatch_field dispatch_table[] = {
-                { "level", _SD_JSON_VARIANT_TYPE_INVALID, sd_json_dispatch_int64, 0, SD_JSON_MANDATORY },
+                { "level", _SD_JSON_VARIANT_TYPE_INVALID, json_dispatch_log_level, 0, SD_JSON_MANDATORY },
                 {}
         };
 
-        int64_t level;
+        int r, level;
         uid_t uid;
-        int r;
 
         assert(link);
         assert(parameters);
@@ -53,9 +52,6 @@ int varlink_method_set_log_level(sd_varlink *link, sd_json_variant *parameters,
         if (r != 0)
                 return r;
 
-        if (LOG_PRI(level) != level)
-                return sd_varlink_error_invalid_parameter(link, parameters);
-
         r = sd_varlink_get_peer_uid(link, &uid);
         if (r < 0)
                 return r;
@@ -63,7 +59,7 @@ int varlink_method_set_log_level(sd_varlink *link, sd_json_variant *parameters,
         if (uid != getuid() && uid != 0)
                 return sd_varlink_error(link, SD_VARLINK_ERROR_PERMISSION_DENIED, parameters);
 
-        log_debug("Received io.systemd.service.SetLogLevel(%" PRIi64 ")", level);
+        log_debug("Received io.systemd.service.SetLogLevel(%i)", level);
 
         log_set_max_level(level);