]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/shared/varlink-io.systemd.service.c
mkosi: update arch commit reference
[thirdparty/systemd.git] / src / shared / varlink-io.systemd.service.c
CommitLineData
9c63d147 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
4ffe0aed 2
12630551
DT
3#include <unistd.h>
4
25ff515b 5#include "macro.h"
4ffe0aed
DT
6#include "varlink-io.systemd.service.h"
7
25ff515b 8static SD_VARLINK_DEFINE_METHOD(Ping);
4ffe0aed 9
25ff515b 10static SD_VARLINK_DEFINE_METHOD(Reload);
4ffe0aed 11
25ff515b 12static SD_VARLINK_DEFINE_METHOD(
4ffe0aed 13 SetLogLevel,
25ff515b 14 SD_VARLINK_DEFINE_INPUT(level, SD_VARLINK_INT, 0));
4ffe0aed 15
25ff515b 16SD_VARLINK_DEFINE_INTERFACE(
4ffe0aed
DT
17 io_systemd_service,
18 "io.systemd.service",
19 &vl_method_Ping,
20 &vl_method_Reload,
21 &vl_method_SetLogLevel);
ca46756c 22
25ff515b 23int varlink_method_ping(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
ca46756c
DT
24 assert(link);
25
309a747f 26 if (sd_json_variant_elements(parameters) > 0)
25ff515b 27 return sd_varlink_error_invalid_parameter(link, parameters);
ca46756c
DT
28
29 log_debug("Received io.systemd.service.Ping");
30
25ff515b 31 return sd_varlink_reply(link, NULL);
ca46756c 32}
12630551 33
25ff515b 34int varlink_method_set_log_level(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
309a747f
LP
35 static const sd_json_dispatch_field dispatch_table[] = {
36 { "level", _SD_JSON_VARIANT_TYPE_INVALID, sd_json_dispatch_int64, 0, SD_JSON_MANDATORY },
12630551
DT
37 {}
38 };
39
40 int64_t level;
41 uid_t uid;
42 int r;
43
44 assert(link);
45 assert(parameters);
46
47 /* NOTE: The method does have 1 parameter, but we must compare to 2 here, because
309a747f
LP
48 * sd_json_variant_elements() breaks abstraction and exposes internal structure of JsonObject. */
49 if (sd_json_variant_elements(parameters) != 2)
25ff515b 50 return sd_varlink_error_invalid_parameter(link, parameters);
12630551 51
25ff515b 52 r = sd_varlink_dispatch(link, parameters, dispatch_table, &level);
f1b622a0 53 if (r != 0)
12630551
DT
54 return r;
55
56 if (LOG_PRI(level) != level)
25ff515b 57 return sd_varlink_error_invalid_parameter(link, parameters);
12630551 58
25ff515b 59 r = sd_varlink_get_peer_uid(link, &uid);
12630551
DT
60 if (r < 0)
61 return r;
62
63 if (uid != getuid() && uid != 0)
25ff515b 64 return sd_varlink_error(link, SD_VARLINK_ERROR_PERMISSION_DENIED, parameters);
12630551
DT
65
66 log_debug("Received io.systemd.service.SetLogLevel(%" PRIi64 ")", level);
67
68 log_set_max_level(level);
69
25ff515b 70 return sd_varlink_reply(link, NULL);
12630551 71}