]>
Commit | Line | Data |
---|---|---|
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 | 8 | static SD_VARLINK_DEFINE_METHOD(Ping); |
4ffe0aed | 9 | |
25ff515b | 10 | static SD_VARLINK_DEFINE_METHOD(Reload); |
4ffe0aed | 11 | |
25ff515b | 12 | static SD_VARLINK_DEFINE_METHOD( |
4ffe0aed | 13 | SetLogLevel, |
25ff515b | 14 | SD_VARLINK_DEFINE_INPUT(level, SD_VARLINK_INT, 0)); |
4ffe0aed | 15 | |
25ff515b | 16 | SD_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 | 23 | int 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 | 34 | int 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 | } |