#include "systemd.h"
#include "log.h"
-static int on_unit_properties_changed(sd_bus_message *m, void *userdata, sd_bus_error *ret_error);
-
-int faultd_systemd_init(sd_event* loop) {
- sd_bus_error error = SD_BUS_ERROR_NULL;
- sd_bus *bus = NULL;
- int rc;
-
- rc = sd_bus_default_system(&bus);
- if (rc < 0) {
- log_error_errno(rc, "Failed to acquire the defult system bus connection.");
- return -1;
- }
-
- rc = sd_bus_attach_event(bus, loop, SD_EVENT_PRIORITY_NORMAL);
- if (rc < 0) {
- log_error_errno(rc, "Failed to attach the bus to the event loop.");
- 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);
- if (rc < 0) {
- log_error_errno(rc, "Failed to add match.");
- return -1;
- }
-
- rc = sd_bus_call_method(bus,
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- "Subscribe",
- &error,
- NULL, NULL);
- if (rc < 0) {
- log_error_errno(rc, "Failed to subscribe.");
- return -1;
- }
-
- return 0;
+static int on_unit_properties_changed(sd_bus_message *m, void *userdata,
+ sd_bus_error *ret_error);
+
+int faultd_systemd_init(sd_event* loop)
+{
+ sd_bus_error error = SD_BUS_ERROR_NULL;
+ sd_bus *bus = NULL;
+ int rc;
+
+ rc = sd_bus_default_system(&bus);
+ if (rc < 0) {
+ log_error_errno(rc, "Failed to acquire the defult system bus connection.");
+ return -1;
+ }
+
+ rc = sd_bus_attach_event(bus, loop, SD_EVENT_PRIORITY_NORMAL);
+ if (rc < 0) {
+ log_error_errno(rc, "Failed to attach the bus to the event loop.");
+ 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);
+ if (rc < 0) {
+ log_error_errno(rc, "Failed to add match.");
+ return -1;
+ }
+
+ rc = sd_bus_call_method(bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "Subscribe",
+ &error,
+ NULL, NULL);
+ if (rc < 0) {
+ log_error_errno(rc, "Failed to subscribe.");
+ return -1;
+ }
+
+ return 0;
}
-int faultd_systemd_close() {
- sd_bus_error error = SD_BUS_ERROR_NULL;
- sd_bus *bus = NULL;
- int rc;
-
- rc = sd_bus_default_system(&bus);
- if (rc < 0) {
- log_error_errno(rc, "Failed to acquire the defult system bus connection.");
- return -1;
- }
-
- rc = sd_bus_call_method(bus,
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- "Unsubscribe",
- &error,
- NULL, NULL);
- if (rc < 0) {
- log_error_errno(rc, "Failed to unsubscribe.");
- return -1;
- }
- return 0;
+int faultd_systemd_close()
+{
+ sd_bus_error error = SD_BUS_ERROR_NULL;
+ sd_bus *bus = NULL;
+ int rc;
+
+ rc = sd_bus_default_system(&bus);
+ if (rc < 0) {
+ log_error_errno(rc, "Failed to acquire the defult system bus connection.");
+ return -1;
+ }
+
+ rc = sd_bus_call_method(bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "Unsubscribe",
+ &error,
+ NULL, NULL);
+ if (rc < 0) {
+ log_error_errno(rc, "Failed to unsubscribe.");
+ return -1;
+ }
+ return 0;
}
-static int on_unit_properties_changed(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
- int rc = 1;
- const char *interface;
- /* const char* path; */
- /* path = NULL; */
- uint8_t type;
-
- rc = sd_bus_message_read(m, "s", &interface);
- if (rc < 0) {
- log_error_errno(rc, "Invalid message format.");
- goto finish;
- }
- if (strcmp("org.freedesktop.systemd1.Unit", interface) != 0) {
- rc = 0;
- goto finish;
- }
-
- fprintf(stdout,"'");
- fflush(stdout);
- rc = sd_bus_message_get_type(m, &type);
- if (rc < 0) {
- log_error_errno(rc, "Failed to get message type.");
- goto finish;
- }
-
- log_debug("Received a message!");
- log_debug(" Type: %s",
- type == SD_BUS_MESSAGE_METHOD_CALL ? "method call" :
- (type == SD_BUS_MESSAGE_METHOD_RETURN ? "method return" :
- (type == SD_BUS_MESSAGE_METHOD_ERROR ? "method error" :
- (type == SD_BUS_MESSAGE_SIGNAL ? "signal" : "INVALID"))));
- log_debug(" Interface: %s", sd_bus_message_get_interface(m));
- log_debug(" Member: %s", sd_bus_message_get_member(m));
- log_debug(" Path: %s", sd_bus_message_get_path(m));
- log_debug(" Message If: %s", interface);
-
- rc = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, "{sv}");
- if (rc < 0) {
- rc = 0;
- }
- log_debug(" Message dictionary:");
- while((rc = sd_bus_message_enter_container(m, SD_BUS_TYPE_DICT_ENTRY, "sv")) > 0) {
- const char *key;
-
- rc = sd_bus_message_read(m, "s", &key);
- if (rc < 0) {
- log_error_errno(rc, "Failed to read a DICT_ENTRY: %m.");
- rc = 0;
- goto finish;
- }
-
- if (strcmp("ActiveState", key) == 0) {
- const char *value;
-
- rc = sd_bus_message_enter_container(m, SD_BUS_TYPE_VARIANT, "s");
- if (rc < 0) {
- /* XXX */
- rc = 0;
- goto finish;
- }
- rc = sd_bus_message_read(m, "s", &value);
- if (rc < 0) {
- log_error_errno(rc, "Failed to read the AciveSate value: %m.");
- rc = 0;
- goto finish;
- }
- rc = sd_bus_message_exit_container(m);
- log_debug(" %s:%s", key, value);
-
- } else {
- log_debug(" %s", key);
- rc = sd_bus_message_skip(m, "v");
- if (rc < 0) {
- fprintf(stderr, "Failed to skip a value.");
- rc = 0;
- goto finish;
- }
- }
-
- rc = sd_bus_message_exit_container(m);
- if (rc < 0) {
- log_error_errno(rc, "Failed to exit a container: %s.", strerror(-rc));
- rc = 0;
- goto finish;
- }
- }
-
- rc = sd_bus_message_exit_container(m);
- if (rc < 0) {
- rc = 0;
- }
+static int on_unit_properties_changed(sd_bus_message *m, void *userdata,
+ sd_bus_error *ret_error)
+{
+ int rc = 1;
+ const char *interface;
+ /* const char* path; */
+ /* path = NULL; */
+ uint8_t type;
+
+ rc = sd_bus_message_read(m, "s", &interface);
+ if (rc < 0) {
+ log_error_errno(rc, "Invalid message format.");
+ goto finish;
+ }
+ if (strcmp("org.freedesktop.systemd1.Unit", interface) != 0) {
+ rc = 0;
+ goto finish;
+ }
+
+ fprintf(stdout,"'");
+ fflush(stdout);
+ rc = sd_bus_message_get_type(m, &type);
+ if (rc < 0) {
+ log_error_errno(rc, "Failed to get message type.");
+ goto finish;
+ }
+
+ log_debug("Received a message!");
+ log_debug(" Type: %s",
+ type == SD_BUS_MESSAGE_METHOD_CALL ? "method call" :
+ (type == SD_BUS_MESSAGE_METHOD_RETURN ? "method return" :
+ (type == SD_BUS_MESSAGE_METHOD_ERROR ? "method error" :
+ (type == SD_BUS_MESSAGE_SIGNAL ? "signal" : "INVALID"))));
+ log_debug(" Interface: %s", sd_bus_message_get_interface(m));
+ log_debug(" Member: %s", sd_bus_message_get_member(m));
+ log_debug(" Path: %s", sd_bus_message_get_path(m));
+ log_debug(" Message If: %s", interface);
+
+ rc = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, "{sv}");
+ if (rc < 0) {
+ rc = 0;
+ }
+ log_debug(" Message dictionary:");
+ while((rc = sd_bus_message_enter_container(m, SD_BUS_TYPE_DICT_ENTRY, "sv")) > 0) {
+ const char *key;
+
+ rc = sd_bus_message_read(m, "s", &key);
+ if (rc < 0) {
+ log_error_errno(rc, "Failed to read a DICT_ENTRY: %m.");
+ rc = 0;
+ goto finish;
+ }
+
+ if (strcmp("ActiveState", key) == 0) {
+ const char *value;
+
+ rc = sd_bus_message_enter_container(m, SD_BUS_TYPE_VARIANT, "s");
+ if (rc < 0) {
+ /* XXX */
+ rc = 0;
+ goto finish;
+ }
+ rc = sd_bus_message_read(m, "s", &value);
+ if (rc < 0) {
+ log_error_errno(rc, "Failed to read the AciveSate value: %m.");
+ rc = 0;
+ goto finish;
+ }
+ rc = sd_bus_message_exit_container(m);
+ log_debug(" %s:%s", key, value);
+
+ } else {
+ log_debug(" %s", key);
+ rc = sd_bus_message_skip(m, "v");
+ if (rc < 0) {
+ fprintf(stderr, "Failed to skip a value.");
+ rc = 0;
+ goto finish;
+ }
+ }
+
+ rc = sd_bus_message_exit_container(m);
+ if (rc < 0) {
+ log_error_errno(rc, "Failed to exit a container: %s.", strerror(-rc));
+ rc = 0;
+ goto finish;
+ }
+ }
+
+ rc = sd_bus_message_exit_container(m);
+ if (rc < 0) {
+ rc = 0;
+ }
finish:
- return rc;
+ return rc;
}