chiark / gitweb /
timedated: replace ntp-units file with an ntp-units.d drop-in dir
[elogind.git] / src / timedate / timedated.c
index 16f54b59d263ecdd9b43cc9919b2fa1550a8fb5b..5387699bf316b1d1830fe1f7989b281f40cb6df1 100644 (file)
@@ -6,16 +6,16 @@
   Copyright 2011 Lennart Poettering
 
   systemd is free software; you can redistribute it and/or modify it
-  under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2 of the License, or
+  under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
   (at your option) any later version.
 
   systemd is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  General Public License for more details.
+  Lesser General Public License for more details.
 
-  You should have received a copy of the GNU General Public License
+  You should have received a copy of the GNU Lesser General Public License
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
@@ -30,6 +30,8 @@
 #include "dbus-common.h"
 #include "polkit.h"
 #include "def.h"
+#include "hwclock.h"
+#include "conf-files.h"
 
 #define NULL_ADJTIME_UTC "0.0 0 0\n0\nUTC\n"
 #define NULL_ADJTIME_LOCAL "0.0 0 0\n0\nLOCAL\n"
 
 const char timedate_interface[] _introspect_("timedate1") = INTERFACE;
 
-static char *zone = NULL;
-static bool local_rtc = false;
-static int use_ntp = -1;
+typedef struct TZ {
+        char *zone;
+        bool local_rtc;
+        int use_ntp;
+} TZ;
 
