35#define SYSTEMD_DBUS_SERVICE "org.freedesktop.systemd1"
36#define SYSTEMD_DBUS_PATH "/org/freedesktop/systemd1"
37#define SYSTEMD_DBUS_INTERFACE "org.freedesktop.systemd1.Manager"
47gboolean systemd_control_service(
const char *name,
const char *method);
48gboolean systemd_control_start (
void);
49void systemd_control_stop (
void);
56static DBusConnection *systemd_con = NULL;
67gboolean systemd_control_service(
const char *name,
const char *method)
71 DBusMessage *req = NULL;
72 DBusMessage *rsp = NULL;
73 DBusError err = DBUS_ERROR_INIT;
74 const char *arg =
"replace";
77 log_debug(
"%s(%s) ...", method, name);
80 log_err(
"not connected to system bus; skip systemd unit control");
84 req = dbus_message_new_method_call(SYSTEMD_DBUS_SERVICE,
86 SYSTEMD_DBUS_INTERFACE,
89 log_err(
"failed to construct %s.%s request",
90 SYSTEMD_DBUS_INTERFACE,
95 if( !dbus_message_append_args(req,
96 DBUS_TYPE_STRING, &name,
97 DBUS_TYPE_STRING, &arg,
100 log_debug(
"error appending arguments");
104 rsp = dbus_connection_send_with_reply_and_block(systemd_con, req, -1, &err);
106 log_err(
"no reply to %s.%s request: %s: %s",
107 SYSTEMD_DBUS_INTERFACE,
109 err.name, err.message);
113 if( dbus_set_error_from_message(&err, rsp) ) {
114 log_err(
"got error reply to %s.%s request: %s: %s",
115 SYSTEMD_DBUS_INTERFACE,
117 err.name, err.message);
121 if( !dbus_message_get_args(rsp, &err,
122 DBUS_TYPE_OBJECT_PATH, &res,
123 DBUS_TYPE_INVALID) ) {
124 log_err(
"failed to parse reply to %s.%s request: %s: %s",
125 SYSTEMD_DBUS_INTERFACE,
127 err.name, err.message);
133 dbus_error_free(&err);
135 log_debug(
"%s(%s) -> %s", method, name, res ?:
"N/A");
137 if( rsp ) dbus_message_unref(rsp);
138 if( req ) dbus_message_unref(req);
148systemd_control_start(
void)
150 LOG_REGISTER_CONTEXT;
152 gboolean ack = FALSE;
154 log_debug(
"starting systemd control");
157 if( (systemd_con = umdbus_get_connection()) == 0 )
159 log_err(
"Could not connect to dbus for systemd control\n");
170systemd_control_stop(
void)
172 LOG_REGISTER_CONTEXT;
174 log_debug(
"stopping systemd control");
179 dbus_connection_unref(systemd_con),