]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/timedate/timedated.c
Merge pull request #30284 from YHNdnzj/fstab-wantedby-defaultdeps
[thirdparty/systemd.git] / src / timedate / timedated.c
index 1ac3dc102d2335f4f9b464cf48c3b71b66504d00..53c2a6fb710cd4afb1f1c19f51e9087d58537166 100644 (file)
 #include "bus-log-control-api.h"
 #include "bus-map-properties.h"
 #include "bus-polkit.h"
+#include "bus-unit-util.h"
 #include "clock-util.h"
 #include "conf-files.h"
-#include "def.h"
+#include "constants.h"
 #include "fd-util.h"
 #include "fileio-label.h"
 #include "fileio.h"
@@ -115,8 +116,6 @@ static UnitStatusInfo *unit_status_info_free(UnitStatusInfo *p) {
 DEFINE_TRIVIAL_CLEANUP_FUNC(UnitStatusInfo*, unit_status_info_free);
 
 static void context_clear(Context *c) {
-        UnitStatusInfo *p;
-
         assert(c);
 
         free(c->zone);
@@ -125,15 +124,11 @@ static void context_clear(Context *c) {
 
         sd_bus_slot_unref(c->slot_job_removed);
 
-        while ((p = c->units)) {
-                LIST_REMOVE(units, c->units, p);
-                unit_status_info_free(p);
-        }
+        LIST_CLEAR(units, c->units, unit_status_info_free);
 }
 
 static int context_add_ntp_service(Context *c, const char *s, const char *source) {
         _cleanup_(unit_status_info_freep) UnitStatusInfo *unit = NULL;
-        UnitStatusInfo *u;
 
         assert(c);
         assert(s);
@@ -197,7 +192,6 @@ static int context_parse_ntp_services_from_environment(Context *c) {
 
 static int context_parse_ntp_services_from_disk(Context *c) {
         _cleanup_strv_free_ char **files = NULL;
-        char **f;
         int r;
 
         r = conf_files_list_strv(&files, ".list", NULL, CONF_FILES_FILTER_MASKED, UNIT_LIST_DIRS);
@@ -217,9 +211,8 @@ static int context_parse_ntp_services_from_disk(Context *c) {
 
                 for (;;) {
                         _cleanup_free_ char *line = NULL;
-                        const char *word;
 
-                        r = read_line(file, LINE_MAX, &line);
+                        r = read_stripped_line(file, LINE_MAX, &line);
                         if (r < 0) {
                                 log_error_errno(r, "Failed to read %s, ignoring: %m", *f);
                                 continue;
@@ -227,13 +220,12 @@ static int context_parse_ntp_services_from_disk(Context *c) {
                         if (r == 0)
                                 break;
 
-                        word = strstrip(line);
-                        if (isempty(word) || startswith(word, "#"))
+                        if (isempty(line) || startswith(line, "#"))
                                 continue;
 
-                        r = context_add_ntp_service(c, word, *f);
+                        r = context_add_ntp_service(c, line, *f);
                         if (r < 0)
-                                log_warning_errno(r, "Failed to add NTP service \"%s\", ignoring: %m", word);
+                                log_warning_errno(r, "Failed to add NTP service \"%s\", ignoring: %m", line);
                 }
         }
 
@@ -251,7 +243,6 @@ static int context_parse_ntp_services(Context *c) {
 }
 
 static int context_ntp_service_is_active(Context *c) {
-        UnitStatusInfo *info;
         int count = 0;
 
         assert(c);
@@ -265,7 +256,6 @@ static int context_ntp_service_is_active(Context *c) {
 }
 
 static int context_ntp_service_exists(Context *c) {
-        UnitStatusInfo *info;
         int count = 0;
 
         assert(c);
@@ -396,7 +386,7 @@ static int context_write_data_local_rtc(Context *c) {
                 }
         }
 
-        r = mac_selinux_init();
+        r = mac_init();
         if (r < 0)
                 return r;
 
@@ -410,7 +400,6 @@ static int context_update_ntp_status(Context *c, sd_bus *bus, sd_bus_message *m)
                 { "UnitFileState", "s", NULL, offsetof(UnitStatusInfo, unit_file_state) },
                 {}
         };
-        UnitStatusInfo *u;
         int r;
 
         assert(c);
@@ -452,13 +441,11 @@ static int context_update_ntp_status(Context *c, sd_bus *bus, sd_bus_message *m)
 }
 
 static int match_job_removed(sd_bus_message *m, void *userdata, sd_bus_error *error) {
-        Context *c = userdata;
-        UnitStatusInfo *u;
+        Context *c = ASSERT_PTR(userdata);
         const char *path;
         unsigned n = 0;
         int r;
 
-        assert(c);
         assert(m);
 
         r = sd_bus_message_read(m, "uoss", NULL, &path, NULL, NULL);
@@ -557,7 +544,7 @@ static int unit_enable_or_disable(UnitStatusInfo *u, sd_bus *bus, sd_bus_error *
         if (r < 0)
                 return r;
 
-        r = bus_call_method(bus, bus_systemd_mgr, "Reload", error, NULL, NULL);
+        r = bus_service_manager_reload(bus);
         if (r < 0)
                 return r;
 
@@ -614,10 +601,9 @@ static int property_get_can_ntp(
                 void *userdata,
                 sd_bus_error *error) {
 
-        Context *c = userdata;
+        Context *c = ASSERT_PTR(userdata);
         int r;
 
-        assert(c);
         assert(bus);
         assert(property);
         assert(reply);
@@ -643,10 +629,9 @@ static int property_get_ntp(
                 void *userdata,
                 sd_bus_error *error) {
 
-        Context *c = userdata;
+        Context *c = ASSERT_PTR(userdata);
         int r;
 
-        assert(c);
         assert(bus);
         assert(property);
         assert(reply);
@@ -664,12 +649,11 @@ static int property_get_ntp(
 }
 
 static int method_set_timezone(sd_bus_message *m, void *userdata, sd_bus_error *error) {
-        Context *c = userdata;
+        Context *c = ASSERT_PTR(userdata);
         int interactive, r;
         const char *z;
 
         assert(m);
-        assert(c);
 
         r = sd_bus_message_read(m, "sb", &z, &interactive);
         if (r < 0)
@@ -681,13 +665,12 @@ static int method_set_timezone(sd_bus_message *m, void *userdata, sd_bus_error *
         if (streq_ptr(z, c->zone))
                 return sd_bus_reply_method_return(m, NULL);
 
-        r = bus_verify_polkit_async(
+        r = bus_verify_polkit_async_full(
                         m,
-                        CAP_SYS_TIME,
                         "org.freedesktop.timedate1.set-timezone",
-                        NULL,
+                        /* details= */ NULL,
                         interactive,
-                        UID_INVALID,
+                        /* good_user= */ UID_INVALID,
                         &c->polkit_registry,
                         error);
         if (r < 0)
@@ -743,12 +726,11 @@ static int method_set_timezone(sd_bus_message *m, void *userdata, sd_bus_error *
 
 static int method_set_local_rtc(sd_bus_message *m, void *userdata, sd_bus_error *error) {
         int lrtc, fix_system, interactive;
-        Context *c = userdata;
+        Context *c = ASSERT_PTR(userdata);
         struct timespec ts;
         int r;
 
         assert(m);
-        assert(c);
 
         r = sd_bus_message_read(m, "bbb", &lrtc, &fix_system, &interactive);
         if (r < 0)
@@ -757,13 +739,12 @@ static int method_set_local_rtc(sd_bus_message *m, void *userdata, sd_bus_error
         if (lrtc == c->local_rtc && !fix_system)
                 return sd_bus_reply_method_return(m, NULL);
 
-        r = bus_verify_polkit_async(
+        r = bus_verify_polkit_async_full(
                         m,
-                        CAP_SYS_TIME,
                         "org.freedesktop.timedate1.set-local-rtc",
-                        NULL,
+                        /* details= */ NULL,
                         interactive,
-                        UID_INVALID,
+                        /* good_user= */ UID_INVALID,
                         &c->polkit_registry,
                         error);
         if (r < 0)
@@ -832,14 +813,13 @@ static int method_set_time(sd_bus_message *m, void *userdata, sd_bus_error *erro
         sd_bus *bus = sd_bus_message_get_bus(m);
         char buf[FORMAT_TIMESTAMP_MAX];
         int relative, interactive, r;
-        Context *c = userdata;
+        Context *c = ASSERT_PTR(userdata);
         int64_t utc;
         struct timespec ts;
         usec_t start;
         struct tm tm;
 
         assert(m);
-        assert(c);
 
         if (c->slot_job_removed)
                 return sd_bus_error_set(error, BUS_ERROR_AUTOMATIC_TIME_SYNC_ENABLED, "Previous request is not finished, refusing.");
@@ -878,13 +858,12 @@ static int method_set_time(sd_bus_message *m, void *userdata, sd_bus_error *erro
         } else
                 timespec_store(&ts, (usec_t) utc);
 
-        r = bus_verify_polkit_async(
+        r = bus_verify_polkit_async_full(
                         m,
-                        CAP_SYS_TIME,
                         "org.freedesktop.timedate1.set-time",
-                        NULL,
+                        /* details= */ NULL,
                         interactive,
-                        UID_INVALID,
+                        /* good_user= */ UID_INVALID,
                         &c->polkit_registry,
                         error);
         if (r < 0)
@@ -924,14 +903,12 @@ static int method_set_time(sd_bus_message *m, void *userdata, sd_bus_error *erro
 static int method_set_ntp(sd_bus_message *m, void *userdata, sd_bus_error *error) {
         _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *slot = NULL;
         sd_bus *bus = sd_bus_message_get_bus(m);
-        Context *c = userdata;
-        UnitStatusInfo *u;
+        Context *c = ASSERT_PTR(userdata);
         const UnitStatusInfo *selected = NULL;
         int enable, interactive, q, r;
 
         assert(m);
         assert(bus);
-        assert(c);
 
         r = sd_bus_message_read(m, "bb", &enable, &interactive);
         if (r < 0)
@@ -944,13 +921,12 @@ static int method_set_ntp(sd_bus_message *m, void *userdata, sd_bus_error *error
         if (context_ntp_service_exists(c) <= 0)
                 return sd_bus_error_set(error, BUS_ERROR_NO_NTP_SUPPORT, "NTP not supported");
 
-        r = bus_verify_polkit_async(
+        r = bus_verify_polkit_async_full(
                         m,
-                        CAP_SYS_TIME,
                         "org.freedesktop.timedate1.set-ntp",
-                        NULL,
+                        /* details= */ NULL,
                         interactive,
-                        UID_INVALID,
+                        /* good_user= */ UID_INVALID,
                         &c->polkit_registry,
                         error);
         if (r < 0)
@@ -1056,42 +1032,31 @@ static const sd_bus_vtable timedate_vtable[] = {
         SD_BUS_PROPERTY("TimeUSec", "t", property_get_time, 0, 0),
         SD_BUS_PROPERTY("RTCTimeUSec", "t", property_get_rtc_time, 0, 0),
 
-        SD_BUS_METHOD_WITH_NAMES("SetTime",
-                                 "xbb",
-                                 SD_BUS_PARAM(usec_utc)
-                                 SD_BUS_PARAM(relative)
-                                 SD_BUS_PARAM(interactive),
-                                 NULL,,
-                                 method_set_time,
-                                 SD_BUS_VTABLE_UNPRIVILEGED),
-        SD_BUS_METHOD_WITH_NAMES("SetTimezone",
-                                 "sb",
-                                 SD_BUS_PARAM(timezone)
-                                 SD_BUS_PARAM(interactive),
-                                 NULL,,
-                                 method_set_timezone,
-                                 SD_BUS_VTABLE_UNPRIVILEGED),
-        SD_BUS_METHOD_WITH_NAMES("SetLocalRTC",
-                                 "bbb",
-                                 SD_BUS_PARAM(local_rtc)
-                                 SD_BUS_PARAM(fix_system)
-                                 SD_BUS_PARAM(interactive),
-                                 NULL,,
-                                 method_set_local_rtc,
-                                 SD_BUS_VTABLE_UNPRIVILEGED),
-        SD_BUS_METHOD_WITH_NAMES("SetNTP",
-                                 "bb",
-                                 SD_BUS_PARAM(use_ntp)
-                                 SD_BUS_PARAM(interactive),
-                                 NULL,,
-                                 method_set_ntp,
-                                 SD_BUS_VTABLE_UNPRIVILEGED),
-        SD_BUS_METHOD_WITH_NAMES("ListTimezones",
-                                 NULL,,
-                                 "as",
-                                 SD_BUS_PARAM(timezones),
-                                 method_list_timezones,
-                                 SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD_WITH_ARGS("SetTime",
+                                SD_BUS_ARGS("x", usec_utc, "b", relative, "b", interactive),
+                                SD_BUS_NO_RESULT,
+                                method_set_time,
+                                SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD_WITH_ARGS("SetTimezone",
+                                SD_BUS_ARGS("s", timezone, "b", interactive),
+                                SD_BUS_NO_RESULT,
+                                method_set_timezone,
+                                SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD_WITH_ARGS("SetLocalRTC",
+                                SD_BUS_ARGS("b", local_rtc, "b", fix_system, "b", interactive),
+                                SD_BUS_NO_RESULT,
+                                method_set_local_rtc,
+                                SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD_WITH_ARGS("SetNTP",
+                                SD_BUS_ARGS("b", use_ntp, "b", interactive),
+                                SD_BUS_NO_RESULT,
+                                method_set_ntp,
+                                SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD_WITH_ARGS("ListTimezones",
+                                SD_BUS_NO_ARGS,
+                                SD_BUS_RESULT("as", timezones),
+                                method_list_timezones,
+                                SD_BUS_VTABLE_UNPRIVILEGED),
 
         SD_BUS_VTABLE_END,
 };