1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #include <sys/socket.h>
24 #include <sys/types.h>
34 #include "socket-util.h"
35 #include "sd-daemon.h"
37 #include "bus-internal.h"
38 #include "bus-message.h"
40 int main(int argc, char *argv[]) {
41 _cleanup_bus_unref_ sd_bus *a = NULL, *b = NULL;
47 log_error("This program takes no argument.");
51 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
52 log_parse_environment();
56 sd_is_socket(STDIN_FILENO, AF_UNIX, 0, 0) > 0 &&
57 sd_is_socket(STDOUT_FILENO, AF_UNIX, 0, 0) > 0;
61 log_error("Failed to allocate bus: %s", strerror(-r));
65 r = sd_bus_set_address(a, "unix:path=/run/dbus/system_bus_socket");
67 log_error("Failed to set address to connect to: %s", strerror(-r));
71 r = sd_bus_set_negotiate_fds(a, is_unix);
73 log_error("Failed to set FD negotiation: %s", strerror(-r));
79 log_error("Failed to start bus client: %s", strerror(-r));
83 r = sd_bus_get_server_id(a, &server_id);
85 log_error("Failed to get server ID: %s", strerror(-r));
91 log_error("Failed to allocate bus: %s", strerror(-r));
95 r = sd_bus_set_fd(b, STDIN_FILENO, STDOUT_FILENO);
97 log_error("Failed to set fds: %s", strerror(-r));
101 r = sd_bus_set_server(b, 1, server_id);
103 log_error("Failed to set server mode: %s", strerror(-r));
107 r = sd_bus_set_negotiate_fds(b, is_unix);
109 log_error("Failed to set FD negotiation: %s", strerror(-r));
113 r = sd_bus_set_anonymous(b, true);
115 log_error("Failed to set anonymous authentication: %s", strerror(-r));
121 log_error("Failed to start bus client: %s", strerror(-r));
126 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
128 int events_a, events_b, fd;
129 uint64_t timeout_a, timeout_b, t;
130 struct timespec _ts, *ts;
132 r = sd_bus_process(a, &m);
134 log_error("Failed to process bus: %s", strerror(-r));
139 r = sd_bus_send(b, m, NULL);
141 log_error("Failed to send message: %s", strerror(-r));
149 r = sd_bus_process(b, &m);
151 log_error("Failed to process bus: %s", strerror(-r));
156 r = sd_bus_send(a, m, NULL);
158 log_error("Failed to send message: %s", strerror(-r));
166 fd = sd_bus_get_fd(a);
168 log_error("Failed to get fd: %s", strerror(-r));
172 events_a = sd_bus_get_events(a);
174 log_error("Failed to get events mask: %s", strerror(-r));
178 r = sd_bus_get_timeout(a, &timeout_a);
180 log_error("Failed to get timeout: %s", strerror(-r));
184 events_b = sd_bus_get_events(b);
186 log_error("Failed to get events mask: %s", strerror(-r));
190 r = sd_bus_get_timeout(b, &timeout_b);
192 log_error("Failed to get timeout: %s", strerror(-r));
197 if (t == (uint64_t) -1 || (timeout_b != (uint64_t) -1 && timeout_b < timeout_a))
200 if (t == (uint64_t) -1)
205 nw = now(CLOCK_MONOTONIC);
211 ts = timespec_store(&_ts, t);
216 p[0].events = events_a;
217 p[1].fd = STDIN_FILENO;
218 p[1].events = events_b & POLLIN;
219 p[2].fd = STDOUT_FILENO;
220 p[2].events = events_b & POLLOUT;
222 r = ppoll(p, ELEMENTSOF(p), ts, NULL);
224 log_error("ppoll() failed: %m");
232 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;