From 3813169516563114bf55d2198b3e01f10f197b9a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 2 Feb 2010 12:22:59 +0100 Subject: [PATCH 1/1] expose more properties --- dbus-unit.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++--- dbus.c | 28 ++++++++++++++- dbus.h | 2 ++ 3 files changed, 127 insertions(+), 5 deletions(-) diff --git a/dbus-unit.c b/dbus-unit.c index d47408265..eef1b644e 100644 --- a/dbus-unit.c +++ b/dbus-unit.c @@ -14,6 +14,12 @@ static const char introspection[] = " " " " " " + " " + " " + " " + " " + " " + " " " " BUS_PROPERTIES_INTERFACE BUS_INTROSPECTABLE_INTERFACE @@ -87,13 +93,101 @@ static int bus_unit_append_active_state(Manager *m, DBusMessageIter *i, const ch return 0; } +static int bus_unit_append_can_reload(Manager *m, DBusMessageIter *i, const char *property, void *data) { + Unit *u = data; + dbus_bool_t b; + + assert(m); + assert(i); + assert(property); + assert(u); + + b = unit_can_reload(u); + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, &b)) + return -ENOMEM; + + return 0; +} + +static int bus_unit_append_can_start(Manager *m, DBusMessageIter *i, const char *property, void *data) { + Unit *u = data; + dbus_bool_t b; + + assert(m); + assert(i); + assert(property); + assert(u); + + b = unit_can_start(u); + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, &b)) + return -ENOMEM; + + return 0; +} + +static int bus_unit_append_job(Manager *m, DBusMessageIter *i, const char *property, void *data) { + Unit *u = data; + DBusMessageIter sub; + char *p; + + assert(m); + assert(i); + assert(property); + assert(u); + + if (!dbus_message_iter_open_container(i, DBUS_TYPE_STRUCT, NULL, &sub)) + return -ENOMEM; + + if (u->meta.job) { + + if (!(p = job_dbus_path(u->meta.job))) + return -ENOMEM; + + if (!dbus_message_iter_append_basic(&sub, DBUS_TYPE_UINT32, &u->meta.job->id) || + !dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &p)) { + free(p); + return -ENOMEM; + } + } else { + uint32_t id = 0; + + /* No job, so let's fill in some placeholder + * data. Since we need to fill in a valid path we + * simple point to ourselves. */ + + if (!(p = unit_dbus_path(u))) + return -ENOMEM; + + if (!dbus_message_iter_append_basic(&sub, DBUS_TYPE_UINT32, &id) || + !dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &p)) { + free(p); + return -ENOMEM; + } + } + + free(p); + + if (!dbus_message_iter_close_container(i, &sub)) + return -ENOMEM; + + return 0; +} + static DBusHandlerResult bus_unit_message_dispatch(Unit *u, DBusMessage *message) { const BusProperty properties[] = { - { "org.freedesktop.systemd1.Unit", "Id", bus_unit_append_id, "s", u }, - { "org.freedesktop.systemd1.Unit", "Description", bus_unit_append_description, "s", u }, - { "org.freedesktop.systemd1.Unit", "LoadState", bus_unit_append_load_state, "s", u }, - { "org.freedesktop.systemd1.Unit", "ActiveState", bus_unit_append_active_state, "s", u }, + { "org.freedesktop.systemd1.Unit", "Id", bus_unit_append_id, "s", u }, + { "org.freedesktop.systemd1.Unit", "Description", bus_unit_append_description, "s", u }, + { "org.freedesktop.systemd1.Unit", "LoadState", bus_unit_append_load_state, "s", u }, + { "org.freedesktop.systemd1.Unit", "ActiveState", bus_unit_append_active_state, "s", u }, + { "org.freedesktop.systemd1.Unit", "LoadPath", bus_property_append_string, "s", u->meta.load_path }, + { "org.freedesktop.systemd1.Unit", "ActiveEnterTimestamp", bus_property_append_uint64, "t", &u->meta.active_enter_timestamp }, + { "org.freedesktop.systemd1.Unit", "ActiveExitTimestamp", bus_property_append_uint64, "t", &u->meta.active_exit_timestamp }, + { "org.freedesktop.systemd1.Unit", "CanReload", bus_unit_append_can_reload, "b", u }, + { "org.freedesktop.systemd1.Unit", "CanStart", bus_unit_append_can_start, "b", u }, + { "org.freedesktop.systemd1.Unit", "Job", bus_unit_append_job, "(us)", u, }, { NULL, NULL, NULL, NULL, NULL } }; diff --git a/dbus.c b/dbus.c index 84b8fbf09..caafc9757 100644 --- a/dbus.c +++ b/dbus.c @@ -561,7 +561,9 @@ int bus_property_append_string(Manager *m, DBusMessageIter *i, const char *prope assert(m); assert(i); assert(property); - assert(t); + + if (!t) + t = ""; if (!dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &t)) return -ENOMEM; @@ -606,3 +608,27 @@ int bus_property_append_bool(Manager *m, DBusMessageIter *i, const char *propert return 0; } + +int bus_property_append_uint64(Manager *m, DBusMessageIter *i, const char *property, void *data) { + assert(m); + assert(i); + assert(property); + assert(data); + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_UINT64, data)) + return -ENOMEM; + + return 0; +} + +int bus_property_append_uint32(Manager *m, DBusMessageIter *i, const char *property, void *data) { + assert(m); + assert(i); + assert(property); + assert(data); + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_UINT32, data)) + return -ENOMEM; + + return 0; +} diff --git a/dbus.h b/dbus.h index 6a769c916..51023b08b 100644 --- a/dbus.h +++ b/dbus.h @@ -52,6 +52,8 @@ DBusHandlerResult bus_send_error_reply(Manager *m, DBusMessage *message, DBusErr int bus_property_append_string(Manager *m, DBusMessageIter *i, const char *property, void *data); int bus_property_append_strv(Manager *m, DBusMessageIter *i, const char *property, void *data); int bus_property_append_bool(Manager *m, DBusMessageIter *i, const char *property, void *data); +int bus_property_append_uint32(Manager *m, DBusMessageIter *i, const char *property, void *data); +int bus_property_append_uint64(Manager *m, DBusMessageIter *i, const char *property, void *data); extern const DBusObjectPathVTable bus_manager_vtable; extern const DBusObjectPathVTable bus_job_vtable; -- 2.30.2