#include "hwclock.h"
#include "conf-files.h"
#include "path-util.h"
+#include "fileio-label.h"
+#include "label.h"
#define NULL_ADJTIME_UTC "0.0 0 0\n0\nUTC\n"
#define NULL_ADJTIME_LOCAL "0.0 0 0\n0\nLOCAL\n"
" <interface name=\"org.freedesktop.timedate1\">\n" \
" <property name=\"Timezone\" type=\"s\" access=\"read\"/>\n" \
" <property name=\"LocalRTC\" type=\"b\" access=\"read\"/>\n" \
+ " <property name=\"CanNTP\" type=\"b\" access=\"read\"/>\n" \
" <property name=\"NTP\" type=\"b\" access=\"read\"/>\n" \
" <method name=\"SetTime\">\n" \
" <arg name=\"usec_utc\" type=\"x\" direction=\"in\"/>\n" \
typedef struct TZ {
char *zone;
bool local_rtc;
+ int can_ntp;
int use_ntp;
} TZ;
static TZ tz = {
+ .can_ntp = -1,
.use_ntp = -1,
};
}
}
-#ifdef HAVE_DEBIAN
- 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));
- }
-#endif
-
have_timezone:
if (isempty(tz.zone)) {
free(tz.zone);
int r = 0;
_cleanup_free_ char *p = NULL;
-#ifdef TARGET_DEBIAN
- struct stat st;
-#endif
-
if (!tz.zone) {
if (unlink("/etc/localtime") < 0 && errno != ENOENT)
r = -errno;
-#ifdef TARGET_DEBIAN
- if (unlink("/etc/timezone") < 0 && errno != ENOENT)
- r = -errno;
-#endif
-
return r;
}
if (r < 0)
return r;
-#ifdef TARGET_DEBIAN
- if (stat("/etc/timezone", &st) == 0 && S_ISREG(st.st_mode)) {
- r = write_one_line_file_atomic("/etc/timezone", tz.zone);
- if (r < 0)
- return r;
- }
-#endif
-
return 0;
}
return 0;
}
}
-
- r = write_one_line_file_atomic("/etc/adjtime", w);
+ label_init("/etc");
+ r = write_one_line_file_atomic_label("/etc/adjtime", w);
free(w);
return r;
char **r = NULL, **files, **i;
int k;
- k = conf_files_list(&files, ".list",
+ k = conf_files_list(&files, ".list", NULL,
"/etc/systemd/ntp-units.d",
"/run/systemd/ntp-units.d",
"/usr/local/lib/systemd/ntp-units.d",
goto finish;
}
+ tz.can_ntp = 1;
tz.use_ntp =
streq(s, "enabled") ||
streq(s, "enabled-runtime");
}
/* NTP is not installed. */
+ tz.can_ntp = 0;
tz.use_ntp = 0;
r = 0;
return r;
}
+static int property_append_can_ntp(DBusMessageIter *i, const char *property, void *data) {
+ dbus_bool_t db;
+
+ assert(i);
+ assert(property);
+
+ db = tz.can_ntp > 0;
+
+ if (!dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, &db))
+ return -ENOMEM;
+
+ return 0;
+}
+
static int property_append_ntp(DBusMessageIter *i, const char *property, void *data) {
dbus_bool_t db;
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) },
+ { "CanNTP", property_append_can_ntp, "b", offsetof(TZ, can_ntp) },
{ "NTP", property_append_ntp, "b", offsetof(TZ, use_ntp) },
{ NULL, }
};
}
log_struct(LOG_INFO,
- "MESSAGE_ID=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(SD_MESSAGE_TIMEZONE_CHANGE),
+ MESSAGE_ID(SD_MESSAGE_TIMEZONE_CHANGE),
"TIMEZONE=%s", tz.zone,
"MESSAGE=Changed timezone to '%s'.", tz.zone,
NULL);
hwclock_set_time(tm);
log_struct(LOG_INFO,
- "MESSAGE_ID=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(SD_MESSAGE_TIME_CHANGE),
+ MESSAGE_ID(SD_MESSAGE_TIME_CHANGE),
"REALTIME=%llu", (unsigned long long) timespec_load(&ts),
"MESSAGE=Changed local time to %s", ctime(&ts.tv_sec),
NULL);
if (!(reply = dbus_message_new_method_return(message)))
goto oom;
- if (!dbus_connection_send(connection, reply, NULL))
+ if (!bus_maybe_send_reply(connection, message, reply))
goto oom;
dbus_message_unref(reply);
if (!bus) {
log_error("Failed to get system D-Bus connection: %s", bus_error_message(&error));
r = -ECONNREFUSED;
- goto fail;
+ goto fail2;
}
dbus_connection_set_exit_on_disconnect(bus, FALSE);
fail:
dbus_connection_close(bus);
dbus_connection_unref(bus);
-
+fail2:
dbus_error_free(&error);
return r;