Use private bus provided by systemd 27/131527/7
authorPaweł Szewczyk <p.szewczyk@samsung.com>
Wed, 7 Jun 2017 13:24:55 +0000 (15:24 +0200)
committerPaweł Szewczyk <p.szewczyk@samsung.com>
Wed, 21 Jun 2017 09:51:34 +0000 (11:51 +0200)
Change-Id: I74a141d484002054b7a7a4ec72b0bacaa9e5f6f7
Signed-off-by: Paweł Szewczyk <p.szewczyk@samsung.com>
src/core/service.c
src/faultd.c
src/listeners/systemd.c
src/util/systemd_dbus.c
src/util/systemd_dbus.h

index 8b81a73be6ee9f58c22b5548d35d3ef321fb5bb7..7d41cec5603197786d0b632033d3bac8ad4cb2f4 100644 (file)
@@ -105,7 +105,7 @@ static int get_service_config_path(const char *dbus_path, char **config_path)
        _cleanup_free_ char *name = NULL;
        int ret;
 
-       ret = sd_bus_default_system(&bus);
+       ret = faultd_acquire_systemd_bus(&bus);
        if (ret < 0) {
                log_error_errno(ret, "Failed to acquire the default system bus connection: %m.");
                return ret;
@@ -197,7 +197,7 @@ int systemd_get_unit_by_pid(pid_t pid, const char **name)
 
        assert(name);
 
-       rc = sd_bus_default_system(&bus);
+       rc = faultd_acquire_systemd_bus(&bus);
        if (rc < 0) {
                log_error_errno(rc, "Failed to acquire the defult system bus connection: %m.");
                return rc;
index 2114b9a21b876315894f8a12c39b66df2a455d3e..906f2d517b10f58a9005dcec733f0bdd54f4f90b 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "log.h"
 #include "module.h"
+#include "systemd_dbus.h"
 
 static int terminate = 0;
 
@@ -91,7 +92,7 @@ int main(int ac, char *av[])
                return -1;
        }
 
-       rc = sd_bus_default_system(&bus);
+       rc = faultd_acquire_systemd_bus(&bus);
        if (rc < 0) {
                log_error_errno(rc, "Failed to acquire the default system bus connection: %m");
                return -1;
index 273afb27309931a134df5d468f4192879be906b2..7032bed594a80d6844224ffc107610916f172c01 100644 (file)
@@ -49,11 +49,18 @@ static int on_unit_properties_changed(sd_bus_message *m, void *userdata,
        struct sf_event_data sf_ev_data = {};
        struct faultd_event *ev;
 
+       if (strcmp("org.freedesktop.DBus.Properties", sd_bus_message_get_interface(m)))
+               goto finish;
+
+       if (strcmp("PropertiesChanged", sd_bus_message_get_member(m)))
+               goto finish;
+
        rc = sd_bus_message_read(m, "s", &interface);
        if (rc < 0) {
                log_error_errno(rc, "Invalid message format.");
                goto finish;
        }
+
        if (strcmp(SYSTEMD_UNIT_INTERFACE, interface) != 0) {
                rc = 0;
                goto finish;
@@ -181,9 +188,10 @@ static int systemd_listener_init(struct faultd_module *module,
 {
        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
        _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+       const char *addr;
        int rc;
 
-       rc = sd_bus_default_system(&bus);
+       rc = faultd_acquire_systemd_bus(&bus);
        if (rc < 0) {
                log_error_errno(rc,
                                                "Failed to acquire the default system bus connection.");
@@ -196,14 +204,26 @@ static int systemd_listener_init(struct faultd_module *module,
                return -1;
        }
 
-       rc = sd_bus_add_match(bus,
-                                                 NULL,
-                                                 "type='signal',sender='org.freedesktop.systemd1',"
-                                                 "interface='org.freedesktop.DBus.Properties',"
-                                                 "member='PropertiesChanged',"
-                                                 "path_namespace='/org/freedesktop/systemd1/unit'",
-                                                 on_unit_properties_changed,
-                                                 NULL);
+       rc = sd_bus_get_address(bus, &addr);
+       if (rc < 0) {
+               log_error_errno(rc, "Failed to get bus address.");
+               return -1;
+       }
+
+       if (strcmp(SYSTEMD_PRIVATE_BUS, addr) == 0)
+               rc = sd_bus_add_filter(bus,
+                               NULL,
+                               on_unit_properties_changed,
+                               NULL);
+       else
+               rc = sd_bus_add_match(bus,
+                               NULL,
+                               "type='signal',sender='org.freedesktop.systemd1',"
+                               "interface='org.freedesktop.DBus.Properties',"
+                               "member='PropertiesChanged',"
+                               "path_namespace='/org/freedesktop/systemd1/unit'",
+                               on_unit_properties_changed,
+                               NULL);
        if (rc < 0) {
                log_error_errno(rc, "Failed to add match.");
                return -1;
index 728dd6bf9c3f1b3a723c4fa98f8a5ecc5967c62c..1efcc1157240a5f494c2b62a6cafd7fae636fb1c 100644 (file)
  */
 
 #include <systemd/sd-bus.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <errno.h>
 
 #include "common.h"
 #include "systemd_dbus.h"
+#include "log.h"
+
+static sd_bus *systemd_bus = NULL;
 
 int faultd_dbus_call(char *service, char *obj, char *interface, char *method,
                                         sd_bus_error *error, sd_bus_message **out_msg,
@@ -33,7 +40,7 @@ int faultd_dbus_call(char *service, char *obj, char *interface, char *method,
        if (!error)
                error = &error_buf;
 
-       ret = sd_bus_default_system(&bus);
+       ret = faultd_acquire_systemd_bus(&bus);
        if (ret < 0)
                return ret;
 
@@ -57,3 +64,47 @@ int faultd_dbus_call(char *service, char *obj, char *interface, char *method,
 fail:
        return sd_bus_error_set_errno(error, ret);
 }
+
+static int get_bus_by_address(const char *addr, sd_bus **bus)
+{
+       _cleanup_(sd_bus_unrefp) sd_bus *rbus = NULL;
+       int ret;
+
+       ret = sd_bus_new(&rbus);
+       if (ret < 0)
+               return ret;
+
+       ret = sd_bus_set_address(rbus, addr);
+       if (ret < 0)
+               return ret;
+
+       ret = sd_bus_start(rbus);
+       if (ret < 0)
+               return ret;
+
+       *bus = rbus;
+       rbus = NULL;
+       return 0;
+}
+
+int faultd_acquire_systemd_bus(sd_bus **bus)
+{
+       int ret;
+
+       if (systemd_bus) {
+               *bus = systemd_bus;
+               sd_bus_ref(systemd_bus);
+               return 0;
+       }
+
+       ret = get_bus_by_address(SYSTEMD_KERNEL_BUS, bus);
+       if (ret < 0) {
+               ret = get_bus_by_address(SYSTEMD_PRIVATE_BUS, bus);
+               if (ret < 0)
+                       return ret;
+       }
+
+       systemd_bus = *bus;
+
+       return 0;
+}
index 3badead569d635691e7f40bcd5a4ec053e8230a2..d8f1e14d3513269d00fa71f82597ef845c2a45b0 100644 (file)
@@ -28,6 +28,9 @@
 #define SYSTEMD_MANAGER_INTERFACE "org.freedesktop.systemd1.Manager"
 #define SYSTEMD_UNIT_INTERFACE "org.freedesktop.systemd1.Unit"
 
+#define SYSTEMD_PRIVATE_BUS "unix:path=/run/systemd/private"
+#define SYSTEMD_KERNEL_BUS "kernel:path=/sys/fs/kdbus/0-system/bus"
+
 int faultd_dbus_call(char *service, char *obj, char *interface, char *method,
                                         sd_bus_error *error, sd_bus_message **out_msg,
                                         char *args, ...);
@@ -39,4 +42,6 @@ int faultd_dbus_call(char *service, char *obj, char *interface, char *method,
        faultd_dbus_call_simple(SYSTEMD_SERVICE, OBJ, INTF, METHOD,               \
                                                        ARGS, ##__VA_ARGS__)
 
+int faultd_acquire_systemd_bus(sd_bus **bus);
+
 #endif /* FAULTD_SYSTEMD_DBUS_H */