From c5d3439055d20be03ed3dff4b31f64da54319be0 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 4 Mar 2011 19:47:43 +0100 Subject: [PATCH] dbus: add 'Tainted' property to Manager object --- TODO | 2 -- src/dbus-manager.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/TODO b/TODO index 43ac165bb2..77ed9cbd1d 100644 --- a/TODO +++ b/TODO @@ -18,8 +18,6 @@ Features: * guarantee /etc/machineid -* add "tainted" flag to systemctl show output - * introduce "x-systemd-automount" as alternative to the "comment=systemd.automount" mount option * show failure error string in "systemctl status" diff --git a/src/dbus-manager.c b/src/dbus-manager.c index 9b6cda8af5..1a587197a5 100644 --- a/src/dbus-manager.c +++ b/src/dbus-manager.c @@ -150,7 +150,8 @@ #define BUS_MANAGER_INTERFACE_PROPERTIES_GENERAL \ " \n" \ " \n" \ - " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ @@ -210,6 +211,32 @@ const char bus_manager_interface[] _introspect_("Manager") = BUS_MANAGER_INTERFA static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_manager_append_running_as, manager_running_as, ManagerRunningAs); static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_manager_append_exec_output, exec_output, ExecOutput); +static int bus_manager_append_tainted(Manager *m, DBusMessageIter *i, const char *property, void *data) { + const char *t; + char buf[64] = "", *e = buf, *p = NULL; + + assert(m); + assert(i); + assert(property); + + if (path_is_mount_point("/usr") > 0 || dir_is_empty("/usr") > 0) + e = stpcpy(e, "usr-separate-fs"); + + if (readlink_malloc("/etc/mtab", &p) < 0) { + if (e != buf) + e = stpcpy(e, " "); + e = stpcpy(e, "etc-mtab-not-symlink"); + } else + free(p); + + t = buf; + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &t)) + return -ENOMEM; + + return 0; +} + static int bus_manager_append_log_target(Manager *m, DBusMessageIter *i, const char *property, void *data) { const char *t; @@ -310,6 +337,7 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, { "org.freedesktop.systemd1.Manager", "Distribution", bus_property_append_string, "s", DISTRIBUTION }, { "org.freedesktop.systemd1.Manager", "Features", bus_property_append_string, "s", SYSTEMD_FEATURES }, { "org.freedesktop.systemd1.Manager", "RunningAs", bus_manager_append_running_as, "s", &m->running_as }, + { "org.freedesktop.systemd1.Manager", "Tainted", bus_manager_append_tainted, "s", m }, { "org.freedesktop.systemd1.Manager", "InitRDTimestamp", bus_property_append_uint64, "t", &m->initrd_timestamp.realtime }, { "org.freedesktop.systemd1.Manager", "StartupTimestamp", bus_property_append_uint64, "t", &m->startup_timestamp.realtime }, { "org.freedesktop.systemd1.Manager", "FinishTimestamp", bus_property_append_uint64, "t", &m->finish_timestamp.realtime },