#include <fcntl.h>
#include <ctype.h>
-#include <dbus/dbus.h>
-#include <systemd/sd-daemon.h>
+#include "sd-daemon.h"
+#include "sd-bus.h"
#include "util.h"
#include "log.h"
#include "list.h"
#include "initreq.h"
#include "special.h"
-#include "dbus-common.h"
+#include "bus-util.h"
+#include "bus-error.h"
#include "def.h"
#define SERVER_FD_MAX 16
LIST_HEAD(Fifo, fifos);
unsigned n_fifos;
- DBusConnection *bus;
+ sd_bus *bus;
bool quit;
} Server;
static void change_runlevel(Server *s, int runlevel) {
const char *target;
- DBusMessage *m = NULL, *reply = NULL;
- DBusError error;
+ _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
const char *mode;
bool isolate = false;
+ int r;
assert(s);
- dbus_error_init(&error);
-
- if (!(target = translate_runlevel(runlevel, &isolate))) {
+ target = translate_runlevel(runlevel, &isolate);
+ if (!target) {
log_warning("Got request for unknown runlevel %c, ignoring.", runlevel);
- goto finish;
+ return;
}
if (isolate)
log_debug("Running request %s/start/%s", target, mode);
- if (!(m = dbus_message_new_method_call("org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "StartUnit"))) {
- log_error("Could not allocate message.");
- goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &target,
- DBUS_TYPE_STRING, &mode,
- DBUS_TYPE_INVALID)) {
- log_error("Could not attach target and flag information to message.");
- goto finish;
- }
-
- if (!(reply = dbus_connection_send_with_reply_and_block(s->bus, m, -1, &error))) {
- log_error("Failed to start unit: %s", bus_error_message(&error));
- goto finish;
+ r = sd_bus_call_method(
+ s->bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "StartUnit",
+ &error,
+ NULL,
+ "ss", target, mode);
+ if (r < 0) {
+ log_error("Failed to change runlevel: %s", bus_error_message(&error, -r));
+ return;
}
-
-finish:
- if (m)
- dbus_message_unref(m);
-
- if (reply)
- dbus_message_unref(reply);
-
- dbus_error_free(&error);
}
static void request_process(Server *s, const struct init_request *req) {
case 'u':
case 'U':
if (kill(1, SIGTERM) < 0)
- log_error("kill() failed: %m");
+ log_error_errno(errno, "kill() failed: %m");
/* The bus connection will be
* terminated if PID 1 is reexecuted,
case 'q':
case 'Q':
if (kill(1, SIGHUP) < 0)
- log_error("kill() failed: %m");
+ log_error_errno(errno, "kill() failed: %m");
break;
default:
if (errno == EAGAIN)
return 0;
- log_warning("Failed to read from fifo: %s", strerror(errno));
- return -1;
+ log_warning_errno(errno, "Failed to read from fifo: %m");
+ return -errno;
}
f->bytes_read += l;
if (f->server)
epoll_ctl(f->server->epoll_fd, EPOLL_CTL_DEL, f->fd, NULL);
- close_nointr_nofail(f->fd);
+ safe_close(f->fd);
}
free(f);
while (s->fifos)
fifo_free(s->fifos);
- if (s->epoll_fd >= 0)
- close_nointr_nofail(s->epoll_fd);
+ safe_close(s->epoll_fd);
if (s->bus) {
- dbus_connection_flush(s->bus);
- dbus_connection_close(s->bus);
- dbus_connection_unref(s->bus);
+ sd_bus_flush(s->bus);
+ sd_bus_unref(s->bus);
}
}
static int server_init(Server *s, unsigned n_sockets) {
int r;
unsigned i;
- DBusError error;
assert(s);
assert(n_sockets > 0);
- dbus_error_init(&error);
-
zero(*s);
s->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
if (s->epoll_fd < 0) {
r = -errno;
- log_error("Failed to create epoll object: %s", strerror(errno));
+ log_error_errno(errno, "Failed to create epoll object: %m");
goto fail;
}
r = sd_is_fifo(fd, NULL);
if (r < 0) {
- log_error("Failed to determine file descriptor type: %s",
- strerror(-r));
+ log_error_errno(r, "Failed to determine file descriptor type: %m");
goto fail;
}
f = new0(Fifo, 1);
if (!f) {
r = -ENOMEM;
- log_error("Failed to create fifo object: %s",
- strerror(errno));
+ log_error_errno(errno, "Failed to create fifo object: %m");
goto fail;
}
if (epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0) {
r = -errno;
fifo_free(f);
- log_error("Failed to add fifo fd to epoll object: %s",
- strerror(errno));
+ log_error_errno(errno, "Failed to add fifo fd to epoll object: %m");
goto fail;
}
s->n_fifos ++;
}
- if (bus_connect(DBUS_BUS_SYSTEM, &s->bus, NULL, &error) < 0) {
- log_error("Failed to get D-Bus connection: %s",
- bus_error_message(&error));
+ r = bus_open_system_systemd(&s->bus);
+ if (r < 0) {
+ log_error_errno(r, "Failed to get D-Bus connection: %m");
r = -EIO;
goto fail;
}
fail:
server_done(s);
- dbus_error_free(&error);
return r;
}
f = (Fifo*) ev->data.ptr;
r = fifo_process(f);
if (r < 0) {
- log_info("Got error on fifo: %s", strerror(-r));
+ log_info_errno(r, "Got error on fifo: %m");
fifo_free(f);
return r;
}
umask(0022);
- if ((n = sd_listen_fds(true)) < 0) {
- log_error("Failed to read listening file descriptors from environment: %s", strerror(-r));
+ n = sd_listen_fds(true);
+ if (n < 0) {
+ log_error_errno(r, "Failed to read listening file descriptors from environment: %m");
return EXIT_FAILURE;
}
if (server_init(&server, (unsigned) n) < 0)
return EXIT_FAILURE;
- log_debug("systemd-initctl running as pid %lu", (unsigned long) getpid());
+ log_debug("systemd-initctl running as pid "PID_FMT, getpid());
sd_notify(false,
"READY=1\n"
if (errno == EINTR)
continue;
- log_error("epoll_wait() failed: %s", strerror(errno));
+ log_error_errno(errno, "epoll_wait() failed: %m");
goto fail;
}
r = EXIT_SUCCESS;
- log_debug("systemd-initctl stopped as pid %lu", (unsigned long) getpid());
+ log_debug("systemd-initctl stopped as pid "PID_FMT, getpid());
fail:
sd_notify(false,
+ "STOPPING=1\n"
"STATUS=Shutting down...");
server_done(&server);
- dbus_shutdown();
-
return r;
}