chiark / gitweb /
man: add systemd-dbus-proxy@.service(8) and systemd-dbus.proxy(8)
[elogind.git] / src / bus-proxyd / bus-proxyd.c
index 91472d93f1976aea0c26bb839a39626207596a71..80d21203ed12f22fa6085d89b43c282b3511600d 100644 (file)
 #include "build.h"
 #include "strv.h"
 
+#define UNIX_BUS_PATH "unix:path=/run/dbus/system_bus_socket"
+#define KERNEL_BUS_PATH "kernel:path=/dev/kdbus/0-system/bus"
+
 #ifdef ENABLE_KDBUS
-static const char *arg_address = "kernel:path=/dev/kdbus/0-system/bus;unix:path=/run/dbus/system_bus_socket";
+#  define DEFAULT_BUS_PATH KERNEL_BUS_PATH ";" UNIX_BUS_PATH
 #else
-static const char *arg_address = "unix:path=/run/dbus/system_bus_socket";
+#  define DEFAULT_BUS_PATH UNIX_BUS_PATH
 #endif
 
+static const char *arg_address = DEFAULT_BUS_PATH;
 static char *arg_command_line_buffer = NULL;
 
 static int help(void) {
@@ -55,7 +59,8 @@ static int help(void) {
                "Connect STDIO or a socket to a given bus address.\n\n"
                "  -h --help              Show this help\n"
                "     --version           Show package version\n"
-               "     --address=ADDRESS   Connect to bus specified by address\n",
+               "     --address=ADDRESS   Connect to the bus specified by ADDRESS\n"
+               "                         (default: " DEFAULT_BUS_PATH ")\n",
                program_invocation_short_name);
 
         return 0;
@@ -80,7 +85,7 @@ static int parse_argv(int argc, char *argv[]) {
         assert(argc >= 0);
         assert(argv);
 
-        while ((c = getopt_long(argc, argv, "hsup:", options, NULL)) >= 0) {
+        while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0) {
 
                 switch (c) {
 
@@ -263,103 +268,77 @@ int main(int argc, char *argv[]) {
 
         for (;;) {
                 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
-                int events_a, events_b, fd;
-                uint64_t timeout_a, timeout_b, t;
+                uint64_t t;
                 struct timespec _ts, *ts;
                 struct pollfd *pollfd;
-                int k;
-
-                r = sd_bus_process(a, &m);
-                if (r < 0) {
-                        /* treat 'connection reset by peer' as clean exit condition */
-                        if (r == -ECONNRESET)
-                                r = 0;
-                        else
-                                log_error("Failed to process bus a: %s", strerror(-r));
-
-                        goto finish;
-                }
-
-                if (m) {
-                        /* We officially got EOF, let's quit */
-                        if (sd_bus_message_is_signal(m, "org.freedesktop.DBus.Local", "Disconnected")) {
-                                r = 0;
-                                goto finish;
-                        }
+                int k, i, fd;
+
+                struct bus_bus {
+                        sd_bus *bus;
+                        const char *name;
+                        int events;
+                        uint64_t timeout;
+                } busses[2] = {
+                        {a, "a"},
+                        {b, "b"},
+                };
 
-                        k = sd_bus_send(b, m, NULL);
-                        if (k < 0) {
-                                r = k;
-                                log_error("Failed to send message: %s", strerror(-r));
+                for (i = 0; i < 2; i ++) {
+                        r = sd_bus_process(busses[i].bus, &m);
+                        if (r < 0) {
+                                /* treat 'connection reset by peer' as clean exit condition */
+                                if (r == -ECONNRESET)
+                                        r = 0;
+                                else
+                                        log_error("Failed to process bus %s: %s",
+                                                  busses[i].name, strerror(-r));
                                 goto finish;
                         }
-                }
-
-                if (r > 0)
-                        continue;
-
-                r = sd_bus_process(b, &m);
-                if (r < 0) {
-                        /* treat 'connection reset by peer' as clean exit condition */
-                        if (r == -ECONNRESET)
-                                r = 0;
-                        else
-                                log_error("Failed to process bus b: %s", strerror(-r));
-
-                        goto finish;
-                }
 
-                if (m) {
-                        /* We officially got EOF, let's quit */
-                        if (sd_bus_message_is_signal(m, "org.freedesktop.DBus.Local", "Disconnected")) {
-                                r = 0;
-                                goto finish;
+                        if (m) {
+                                /* We officially got EOF, let's quit */
+                                if (sd_bus_message_is_signal(m, "org.freedesktop.DBus.Local", "Disconnected")) {
+                                        r = 0;
+                                        goto finish;
+                                }
+
+                                k = sd_bus_send(busses[1-i].bus, m, NULL);
+                                if (k < 0) {
+                                        r = k;
+                                        log_error("Failed to send message to bus %s: %s",
+                                                  busses[1-i].name, strerror(-r));
+                                        goto finish;
+                                }
                         }
 
-                        k = sd_bus_send(a, m, NULL);
-                        if (k < 0) {
-                                r = k;
-                                log_error("Failed to send message: %s", strerror(-r));
-                                goto finish;
-                        }
+                        if (r > 0)
+                                continue;
                 }
 
-                if (r > 0)
-                        continue;
-
                 fd = sd_bus_get_fd(a);
                 if (fd < 0) {
                         log_error("Failed to get fd: %s", strerror(-r));
                         goto finish;
                 }
 
-                events_a = sd_bus_get_events(a);
-                if (events_a < 0) {
-                        log_error("Failed to get events mask: %s", strerror(-r));
-                        goto finish;
-                }
-
-                r = sd_bus_get_timeout(a, &timeout_a);
-                if (r < 0) {
-                        log_error("Failed to get timeout: %s", strerror(-r));
-                        goto finish;
-                }
-
-                events_b = sd_bus_get_events(b);
-                if (events_b < 0) {
-                        log_error("Failed to get events mask: %s", strerror(-r));
-                        goto finish;
-                }
+                for (i = 0; i < 2; i ++) {
+                        busses[i].events = sd_bus_get_events(a);
+                        if (busses[i].events < 0) {
+                                log_error("Failed to get events mask: %s", strerror(-r));
+                                goto finish;
+                        }
 
-                r = sd_bus_get_timeout(b, &timeout_b);
-                if (r < 0) {
-                        log_error("Failed to get timeout: %s", strerror(-r));
-                        goto finish;
+                        r = sd_bus_get_timeout(a, &busses[i].timeout);
+                        if (r < 0) {
+                                log_error("Failed to get timeout: %s", strerror(-r));
+                                goto finish;
+                        }
                 }
 
-                t = timeout_a;
-                if (t == (uint64_t) -1 || (timeout_b != (uint64_t) -1 && timeout_b < timeout_a))
-                        t = timeout_b;
+                t = busses[0].timeout;
+                if (t == (uint64_t) -1 ||
+                    (busses[1].timeout != (uint64_t) -1 && busses[1].timeout < t))
+                        t = busses[1].timeout;
 
                 if (t == (uint64_t) -1)
                         ts = NULL;
@@ -376,9 +355,9 @@ int main(int argc, char *argv[]) {
                 }
 
                 pollfd = (struct pollfd[3]) {
-                        {.fd = fd,     .events = events_a,           },
-                        {.fd = in_fd,  .events = events_b & POLLIN,  },
-                        {.fd = out_fd, .events = events_b & POLLOUT, }
+                        {.fd = fd,     .events = busses[0].events           },
+                        {.fd = in_fd,  .events = busses[1].events & POLLIN  },
+                        {.fd = out_fd, .events = busses[1].events & POLLOUT },
                 };
 
                 r = ppoll(pollfd, 3, ts, NULL);