[systemd-commits] 3 commits - src/dbus.c src/dbus.h src/dbus-manager.c src/service.c TODO

Lennart Poettering lennart at kemper.freedesktop.org
Sun Mar 6 17:18:09 PST 2011


 TODO               |    4 +++-
 src/dbus-manager.c |   32 ++++++++++++++++++++++++++++----
 src/dbus.c         |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/dbus.h         |    7 +++++++
 src/service.c      |    4 +---
 5 files changed, 91 insertions(+), 8 deletions(-)

New commits:
commit 7fc7012b8b54bdd6610d32649d4ee9c938a4843d
Author: Lennart Poettering <lennart at poettering.net>
Date:   Mon Mar 7 02:17:23 2011 +0100

    update TODO

diff --git a/TODO b/TODO
index 75fc99b..a2c1a36 100644
--- a/TODO
+++ b/TODO
@@ -18,6 +18,8 @@ F15:
 
 Features:
 
+* mount /dev/.run and /var/run as bind mounts
+
 * introduce "x-systemd-automount" as alternative to the "comment=systemd.automount" mount option
 
 * show failure error string in "systemctl status"
@@ -28,7 +30,7 @@ Features:
   document it? When doing that add switch to make this temporary by
   placing mask links in /dev.
 
-* introduce simple way to do mandatory conditions
+* introduce simple way to do mandatory conditions (make current conditions mandatory, and introduce =| as non-mandatory conditions)
 
 * detect LXC environment
 

commit c826cda421f0272275342173e16250adcdf6fbd4
Author: Andrey Borzenkov <arvidjaar at gmail.com>
Date:   Sun Mar 6 19:17:02 2011 +0300

    add org.freedesktop.DBus.Properies.Set method
    
    The patch adds framework for processing Set requests on properties
    and as first consumers allows setting of LogTarget and LogLevel on
    interface org.freedesktop.systemd1.Manager of org.freedesktop.systemd1.
    
    The code should be generic enough to allow processing of any
    property on other objects and interfaces as well.
    
    No systemctl visible interface is added so far. The LogTarget and
    LogLevel are meant for debugging in the first place; user interface
    can be added if other usage emerge.
    
    Set on systemwide systemd is restricted to root; I am not sure
    how session level access is controlled.

diff --git a/src/dbus-manager.c b/src/dbus-manager.c
index 1a58719..7d4703b 100644
--- a/src/dbus-manager.c
+++ b/src/dbus-manager.c
@@ -156,8 +156,8 @@
         "  <property name=\"InitRDTimestamp\" type=\"t\" access=\"read\"/>\n" \
         "  <property name=\"StartupTimestamp\" type=\"t\" access=\"read\"/>\n" \
         "  <property name=\"FinishTimestamp\" type=\"t\" access=\"read\"/>\n" \
-        "  <property name=\"LogLevel\" type=\"s\" access=\"read\"/>\n"  \
-        "  <property name=\"LogTarget\" type=\"s\" access=\"read\"/>\n" \
+        "  <property name=\"LogLevel\" type=\"s\" access=\"readwrite\"/>\n"  \
+        "  <property name=\"LogTarget\" type=\"s\" access=\"readwrite\"/>\n" \
         "  <property name=\"NNames\" type=\"u\" access=\"read\"/>\n"    \
         "  <property name=\"NJobs\" type=\"u\" access=\"read\"/>\n"     \
         "  <property name=\"NInstalledJobs\" type=\"u\" access=\"read\"/>\n" \
@@ -252,6 +252,18 @@ static int bus_manager_append_log_target(Manager *m, DBusMessageIter *i, const c
         return 0;
 }
 
