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_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_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;
127 int events_a, events_b, fd;
128 uint64_t timeout_a, timeout_b, t;
129 struct timespec _ts, *ts;
131 r = sd_bus_process(a, &m);
133 log_error("Failed to process bus: %s", strerror(-r));
138 r = sd_bus_send(b, m, NULL);
140 log_error("Failed to send message: %s", strerror(-r));
148 r = sd_bus_process(b, &m);
150 log_error("Failed to process bus: %s", strerror(-r));
155 r = sd_bus_send(a, m, NULL);
157 log_error("Failed to send message: %s", strerror(-r));
165 fd = sd_bus_get_fd(a);
167 log_error("Failed to get fd: %s", strerror(-r));
171 events_a = sd_bus_get_events(a);
173 log_error("Failed to get events mask: %s", strerror(-r));
177 r = sd_bus_get_timeout(a, &timeout_a);
179 log_error("Failed to get timeout: %s", strerror(-r));
183 events_b = sd_bus_get_events(b);
185 log_error("Failed to get events mask: %s", strerror(-r));
189 r = sd_bus_get_timeout(b, &timeout_b);
191 log_error("Failed to get timeout: %s", strerror(-r));
196 if (t == (uint64_t) -1 || (timeout_b != (uint64_t) -1 && timeout_b < timeout_a))
199 if (t == (uint64_t) -1)
204 nw = now(CLOCK_MONOTONIC);
210 ts = timespec_store(&_ts, t);
214 struct pollfd p[3] = {
215 {.fd = fd, .events = events_a, },
216 {.fd = STDIN_FILENO, .events = events_b & POLLIN, },
217 {.fd = STDOUT_FILENO, .events = events_b & POLLOUT, }};
219 r = ppoll(p, ELEMENTSOF(p), ts, NULL);
222 log_error("ppoll() failed: %m");
230 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;