-static usec_t remain_until = 0;
+static TZ tz = {
+        .use_ntp = -1,
+};
+
+static usec_t remain_until;
 
 static void free_data(void) {
-        free(zone);
-        zone = NULL;
+        free(tz.zone);
+        tz.zone = NULL;
 
-        local_rtc = false;
+        tz.local_rtc = false;
 }
 
 static bool valid_timezone(const char *name) {
@@ -140,10 +148,10 @@ static void verify_timezone(void) {
         size_t l, q;
         int j, k;
 
-        if (!zone)
+        if (!tz.zone)
                 return;
 
-        p = strappend("/usr/share/zoneinfo/", zone);
+        p = strappend("/usr/share/zoneinfo/", tz.zone);
         if (!p) {
                 log_error("Out of memory");
                 return;
@@ -156,8 +164,8 @@ static void verify_timezone(void) {
 
         if (j < 0 || k < 0 || l != q || memcmp(a, b, l)) {
                 log_warning("/etc/localtime and /etc/timezone out of sync.");
-                free(zone);
-                zone = NULL;
+                free(tz.zone);
+                tz.zone = NULL;
         }
 
         free(a);
@@ -169,14 +177,14 @@ static int read_data(void) {
 
         free_data();
 
-        r = read_one_line_file("/etc/timezone", &zone);
+        r = read_one_line_file("/etc/timezone", &tz.zone);
         if (r < 0) {
                 if (r != -ENOENT)
                         log_warning("Failed to read /etc/timezone: %s", strerror(-r));
 
 #ifdef TARGET_FEDORA
                 r = parse_env_file("/etc/sysconfig/clock", NEWLINE,
-                                   "ZONE", &zone,
+                                   "ZONE", &tz.zone,
                                    NULL);
 
                 if (r < 0 && r != -ENOENT)
@@ -184,14 +192,14 @@ static int read_data(void) {
 #endif
         }
 
-        if (isempty(zone)) {
-                free(zone);
-                zone = NULL;
+        if (isempty(tz.zone)) {
+                free(tz.zone);
+                tz.zone = NULL;
         }
 
         verify_timezone();
 
-        local_rtc = hwclock_is_localtime() > 0;
+        tz.local_rtc = hwclock_is_localtime() > 0;
 
         return 0;
 }
@@ -200,7 +208,7 @@ static int write_data_timezone(void) {
         int r = 0;
         char *p;
 
-        if (!zone) {
+        if (!tz.zone) {
                 if (unlink("/etc/timezone") < 0 && errno != ENOENT)
                         r = -errno;
 
@@ -210,7 +218,7 @@ static int write_data_timezone(void) {
                 return r;
         }
 
-        p = strappend("/usr/share/zoneinfo/", zone);
+        p = strappend("/usr/share/zoneinfo/", tz.zone);
         if (!p) {
                 log_error("Out of memory");
                 return -ENOMEM;
@@ -222,7 +230,7 @@ static int write_data_timezone(void) {
         if (r < 0)
                 return r;
 
-        r = write_one_line_file_atomic("/etc/timezone", zone);
+        r = write_one_line_file_atomic("/etc/timezone", tz.zone);
         if (r < 0)
                 return r;
 
@@ -238,7 +246,7 @@ static int write_data_local_rtc(void) {
                 if (r != -ENOENT)
                         return r;
 
-                if (!local_rtc)
+                if (!tz.local_rtc)
                         return 0;
 
                 w = strdup(NULL_ADJTIME_LOCAL);
@@ -270,13 +278,13 @@ static int write_data_local_rtc(void) {
                 a = p - s;
                 b = strlen(e);
 
-                w = new(char, a + (local_rtc ? 5 : 3) + b + 1);
+                w = new(char, a + (tz.local_rtc ? 5 : 3) + b + 1);
                 if (!w) {
                         free(s);
                         return -ENOMEM;
                 }
 
-                *(char*) mempcpy(stpcpy(mempcpy(w, s, a), local_rtc ? "LOCAL" : "UTC"), e, b) = 0;
+                *(char*) mempcpy(stpcpy(mempcpy(w, s, a), tz.local_rtc ? "LOCAL" : "UTC"), e, b) = 0;
 
                 if (streq(w, NULL_ADJTIME_UTC)) {
                         free(w);
@@ -296,54 +304,126 @@ static int write_data_local_rtc(void) {
         return r;
 }
 
+static char** get_ntp_services(void) {
+        char **r = NULL, **files, **i;
+        int k;
+
+        k = conf_files_list(&files, ".list",
+                            "/etc/systemd/ntp-units.d",
+                            "/run/systemd/ntp-units.d",
+                            "/usr/local/lib/systemd/ntp-units.d",
+                            "/usr/lib/systemd/ntp-units.d",
+                            NULL);
+        if (k < 0)
+                return NULL;
+
+        STRV_FOREACH(i, files) {
+                FILE *f;
+
+                f = fopen(*i, "re");
+                if (!f)
+                        continue;
+
+                for (;;) {
+                        char line[PATH_MAX], *l, **q;
+
+                        if (!fgets(line, sizeof(line), f)) {
+
+                                if (ferror(f))
+                                        log_error("Failed to read NTP units file: %m");
+
+                                break;
+                        }
+
+                        l = strstrip(line);
+                        if (l[0] == 0 || l[0] == '#')
+                                continue;
+
+                        q = strv_append(r, l);
+                        if (!q) {
+                                log_error("Out of memory");
+                                break;
+                        }
+
+                        strv_free(r);
+                        r = q;
+                }
+
+                fclose(f);
+        }
+
+        strv_free(files);
+
+        return r;
+}
+
 static int read_ntp(DBusConnection *bus) {
         DBusMessage *m = NULL, *reply = NULL;
-        const char *name = "ntpd.service", *s;
         DBusError error;
         int r;
+        char **i, **l;
 
         assert(bus);
 
         dbus_error_init(&error);
 
-        m = dbus_message_new_method_call(
-                        "org.freedesktop.systemd1",
-                        "/org/freedesktop/systemd1",
-                        "org.freedesktop.systemd1.Manager",
-                        "GetUnitFileState");
+        l = get_ntp_services();
+        STRV_FOREACH(i, l) {
+                const char *s;
+
+                if (m)
+                        dbus_message_unref(m);
+                m = dbus_message_new_method_call(
+                                "org.freedesktop.systemd1",
+                                "/org/freedesktop/systemd1",
+                                "org.freedesktop.systemd1.Manager",
+                                "GetUnitFileState");
+                if (!m) {
+                        log_error("Out of memory");
+                        r = -ENOMEM;
+                        goto finish;
+                }
 
-        if (!m) {
-                log_error("Out of memory");
-                r = -ENOMEM;
-                goto finish;
-        }
+                if (!dbus_message_append_args(m,
+                                              DBUS_TYPE_STRING, i,
+                                              DBUS_TYPE_INVALID)) {
+                        log_error("Could not append arguments to message.");
+                        r = -ENOMEM;
+                        goto finish;
+                }
 
-        if (!dbus_message_append_args(m,
-                                      DBUS_TYPE_STRING, &name,
-                                      DBUS_TYPE_INVALID)) {
-                log_error("Could not append arguments to message.");
-                r = -ENOMEM;
-                goto finish;
-        }
+                if (reply)
+                        dbus_message_unref(reply);
+                reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
+                if (!reply) {
+                        if (streq(error.name, "org.freedesktop.DBus.Error.FileNotFound")) {
+                                /* This implementation does not exist, try next one */
+                                dbus_error_free(&error);
+                                continue;
+                        }
 
-        reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
-        if (!reply) {
-                log_error("Failed to issue method call: %s", bus_error_message(&error));
-                r = -EIO;
-                goto finish;
-        }
+                        log_error("Failed to issue method call: %s", bus_error_message(&error));
+                        r = -EIO;
+                        goto finish;
+                }
 
-        if (!dbus_message_get_args(reply, &error,
-                                   DBUS_TYPE_STRING, &s,
-                                   DBUS_TYPE_INVALID)) {
-                log_error("Failed to parse reply: %s", bus_error_message(&error));
-                r = -EIO;
+                if (!dbus_message_get_args(reply, &error,
+                                           DBUS_TYPE_STRING, &s,
+                                           DBUS_TYPE_INVALID)) {
+                        log_error("Failed to parse reply: %s", bus_error_message(&error));
+                        r = -EIO;
+                        goto finish;
+                }
+
+                tz.use_ntp =
+                        streq(s, "enabled") ||
+                        streq(s, "enabled-runtime");
+                r = 0;
                 goto finish;
         }
 
-        use_ntp =
-                streq(s, "enabled") ||
-                streq(s, "enabled-runtime");
+        /* NTP is not installed. */
+        tz.use_ntp = 0;
         r = 0;
 
 finish:
@@ -353,6 +433,8 @@ finish:
         if (reply)
                 dbus_message_unref(reply);
 
+        strv_free(l);
+
         dbus_error_free(&error);
 
         return r;
@@ -360,40 +442,60 @@ finish:
 
 static int start_ntp(DBusConnection *bus, DBusError *error) {
         DBusMessage *m = NULL, *reply = NULL;
-        const char *name = "ntpd.service", *mode = "replace";
+        const char *mode = "replace";
+        char **i, **l;
         int r;
 
         assert(bus);
         assert(error);
 
-        m = dbus_message_new_method_call(
-                        "org.freedesktop.systemd1",
-                        "/org/freedesktop/systemd1",
-                        "org.freedesktop.systemd1.Manager",
-                        use_ntp ? "StartUnit" : "StopUnit");
-        if (!m) {
-                log_error("Could not allocate message.");
-                r = -ENOMEM;
-                goto finish;
-        }
+        l = get_ntp_services();
+        STRV_FOREACH(i, l) {
+                if (m)
+                        dbus_message_unref(m);
+                m = dbus_message_new_method_call(
+                                "org.freedesktop.systemd1",
+                                "/org/freedesktop/systemd1",
+                                "org.freedesktop.systemd1.Manager",
+                                tz.use_ntp ? "StartUnit" : "StopUnit");
+                if (!m) {
+                        log_error("Could not allocate message.");
+                        r = -ENOMEM;
+                        goto finish;
+                }
 
-        if (!dbus_message_append_args(m,
-                                      DBUS_TYPE_STRING, &name,
-                                      DBUS_TYPE_STRING, &mode,
-                                      DBUS_TYPE_INVALID)) {
-                log_error("Could not append arguments to message.");
-                r = -ENOMEM;
-                goto finish;
-        }
+                if (!dbus_message_append_args(m,
+                                              DBUS_TYPE_STRING, i,
+                                              DBUS_TYPE_STRING, &mode,
+                                              DBUS_TYPE_INVALID)) {
+                        log_error("Could not append arguments to message.");
+                        r = -ENOMEM;
+                        goto finish;
+                }
 
-        reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error);
-        if (!reply) {
-                log_error("Failed to issue method call: %s", bus_error_message(error));
-                r = -EIO;
+                if (reply)
+                        dbus_message_unref(reply);
+                reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error);
+                if (!reply) {
+                        if (streq(error->name, "org.freedesktop.DBus.Error.FileNotFound") ||
+                            streq(error->name, "org.freedesktop.systemd1.LoadFailed") ||
+                            streq(error->name, "org.freedesktop.systemd1.NoSuchUnit")) {
+                                /* This implementation does not exist, try next one */
+                                dbus_error_free(error);
+                                continue;
+                        }
+
+                        log_error("Failed to issue method call: %s", bus_error_message(error));
+                        r = -EIO;
+                        goto finish;
+                }
+
+                r = 0;
                 goto finish;
         }
 
-        r = 0;
+        /* No implementaiton available... */
+        r = -ENOENT;
 
 finish:
         if (m)
@@ -402,82 +504,105 @@ finish:
         if (reply)
                 dbus_message_unref(reply);
 
+        strv_free(l);
+
         return r;
 }
 
 static int enable_ntp(DBusConnection *bus, DBusError *error) {
         DBusMessage *m = NULL, *reply = NULL;
-        const char * const names[] = { "ntpd.service", NULL };
         int r;
         DBusMessageIter iter;
         dbus_bool_t f = FALSE, t = TRUE;
+        char **i, **l;
 
         assert(bus);
         assert(error);
 
-        m = dbus_message_new_method_call(
-                        "org.freedesktop.systemd1",
-                        "/org/freedesktop/systemd1",
-                        "org.freedesktop.systemd1.Manager",
-                        use_ntp ? "EnableUnitFiles" : "DisableUnitFiles");
+        l = get_ntp_services();
+        STRV_FOREACH(i, l) {
+                char* k[2];
+
+                if (m)
+                        dbus_message_unref(m);
+                m = dbus_message_new_method_call(
+                                "org.freedesktop.systemd1",
+                                "/org/freedesktop/systemd1",
+                                "org.freedesktop.systemd1.Manager",
+                                tz.use_ntp ? "EnableUnitFiles" : "DisableUnitFiles");
+                if (!m) {
+                        log_error("Could not allocate message.");
+                        r = -ENOMEM;
+                        goto finish;
+                }
 
-        if (!m) {
-                log_error("Could not allocate message.");
-                r = -ENOMEM;
-                goto finish;
-        }
+                dbus_message_iter_init_append(m, &iter);
 
-        dbus_message_iter_init_append(m, &iter);
+                k[0] = *i;
+                k[1] = NULL;
 
-        r = bus_append_strv_iter(&iter, (char**) names);
-        if (r < 0) {
-                log_error("Failed to append unit files.");
-                goto finish;
-        }
-        /* send runtime bool */
-        if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &f)) {
-                log_error("Failed to append runtime boolean.");
-                r = -ENOMEM;
-                goto finish;
-        }
+                r = bus_append_strv_iter(&iter, k);
+                if (r < 0) {
+                        log_error("Failed to append unit files.");
+                        goto finish;
+                }
 
-        if (use_ntp) {
-                /* send force bool */
-                if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &t)) {
-                        log_error("Failed to append force boolean.");
+                /* send runtime bool */
+                if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &f)) {
+                        log_error("Failed to append runtime boolean.");
                         r = -ENOMEM;
                         goto finish;
                 }
-        }
 
-        reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error);
-        if (!reply) {
-                log_error("Failed to issue method call: %s", bus_error_message(error));
-                r = -EIO;
-                goto finish;
-        }
+                if (tz.use_ntp) {
+                        /* send force bool */
+                        if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &t)) {
+                                log_error("Failed to append force boolean.");
+                                r = -ENOMEM;
+                                goto finish;
+                        }
+                }
 
-        dbus_message_unref(m);
-        m = dbus_message_new_method_call(
-                        "org.freedesktop.systemd1",
-                        "/org/freedesktop/systemd1",
-                        "org.freedesktop.systemd1.Manager",
-                        "Reload");
-        if (!m) {
-                log_error("Could not allocate message.");
-                r = -ENOMEM;
-                goto finish;
-        }
+                if (reply)
+                        dbus_message_unref(reply);
+                reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error);
+                if (!reply) {
+                        if (streq(error->name, "org.freedesktop.DBus.Error.FileNotFound")) {
+                                /* This implementation does not exist, try next one */
+                                dbus_error_free(error);
+                                continue;
+                        }
 
-        dbus_message_unref(reply);
-        reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error);
-        if (!reply) {
-                log_error("Failed to issue method call: %s", bus_error_message(error));
-                r = -EIO;
+                        log_error("Failed to issue method call: %s", bus_error_message(error));
+                        r = -EIO;
+                        goto finish;
+                }
+
+                dbus_message_unref(m);
+                m = dbus_message_new_method_call(
+                                "org.freedesktop.systemd1",
+                                "/org/freedesktop/systemd1",
+                                "org.freedesktop.systemd1.Manager",
+                                "Reload");
+                if (!m) {
+                        log_error("Could not allocate message.");
+                        r = -ENOMEM;
+                        goto finish;
+                }
+
+                dbus_message_unref(reply);
+                reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error);
+                if (!reply) {
+                        log_error("Failed to issue method call: %s", bus_error_message(error));
+                        r = -EIO;
+                        goto finish;
+                }
+
+                r = 0;
                 goto finish;
         }
 
-        r = 0;
+        r = -ENOENT;
 
 finish:
         if (m)
@@ -486,6 +611,8 @@ finish:
         if (reply)
                 dbus_message_unref(reply);
 
+        strv_free(l);
+
         return r;
 }
 
@@ -495,7 +622,7 @@ static int property_append_ntp(DBusMessageIter *i, const char *property, void *d
         assert(i);
         assert(property);
 
-        db = use_ntp > 0;
+        db = tz.use_ntp > 0;
 
         if (!dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, &db))
                 return -ENOMEM;
@@ -503,18 +630,23 @@ static int property_append_ntp(DBusMessageIter *i, const char *property, void *d
         return 0;
 }
 
+static const BusProperty bus_timedate_properties[] = {
+        { "Timezone", bus_property_append_string, "s", offsetof(TZ, zone),     true },
+        { "LocalRTC", bus_property_append_bool,   "b", offsetof(TZ, local_rtc) },
+        { "NTP",      property_append_ntp,        "b", offsetof(TZ, use_ntp)   },
+        { NULL, }
+};
+
+static const BusBoundProperties bps[] = {
+        { "org.freedesktop.timedate1", bus_timedate_properties, &tz },
+        { NULL, }
+};
+
 static DBusHandlerResult timedate_message_handler(
                 DBusConnection *connection,
                 DBusMessage *message,
                 void *userdata) {
 
-        const BusProperty properties[] = {
-                { "org.freedesktop.timedate1", "Timezone", bus_property_append_string, "s", zone       },
-                { "org.freedesktop.timedate1", "LocalRTC", bus_property_append_bool,   "b", &local_rtc },
-                { "org.freedesktop.timedate1", "NTP",      property_append_ntp,        "b", NULL       },
-                { NULL, NULL, NULL, NULL, NULL }
-        };
-
         DBusMessage *reply = NULL, *changed = NULL;
         DBusError error;
         int r;
@@ -539,10 +671,10 @@ static DBusHandlerResult timedate_message_handler(
                 if (!valid_timezone(z))
                         return bus_send_error_reply(connection, message, NULL, -EINVAL);
 
-                if (!streq_ptr(z, zone)) {
+                if (!streq_ptr(z, tz.zone)) {
                         char *t;
 
-                        r = verify_polkit(connection, message, "org.freedesktop.timedate1.set-timezone", interactive, &error);
+                        r = verify_polkit(connection, message, "org.freedesktop.timedate1.set-timezone", interactive, NULL, &error);
                         if (r < 0)
                                 return bus_send_error_reply(connection, message, &error, r);
 
@@ -550,8 +682,8 @@ static DBusHandlerResult timedate_message_handler(
                         if (!t)
                                 goto oom;
 
-                        free(zone);
-                        zone = t;
+                        free(tz.zone);
+                        tz.zone = t;
 
                         /* 1. Write new configuration file */
                         r = write_data_timezone();
@@ -560,7 +692,7 @@ static DBusHandlerResult timedate_message_handler(
                                 return bus_send_error_reply(connection, message, NULL, r);
                         }
 
-                        if (local_rtc) {
+                        if (tz.local_rtc) {
                                 struct timespec ts;
                                 struct tm *tm;
 
@@ -573,7 +705,7 @@ static DBusHandlerResult timedate_message_handler(
                                 hwclock_set_time(tm);
                         }
 
-                        log_info("Changed timezone to '%s'.", zone);
+                        log_info("Changed timezone to '%s'.", tz.zone);
 
                         changed = bus_properties_changed_new(
                                         "/org/freedesktop/timedate1",
@@ -597,14 +729,14 @@ static DBusHandlerResult timedate_message_handler(
                                     DBUS_TYPE_INVALID))
                         return bus_send_error_reply(connection, message, &error, -EINVAL);
 
-                if (lrtc != local_rtc) {
+                if (lrtc != tz.local_rtc) {
                         struct timespec ts;
 
-                        r = verify_polkit(connection, message, "org.freedesktop.timedate1.set-local-rtc", interactive, &error);
+                        r = verify_polkit(connection, message, "org.freedesktop.timedate1.set-local-rtc", interactive, NULL, &error);
                         if (r < 0)
                                 return bus_send_error_reply(connection, message, &error, r);
 
-                        local_rtc = lrtc;
+                        tz.local_rtc = lrtc;
 
                         /* 1. Write new configuration file */
                         r = write_data_local_rtc();
@@ -614,7 +746,7 @@ static DBusHandlerResult timedate_message_handler(
                         }
 
                         /* 2. Teach kernel new timezone */
-                        if (local_rtc)
+                        if (tz.local_rtc)
                                 hwclock_apply_localtime_delta(NULL);
                         else
                                 hwclock_reset_localtime_delta();
@@ -628,7 +760,7 @@ static DBusHandlerResult timedate_message_handler(
                                 /* Sync system clock from RTC; first,
                                  * initialize the timezone fields of
                                  * struct tm. */
-                                if (local_rtc)
+                                if (tz.local_rtc)
                                         tm = *localtime(&ts.tv_sec);
                                 else
                                         tm = *gmtime(&ts.tv_sec);
@@ -640,7 +772,7 @@ static DBusHandlerResult timedate_message_handler(
 
                                         /* And set the system clock
                                          * with this */
-                                        if (local_rtc)
+                                        if (tz.local_rtc)
                                                 ts.tv_sec = mktime(&tm);
                                         else
                                                 ts.tv_sec = timegm(&tm);
@@ -652,7 +784,7 @@ static DBusHandlerResult timedate_message_handler(
                                 struct tm *tm;
 
                                 /* Sync RTC from system clock */
-                                if (local_rtc)
+                                if (tz.local_rtc)
                                         tm = localtime(&ts.tv_sec);
                                 else
                                         tm = gmtime(&ts.tv_sec);
@@ -660,7 +792,7 @@ static DBusHandlerResult timedate_message_handler(
                                 hwclock_set_time(tm);
                         }
 
-                        log_info("RTC configured to %s time.", local_rtc ? "local" : "UTC");
+                        log_info("RTC configured to %s time.", tz.local_rtc ? "local" : "UTC");
 
                         changed = bus_properties_changed_new(
                                         "/org/freedesktop/timedate1",
@@ -691,7 +823,7 @@ static DBusHandlerResult timedate_message_handler(
                         struct timespec ts;
                         struct tm* tm;
 
-                        r = verify_polkit(connection, message, "org.freedesktop.timedate1.set-time", interactive, &error);
+                        r = verify_polkit(connection, message, "org.freedesktop.timedate1.set-time", interactive, NULL, &error);
                         if (r < 0)
                                 return bus_send_error_reply(connection, message, &error, r);
 
@@ -707,7 +839,7 @@ static DBusHandlerResult timedate_message_handler(
                         }
 
                         /* Sync down to RTC */
-                        if (local_rtc)
+                        if (tz.local_rtc)
                                 tm = localtime(&ts.tv_sec);
                         else
                                 tm = gmtime(&ts.tv_sec);
@@ -728,13 +860,13 @@ static DBusHandlerResult timedate_message_handler(
                                     DBUS_TYPE_INVALID))
                         return bus_send_error_reply(connection, message, &error, -EINVAL);
 
-                if (ntp != !!use_ntp) {
+                if (ntp != !!tz.use_ntp) {
 
-                        r = verify_polkit(connection, message, "org.freedesktop.timedate1.set-ntp", interactive, &error);
+                        r = verify_polkit(connection, message, "org.freedesktop.timedate1.set-ntp", interactive, NULL, &error);
                         if (r < 0)
                                 return bus_send_error_reply(connection, message, &error, r);
 
-                        use_ntp = !!ntp;
+                        tz.use_ntp = !!ntp;
 
                         r = enable_ntp(connection, &error);
                         if (r < 0)
@@ -744,7 +876,7 @@ static DBusHandlerResult timedate_message_handler(
                         if (r < 0)
                                 return bus_send_error_reply(connection, message, &error, r);
 
-                        log_info("Set NTP to %s", use_ntp ? "enabled" : "disabled");
+                        log_info("Set NTP to %s", tz.use_ntp ? "enabled" : "disabled");
 
                         changed = bus_properties_changed_new(
                                         "/org/freedesktop/timedate1",
@@ -755,7 +887,7 @@ static DBusHandlerResult timedate_message_handler(
                 }
 
         } else
-                return bus_default_message_handler(connection, message, INTROSPECTION, INTERFACES_LIST, properties);
+                return bus_default_message_handler(connection, message, INTROSPECTION, INTERFACES_LIST, bps);
 
         if (!(reply = dbus_message_new_method_return(message)))
                 goto oom;