+static int bus_manager_set_log_target(Manager *m, DBusMessageIter *i, const char *property) {
+        const char *t;
+
+        assert(m);
+        assert(i);
+        assert(property);
+
+        dbus_message_iter_get_basic(i, &t);
+
+        return log_set_target_from_string(t);
+}
+
 static int bus_manager_append_log_level(Manager *m, DBusMessageIter *i, const char *property, void *data) {
         const char *t;
 
@@ -267,6 +279,18 @@ static int bus_manager_append_log_level(Manager *m, DBusMessageIter *i, const ch
         return 0;
 }
 
+static int bus_manager_set_log_level(Manager *m, DBusMessageIter *i, const char *property) {
+        const char *t;
+
+        assert(m);
+        assert(i);
+        assert(property);
+
+        dbus_message_iter_get_basic(i, &t);
+
+        return log_set_max_level_from_string(t);
+}
+
 static int bus_manager_append_n_names(Manager *m, DBusMessageIter *i, const char *property, void *data) {
         uint32_t u;
 
@@ -341,8 +365,8 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
                 { "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 },
-                { "org.freedesktop.systemd1.Manager", "LogLevel",      bus_manager_append_log_level,  "s",  NULL               },
-                { "org.freedesktop.systemd1.Manager", "LogTarget",     bus_manager_append_log_target, "s",  NULL               },
+                { "org.freedesktop.systemd1.Manager", "LogLevel",      bus_manager_append_log_level,  "s",  NULL,               bus_manager_set_log_level},
+                { "org.freedesktop.systemd1.Manager", "LogTarget",     bus_manager_append_log_target, "s",  NULL,               bus_manager_set_log_target},
                 { "org.freedesktop.systemd1.Manager", "NNames",        bus_manager_append_n_names,    "u",  NULL               },
                 { "org.freedesktop.systemd1.Manager", "NJobs",         bus_manager_append_n_jobs,     "u",  NULL               },
                 { "org.freedesktop.systemd1.Manager", "NInstalledJobs",bus_property_append_uint32,    "u",  &m->n_installed_jobs },
diff --git a/src/dbus.c b/src/dbus.c
index 965a3e2..5a4750d 100644
--- a/src/dbus.c
+++ b/src/dbus.c
@@ -1316,6 +1316,58 @@ DBusHandlerResult bus_default_message_handler(Manager *m, DBusConnection *c, DBu
 
                 if (!dbus_message_iter_close_container(&iter, &sub))
                         goto oom;
+        } else if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Properties", "Set") && properties) {
+                const char *interface, *property;
+                DBusMessageIter iter;
+                const BusProperty *p;
+
+                if (!dbus_message_iter_init(message, &iter) ||
+                    dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
+                        return bus_send_error_reply(m, c, message, NULL, -EINVAL);
+
+                dbus_message_iter_get_basic(&iter, &interface);
+
+                if (!dbus_message_iter_next(&iter) ||
+                    dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
+                        return bus_send_error_reply(m, c, message, NULL, -EINVAL);
+
+                dbus_message_iter_get_basic(&iter, &property);
+
+                if (!dbus_message_iter_next(&iter) ||
+                    dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT ||
+                    dbus_message_iter_has_next(&iter))
+                        return bus_send_error_reply(m, c, message, NULL, -EINVAL);
+
+                for (p = properties; p->property; p++)
+                        if (streq(p->interface, interface) && streq(p->property, property))
+                                break;
+
+                if (p->set) {
+                        DBusMessageIter sub;
+                        char *sig;
+
+                        dbus_message_iter_recurse(&iter, &sub);
+
+                        if (!(sig = dbus_message_iter_get_signature(&sub)))
+                                goto oom;
+
+                        if (!streq(sig, p->signature)) {
+                                dbus_free(sig);
+                                return bus_send_error_reply(m, c, message, NULL, -EINVAL);
+                        }
+
+                        dbus_free(sig);
+
+                        if ((r = p->set(m, &sub, property)) < 0) {
+                                if (r == -ENOMEM)
+                                        goto oom;
+                                return bus_send_error_reply(m, c, message, NULL, r);
+                        }
+
+                        if (!(reply = dbus_message_new_method_return(message)))
+                                goto oom;
+                } else
+                        return bus_send_error_reply(m, c, message, NULL, -EINVAL);
         }
 
         if (reply) {
diff --git a/src/dbus.h b/src/dbus.h
index d0a9e8e..255b653 100644
--- a/src/dbus.h
+++ b/src/dbus.h
@@ -27,6 +27,7 @@
 #include "manager.h"
 
 typedef int (*BusPropertyCallback)(Manager *m, DBusMessageIter *iter, const char *property, void *data);
+typedef int (*BusPropertySetCallback)(Manager *m, DBusMessageIter *iter, const char *property);
 
 typedef struct BusProperty {
         const char *interface;           /* interface of the property */
@@ -34,6 +35,7 @@ typedef struct BusProperty {
         BusPropertyCallback append;      /* Function that is called to serialize this property */
         const char *signature;
         const void *data;                /* The data of this property */
+        BusPropertySetCallback set;      /* Function that is called to set this property */
 } BusProperty;
 
 #define BUS_PROPERTIES_INTERFACE                                        \
@@ -47,6 +49,11 @@ typedef struct BusProperty {
         "   <arg name=\"interface\" direction=\"in\" type=\"s\"/>\n"    \
         "   <arg name=\"properties\" direction=\"out\" type=\"a{sv}\"/>\n" \
         "  </method>\n"                                                 \
+        "  <method name=\"Set\">\n"                                     \
+        "   <arg name=\"interface\" direction=\"in\" type=\"s\"/>\n"    \
+        "   <arg name=\"property\" direction=\"in\" type=\"s\"/>\n"     \
+        "   <arg name=\"value\" direction=\"in\" type=\"v\"/>\n"       \
+        "  </method>\n"                                                 \
         "  <signal name=\"PropertiesChanged\">\n"                       \
         "   <arg type=\"s\" name=\"interface\"/>\n"                     \
         "   <arg type=\"a{sv}\" name=\"changed_properties\"/>\n"        \

commit b4353094e5097c0cb149b5adcffe2a6ba9240283
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Mar 4 16:54:15 2011 +0300

    service: drop redundant check in sysv_translate_facility
    
    We check for _r with an assert in the function header anyway, no need to
    check it again.

diff --git a/src/service.c b/src/service.c
index 8517579..017b546 100644
--- a/src/service.c
+++ b/src/service.c
@@ -345,9 +345,7 @@ static int sysv_translate_facility(const char *name, const char *filename, char
                 return -ENOMEM;
 
 finish:
-
-        if (_r)
-                *_r = r;
+        *_r = r;
 
         return 1;
 }



More information about the systemd-commits mailing list