_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;
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;
#include "log.h"
#include "module.h"
+#include "systemd_dbus.h"
static int terminate = 0;
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;
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;
{
_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.");
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;
*/
#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,
if (!error)
error = &error_buf;
- ret = sd_bus_default_system(&bus);
+ ret = faultd_acquire_systemd_bus(&bus);
if (ret < 0)
return ret;
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;
+}
#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, ...);
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 */