1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 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/>.
38 #include "cgroup-util.h"
39 #include "bus-label.h"
42 #include "bus-internal.h"
43 #include "bus-message.h"
45 #include "bus-socket.h"
46 #include "bus-kernel.h"
47 #include "bus-control.h"
48 #include "bus-introspect.h"
49 #include "bus-signature.h"
50 #include "bus-objects.h"
52 #include "bus-container.h"
53 #include "bus-protocol.h"
54 #include "bus-track.h"
56 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
57 static int attach_io_events(sd_bus *b);
58 static void detach_io_events(sd_bus *b);
60 static void bus_close_fds(sd_bus *b) {
66 safe_close(b->input_fd);
68 if (b->output_fd >= 0 && b->output_fd != b->input_fd)
69 safe_close(b->output_fd);
71 b->input_fd = b->output_fd = -1;
74 static void bus_node_destroy(sd_bus *b, struct node *n) {
75 struct node_callback *c;
76 struct node_vtable *v;
77 struct node_enumerator *e;
85 bus_node_destroy(b, n->child);
87 while ((c = n->callbacks)) {
88 LIST_REMOVE(callbacks, n->callbacks, c);
92 while ((v = n->vtables)) {
93 LIST_REMOVE(vtables, n->vtables, v);
98 while ((e = n->enumerators)) {
99 LIST_REMOVE(enumerators, n->enumerators, e);
104 LIST_REMOVE(siblings, n->parent->child, n);
106 assert_se(hashmap_remove(b->nodes, n->path) == n);
111 static void bus_reset_queues(sd_bus *b) {
114 while (b->rqueue_size > 0)
115 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
119 b->rqueue_allocated = 0;
121 while (b->wqueue_size > 0)
122 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
126 b->wqueue_allocated = 0;
129 static void bus_free(sd_bus *b) {
130 struct filter_callback *f;
135 assert(!b->track_queue);
137 sd_bus_detach_event(b);
139 if (b->default_bus_ptr)
140 *b->default_bus_ptr = NULL;
145 munmap(b->kdbus_buffer, KDBUS_POOL_SIZE);
148 free(b->unique_name);
149 free(b->auth_buffer);
154 free(b->cgroup_root);
155 free(b->connection_name);
158 strv_free(b->exec_argv);
160 close_many(b->fds, b->n_fds);
165 hashmap_free_free(b->reply_callbacks);
166 prioq_free(b->reply_callbacks_prioq);
168 while ((f = b->filter_callbacks)) {
169 LIST_REMOVE(callbacks, b->filter_callbacks, f);
173 bus_match_free(&b->match_callbacks);
175 hashmap_free_free(b->vtable_methods);
176 hashmap_free_free(b->vtable_properties);
178 while ((n = hashmap_first(b->nodes)))
179 bus_node_destroy(b, n);
181 hashmap_free(b->nodes);
183 bus_kernel_flush_memfd(b);
185 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
190 _public_ int sd_bus_new(sd_bus **ret) {
193 assert_return(ret, -EINVAL);
199 r->n_ref = REFCNT_INIT;
200 r->input_fd = r->output_fd = -1;
201 r->message_version = 1;
202 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
203 r->hello_flags |= KDBUS_HELLO_ACCEPT_FD;
204 r->attach_flags |= KDBUS_ATTACH_NAMES;
205 r->original_pid = getpid();
207 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
209 /* We guarantee that wqueue always has space for at least one
211 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
220 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
223 assert_return(bus, -EINVAL);
224 assert_return(bus->state == BUS_UNSET, -EPERM);
225 assert_return(address, -EINVAL);
226 assert_return(!bus_pid_changed(bus), -ECHILD);
238 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
239 assert_return(bus, -EINVAL);
240 assert_return(bus->state == BUS_UNSET, -EPERM);
241 assert_return(input_fd >= 0, -EINVAL);
242 assert_return(output_fd >= 0, -EINVAL);
243 assert_return(!bus_pid_changed(bus), -ECHILD);
245 bus->input_fd = input_fd;
246 bus->output_fd = output_fd;
250 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
253 assert_return(bus, -EINVAL);
254 assert_return(bus->state == BUS_UNSET, -EPERM);
255 assert_return(path, -EINVAL);
256 assert_return(!strv_isempty(argv), -EINVAL);
257 assert_return(!bus_pid_changed(bus), -ECHILD);
269 free(bus->exec_path);
270 strv_free(bus->exec_argv);
278 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
279 assert_return(bus, -EINVAL);
280 assert_return(bus->state == BUS_UNSET, -EPERM);
281 assert_return(!bus_pid_changed(bus), -ECHILD);
283 bus->bus_client = !!b;
287 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
288 assert_return(bus, -EINVAL);
289 assert_return(bus->state == BUS_UNSET, -EPERM);
290 assert_return(!bus_pid_changed(bus), -ECHILD);
292 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ACCEPT_FD, b);
296 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
297 assert_return(bus, -EINVAL);
298 assert_return(bus->state == BUS_UNSET, -EPERM);
299 assert_return(!bus_pid_changed(bus), -ECHILD);
301 SET_FLAG(bus->attach_flags, KDBUS_ATTACH_TIMESTAMP, b);
305 _public_ int sd_bus_negotiate_creds(sd_bus *bus, uint64_t mask) {
306 assert_return(bus, -EINVAL);
307 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
308 assert_return(bus->state == BUS_UNSET, -EPERM);
309 assert_return(!bus_pid_changed(bus), -ECHILD);
311 /* The well knowns we need unconditionally, so that matches can work */
312 bus->creds_mask = mask | SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
314 return kdbus_translate_attach_flags(bus->creds_mask, &bus->creds_mask);
317 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
318 assert_return(bus, -EINVAL);
319 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
320 assert_return(bus->state == BUS_UNSET, -EPERM);
321 assert_return(!bus_pid_changed(bus), -ECHILD);
323 bus->is_server = !!b;
324 bus->server_id = server_id;
328 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
329 assert_return(bus, -EINVAL);
330 assert_return(bus->state == BUS_UNSET, -EPERM);
331 assert_return(!bus_pid_changed(bus), -ECHILD);
333 bus->anonymous_auth = !!b;
337 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
338 assert_return(bus, -EINVAL);
339 assert_return(bus->state == BUS_UNSET, -EPERM);
340 assert_return(!bus_pid_changed(bus), -ECHILD);
346 _public_ int sd_bus_set_name(sd_bus *bus, const char *name) {
349 assert_return(bus, -EINVAL);
350 assert_return(name, -EINVAL);
351 assert_return(bus->state == BUS_UNSET, -EPERM);
352 assert_return(!bus_pid_changed(bus), -ECHILD);
358 free(bus->connection_name);
359 bus->connection_name = n;
364 static int hello_callback(sd_bus *bus, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
369 assert(bus->state == BUS_HELLO || bus->state == BUS_CLOSING);
372 r = sd_bus_message_get_errno(reply);
378 r = sd_bus_message_read(reply, "s", &s);
382 if (!service_name_is_valid(s) || s[0] != ':')
385 bus->unique_name = strdup(s);
386 if (!bus->unique_name)
389 if (bus->state == BUS_HELLO)
390 bus->state = BUS_RUNNING;
395 static int bus_send_hello(sd_bus *bus) {
396 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
401 if (!bus->bus_client || bus->is_kernel)
404 r = sd_bus_message_new_method_call(
407 "org.freedesktop.DBus",
408 "/org/freedesktop/DBus",
409 "org.freedesktop.DBus",
414 return sd_bus_call_async(bus, m, hello_callback, NULL, 0, &bus->hello_cookie);
417 int bus_start_running(sd_bus *bus) {
420 if (bus->bus_client && !bus->is_kernel) {
421 bus->state = BUS_HELLO;
425 bus->state = BUS_RUNNING;
429 static int parse_address_key(const char **p, const char *key, char **value) {
430 size_t l, n = 0, allocated = 0;
440 if (strncmp(*p, key, l) != 0)
453 while (*a != ';' && *a != ',' && *a != 0) {
471 c = (char) ((x << 4) | y);
478 if (!GREEDY_REALLOC(r, allocated, n + 2))
502 static void skip_address_key(const char **p) {
506 *p += strcspn(*p, ",");
512 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
513 _cleanup_free_ char *path = NULL, *abstract = NULL;
522 while (**p != 0 && **p != ';') {
523 r = parse_address_key(p, "guid", guid);
529 r = parse_address_key(p, "path", &path);
535 r = parse_address_key(p, "abstract", &abstract);
544 if (!path && !abstract)
547 if (path && abstract)
552 if (l > sizeof(b->sockaddr.un.sun_path))
555 b->sockaddr.un.sun_family = AF_UNIX;
556 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
557 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
558 } else if (abstract) {
559 l = strlen(abstract);
560 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
563 b->sockaddr.un.sun_family = AF_UNIX;
564 b->sockaddr.un.sun_path[0] = 0;
565 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
566 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
572 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
573 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
575 struct addrinfo *result, hints = {
576 .ai_socktype = SOCK_STREAM,
577 .ai_flags = AI_ADDRCONFIG,
585 while (**p != 0 && **p != ';') {
586 r = parse_address_key(p, "guid", guid);
592 r = parse_address_key(p, "host", &host);
598 r = parse_address_key(p, "port", &port);
604 r = parse_address_key(p, "family", &family);
617 if (streq(family, "ipv4"))
618 hints.ai_family = AF_INET;
619 else if (streq(family, "ipv6"))
620 hints.ai_family = AF_INET6;
625 r = getaddrinfo(host, port, &hints, &result);
629 return -EADDRNOTAVAIL;
631 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
632 b->sockaddr_size = result->ai_addrlen;
634 freeaddrinfo(result);
639 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
641 unsigned n_argv = 0, j;
643 size_t allocated = 0;
651 while (**p != 0 && **p != ';') {
652 r = parse_address_key(p, "guid", guid);
658 r = parse_address_key(p, "path", &path);
664 if (startswith(*p, "argv")) {
668 ul = strtoul(*p + 4, (char**) p, 10);
669 if (errno > 0 || **p != '=' || ul > 256) {
677 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
685 r = parse_address_key(p, NULL, argv + ul);
700 /* Make sure there are no holes in the array, with the
701 * exception of argv[0] */
702 for (j = 1; j < n_argv; j++)
708 if (argv && argv[0] == NULL) {
709 argv[0] = strdup(path);
721 for (j = 0; j < n_argv; j++)
729 static int parse_kernel_address(sd_bus *b, const char **p, char **guid) {
730 _cleanup_free_ char *path = NULL;
738 while (**p != 0 && **p != ';') {
739 r = parse_address_key(p, "guid", guid);
745 r = parse_address_key(p, "path", &path);
764 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
765 _cleanup_free_ char *machine = NULL;
773 while (**p != 0 && **p != ';') {
774 r = parse_address_key(p, "guid", guid);
780 r = parse_address_key(p, "machine", &machine);
792 if (!filename_is_safe(machine))
796 b->machine = machine;
799 b->sockaddr.un.sun_family = AF_UNIX;
800 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
801 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + strlen("/var/run/dbus/system_bus_socket");
806 static int parse_container_kernel_address(sd_bus *b, const char **p, char **guid) {
807 _cleanup_free_ char *machine = NULL;
815 while (**p != 0 && **p != ';') {
816 r = parse_address_key(p, "guid", guid);
822 r = parse_address_key(p, "machine", &machine);
834 if (!filename_is_safe(machine))
838 b->machine = machine;
842 b->kernel = strdup("/dev/kdbus/0-system/bus");
849 static void bus_reset_parsed_address(sd_bus *b) {
853 b->sockaddr_size = 0;
854 strv_free(b->exec_argv);
858 b->server_id = SD_ID128_NULL;
865 static int bus_parse_next_address(sd_bus *b) {
866 _cleanup_free_ char *guid = NULL;
874 if (b->address[b->address_index] == 0)
877 bus_reset_parsed_address(b);
879 a = b->address + b->address_index;
888 if (startswith(a, "unix:")) {
891 r = parse_unix_address(b, &a, &guid);
896 } else if (startswith(a, "tcp:")) {
899 r = parse_tcp_address(b, &a, &guid);
905 } else if (startswith(a, "unixexec:")) {
908 r = parse_exec_address(b, &a, &guid);
914 } else if (startswith(a, "kernel:")) {
917 r = parse_kernel_address(b, &a, &guid);
922 } else if (startswith(a, "x-container-unix:")) {
925 r = parse_container_unix_address(b, &a, &guid);
930 } else if (startswith(a, "x-container-kernel:")) {
933 r = parse_container_kernel_address(b, &a, &guid);
946 r = sd_id128_from_string(guid, &b->server_id);
951 b->address_index = a - b->address;
955 static int bus_start_address(sd_bus *b) {
961 bool skipped = false;
966 r = bus_socket_exec(b);
967 else if (b->machine && b->kernel)
968 r = bus_container_connect_kernel(b);
969 else if (b->machine && b->sockaddr.sa.sa_family != AF_UNSPEC)
970 r = bus_container_connect_socket(b);
972 r = bus_kernel_connect(b);
973 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
974 r = bus_socket_connect(b);
980 r = attach_io_events(b);
985 b->last_connect_error = -r;
988 r = bus_parse_next_address(b);
992 return b->last_connect_error ? -b->last_connect_error : -ECONNREFUSED;
996 int bus_next_address(sd_bus *b) {
999 bus_reset_parsed_address(b);
1000 return bus_start_address(b);
1003 static int bus_start_fd(sd_bus *b) {
1008 assert(b->input_fd >= 0);
1009 assert(b->output_fd >= 0);
1011 r = fd_nonblock(b->input_fd, true);
1015 r = fd_cloexec(b->input_fd, true);
1019 if (b->input_fd != b->output_fd) {
1020 r = fd_nonblock(b->output_fd, true);
1024 r = fd_cloexec(b->output_fd, true);
1029 if (fstat(b->input_fd, &st) < 0)
1032 if (S_ISCHR(b->input_fd))
1033 return bus_kernel_take_fd(b);
1035 return bus_socket_take_fd(b);
1038 _public_ int sd_bus_start(sd_bus *bus) {
1041 assert_return(bus, -EINVAL);
1042 assert_return(bus->state == BUS_UNSET, -EPERM);
1043 assert_return(!bus_pid_changed(bus), -ECHILD);
1045 bus->state = BUS_OPENING;
1047 if (bus->is_server && bus->bus_client)
1050 if (bus->input_fd >= 0)
1051 r = bus_start_fd(bus);
1052 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->kernel || bus->machine)
1053 r = bus_start_address(bus);
1060 return bus_send_hello(bus);
1063 _public_ int sd_bus_open(sd_bus **ret) {
1068 assert_return(ret, -EINVAL);
1070 /* Let's connect to the starter bus if it is set, and
1071 * otherwise to the bus that is appropropriate for the scope
1072 * we are running in */
1074 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1076 if (streq(e, "system"))
1077 return sd_bus_open_system(ret);
1078 else if (streq(e, "session") || streq(e, "user"))
1079 return sd_bus_open_user(ret);
1082 e = secure_getenv("DBUS_STARTER_ADDRESS");
1084 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1085 return sd_bus_open_user(ret);
1087 return sd_bus_open_system(ret);
1094 r = sd_bus_set_address(b, e);
1098 b->bus_client = true;
1100 /* We don't know whether the bus is trusted or not, so better
1101 * be safe, and authenticate everything */
1103 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1105 r = sd_bus_start(b);
1117 _public_ int sd_bus_open_system(sd_bus **ret) {
1122 assert_return(ret, -EINVAL);
1128 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1130 r = sd_bus_set_address(b, e);
1132 r = sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_PATH);
1136 b->bus_client = true;
1137 b->is_system = true;
1139 /* Let's do per-method access control on the system bus. We
1140 * need the caller's UID and capability set for that. */
1142 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1144 r = sd_bus_start(b);
1156 _public_ int sd_bus_open_user(sd_bus **ret) {
1161 assert_return(ret, -EINVAL);
1167 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1169 r = sd_bus_set_address(b, e);
1173 e = secure_getenv("XDG_RUNTIME_DIR");
1175 _cleanup_free_ char *ee = NULL;
1177 ee = bus_address_escape(e);
1184 asprintf(&b->address, KERNEL_USER_BUS_FMT ";" UNIX_USER_BUS_FMT, (unsigned long) getuid(), ee);
1186 asprintf(&b->address, UNIX_USER_BUS_FMT, ee);
1190 asprintf(&b->address, KERNEL_USER_BUS_FMT, (unsigned long) getuid());
1203 b->bus_client = true;
1206 /* We don't do any per-method access control on the user
1210 r = sd_bus_start(b);
1222 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1223 _cleanup_free_ char *e = NULL;
1228 assert_return(host, -EINVAL);
1229 assert_return(ret, -EINVAL);
1231 e = bus_address_escape(host);
1235 p = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", NULL);
1239 r = sd_bus_new(&bus);
1246 bus->bus_client = true;
1248 r = sd_bus_start(bus);
1258 _public_ int sd_bus_open_system_container(sd_bus **ret, const char *machine) {
1259 _cleanup_free_ char *e = NULL;
1264 assert_return(machine, -EINVAL);
1265 assert_return(ret, -EINVAL);
1266 assert_return(filename_is_safe(machine), -EINVAL);
1268 e = bus_address_escape(machine);
1273 p = strjoin("x-container-kernel:machine=", e, ";x-container-unix:machine=", e, NULL);
1275 p = strjoin("x-container-unix:machine=", e, NULL);
1280 r = sd_bus_new(&bus);
1287 bus->bus_client = true;
1289 r = sd_bus_start(bus);
1299 _public_ void sd_bus_close(sd_bus *bus) {
1303 if (bus->state == BUS_CLOSED)
1305 if (bus_pid_changed(bus))
1308 bus->state = BUS_CLOSED;
1310 sd_bus_detach_event(bus);
1312 /* Drop all queued messages so that they drop references to
1313 * the bus object and the bus may be freed */
1314 bus_reset_queues(bus);
1316 if (!bus->is_kernel)
1319 /* We'll leave the fd open in case this is a kernel bus, since
1320 * there might still be memblocks around that reference this
1321 * bus, and they might need to invoke the KDBUS_CMD_FREE
1322 * ioctl on the fd when they are freed. */
1325 static void bus_enter_closing(sd_bus *bus) {
1328 if (bus->state != BUS_OPENING &&
1329 bus->state != BUS_AUTHENTICATING &&
1330 bus->state != BUS_HELLO &&
1331 bus->state != BUS_RUNNING)
1334 bus->state = BUS_CLOSING;
1337 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1338 assert_return(bus, NULL);
1340 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1345 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1351 if (REFCNT_GET(bus->n_ref) == bus->rqueue_size + bus->wqueue_size + 1) {
1354 for (i = 0; i < bus->rqueue_size; i++)
1355 if (bus->rqueue[i]->n_ref > 1) {
1361 for (i = 0; i < bus->wqueue_size; i++)
1362 if (bus->wqueue[i]->n_ref > 1) {
1368 /* We are the only holders on the messages, and the
1369 * messages are the only holders on us, so let's drop
1370 * the messages and thus implicitly also kill our own
1371 * last references */
1374 bus_reset_queues(bus);
1377 i = REFCNT_DEC(bus->n_ref);
1385 _public_ int sd_bus_is_open(sd_bus *bus) {
1387 assert_return(bus, -EINVAL);
1388 assert_return(!bus_pid_changed(bus), -ECHILD);
1390 return BUS_IS_OPEN(bus->state);
1393 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1396 assert_return(bus, -EINVAL);
1397 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1398 assert_return(!bus_pid_changed(bus), -ECHILD);
1400 if (type == SD_BUS_TYPE_UNIX_FD) {
1401 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
1404 r = bus_ensure_running(bus);
1408 return bus->can_fds;
1411 return bus_type_is_valid(type);
1414 _public_ int sd_bus_get_server_id(sd_bus *bus, sd_id128_t *server_id) {
1417 assert_return(bus, -EINVAL);
1418 assert_return(server_id, -EINVAL);
1419 assert_return(!bus_pid_changed(bus), -ECHILD);
1421 r = bus_ensure_running(bus);
1425 *server_id = bus->server_id;
1429 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1434 /* If we copy the same message to multiple
1435 * destinations, avoid using the same cookie
1437 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1442 timeout = BUS_DEFAULT_TIMEOUT;
1444 return bus_message_seal(m, ++b->cookie, timeout);
1447 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1450 /* Do packet version and endianness already match? */
1451 if ((b->message_version == 0 || b->message_version == (*m)->header->version) &&
1452 (b->message_endian == 0 || b->message_endian == (*m)->header->endian))
1455 /* No? Then remarshal! */
1456 return bus_message_remarshal(b, m);
1459 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1463 /* The bus specification says the serial number cannot be 0,
1464 * hence let's fill something in for synthetic messages. Since
1465 * synthetic messages might have a fake sender and we don't
1466 * want to interfere with the real sender's serial numbers we
1467 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1468 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1469 * even though kdbus can do 64bit. */
1471 return bus_message_seal(m, 0xFFFFFFFFULL, 0);
1474 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1481 r = bus_kernel_write_message(bus, m, hint_sync_call);
1483 r = bus_socket_write_message(bus, m, idx);
1488 if (bus->is_kernel || *idx >= BUS_MESSAGE_SIZE(m))
1489 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
1490 bus_message_type_to_string(m->header->type),
1491 strna(sd_bus_message_get_sender(m)),
1492 strna(sd_bus_message_get_destination(m)),
1493 strna(sd_bus_message_get_path(m)),
1494 strna(sd_bus_message_get_interface(m)),
1495 strna(sd_bus_message_get_member(m)),
1496 BUS_MESSAGE_COOKIE(m),
1498 strna(m->error.message));
1503 static int dispatch_wqueue(sd_bus *bus) {
1507 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1509 while (bus->wqueue_size > 0) {
1511 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1515 /* Didn't do anything this time */
1517 else if (bus->is_kernel || bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1518 /* Fully written. Let's drop the entry from
1521 * This isn't particularly optimized, but
1522 * well, this is supposed to be our worst-case
1523 * buffer only, and the socket buffer is
1524 * supposed to be our primary buffer, and if
1525 * it got full, then all bets are off
1528 bus->wqueue_size --;
1529 sd_bus_message_unref(bus->wqueue[0]);
1530 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1540 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1544 return bus_kernel_read_message(bus, hint_priority, priority);
1546 return bus_socket_read_message(bus);
1549 int bus_rqueue_make_room(sd_bus *bus) {
1552 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1555 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1561 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1566 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1568 /* Note that the priority logic is only available on kdbus,
1569 * where the rqueue is unused. We check the rqueue here
1570 * anyway, because it's simple... */
1573 if (bus->rqueue_size > 0) {
1574 /* Dispatch a queued message */
1576 *m = bus->rqueue[0];
1577 bus->rqueue_size --;
1578 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1582 /* Try to read a new message */
1583 r = bus_read_message(bus, hint_priority, priority);
1593 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1594 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1597 assert_return(bus, -EINVAL);
1598 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1599 assert_return(m, -EINVAL);
1600 assert_return(!bus_pid_changed(bus), -ECHILD);
1603 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1610 /* If the cookie number isn't kept, then we know that no reply
1612 if (!cookie && !m->sealed)
1613 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1615 r = bus_seal_message(bus, m, 0);
1619 /* Remarshall if we have to. This will possibly unref the
1620 * message and place a replacement in m */
1621 r = bus_remarshal_message(bus, &m);
1625 /* If this is a reply and no reply was requested, then let's
1626 * suppress this, if we can */
1627 if (m->dont_send && !cookie)
1630 if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
1633 r = bus_write_message(bus, m, hint_sync_call, &idx);
1635 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1636 bus_enter_closing(bus);
1641 } else if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m)) {
1642 /* Wasn't fully written. So let's remember how
1643 * much was written. Note that the first entry
1644 * of the wqueue array is always allocated so
1645 * that we always can remember how much was
1647 bus->wqueue[0] = sd_bus_message_ref(m);
1648 bus->wqueue_size = 1;
1652 /* Just append it to the queue. */
1654 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1657 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1660 bus->wqueue[bus->wqueue_size ++] = sd_bus_message_ref(m);
1664 *cookie = BUS_MESSAGE_COOKIE(m);
1669 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1670 return bus_send_internal(bus, m, cookie, false);
1673 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1676 assert_return(bus, -EINVAL);
1677 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1678 assert_return(m, -EINVAL);
1679 assert_return(!bus_pid_changed(bus), -ECHILD);
1681 if (!streq_ptr(m->destination, destination)) {
1686 r = sd_bus_message_set_destination(m, destination);
1691 return sd_bus_send(bus, m, cookie);
1694 static usec_t calc_elapse(uint64_t usec) {
1695 if (usec == (uint64_t) -1)
1698 return now(CLOCK_MONOTONIC) + usec;
1701 static int timeout_compare(const void *a, const void *b) {
1702 const struct reply_callback *x = a, *y = b;
1704 if (x->timeout != 0 && y->timeout == 0)
1707 if (x->timeout == 0 && y->timeout != 0)
1710 if (x->timeout < y->timeout)
1713 if (x->timeout > y->timeout)
1719 _public_ int sd_bus_call_async(
1722 sd_bus_message_handler_t callback,
1727 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1728 struct reply_callback *c;
1731 assert_return(bus, -EINVAL);
1732 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1733 assert_return(m, -EINVAL);
1734 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1735 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1736 assert_return(callback, -EINVAL);
1737 assert_return(!bus_pid_changed(bus), -ECHILD);
1739 r = hashmap_ensure_allocated(&bus->reply_callbacks, uint64_hash_func, uint64_compare_func);
1743 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1747 r = bus_seal_message(bus, m, usec);
1751 r = bus_remarshal_message(bus, &m);
1755 c = new0(struct reply_callback, 1);
1759 c->callback = callback;
1760 c->userdata = userdata;
1761 c->cookie = BUS_MESSAGE_COOKIE(m);
1762 c->timeout = calc_elapse(m->timeout);
1764 r = hashmap_put(bus->reply_callbacks, &c->cookie, c);
1770 if (c->timeout != 0) {
1771 r = prioq_put(bus->reply_callbacks_prioq, c, &c->prioq_idx);
1774 sd_bus_call_async_cancel(bus, c->cookie);
1779 r = sd_bus_send(bus, m, cookie);
1781 sd_bus_call_async_cancel(bus, c->cookie);
1788 _public_ int sd_bus_call_async_cancel(sd_bus *bus, uint64_t cookie) {
1789 struct reply_callback *c;
1791 assert_return(bus, -EINVAL);
1792 assert_return(cookie != 0, -EINVAL);
1793 assert_return(!bus_pid_changed(bus), -ECHILD);
1795 c = hashmap_remove(bus->reply_callbacks, &cookie);
1799 if (c->timeout != 0)
1800 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
1806 int bus_ensure_running(sd_bus *bus) {
1811 if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED || bus->state == BUS_CLOSING)
1813 if (bus->state == BUS_RUNNING)
1817 r = sd_bus_process(bus, NULL);
1820 if (bus->state == BUS_RUNNING)
1825 r = sd_bus_wait(bus, (uint64_t) -1);
1831 _public_ int sd_bus_call(
1835 sd_bus_error *error,
1836 sd_bus_message **reply) {
1838 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1844 assert_return(bus, -EINVAL);
1845 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1846 assert_return(m, -EINVAL);
1847 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1848 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1849 assert_return(!bus_error_is_dirty(error), -EINVAL);
1850 assert_return(!bus_pid_changed(bus), -ECHILD);
1852 r = bus_ensure_running(bus);
1856 i = bus->rqueue_size;
1858 r = bus_seal_message(bus, m, usec);
1862 r = bus_remarshal_message(bus, &m);
1866 r = bus_send_internal(bus, m, &cookie, true);
1870 timeout = calc_elapse(m->timeout);
1875 while (i < bus->rqueue_size) {
1876 sd_bus_message *incoming = NULL;
1878 incoming = bus->rqueue[i];
1880 if (incoming->reply_cookie == cookie) {
1881 /* Found a match! */
1883 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1886 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
1888 if (incoming->n_fds <= 0 || (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
1892 sd_bus_message_unref(incoming);
1897 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
1899 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR)
1900 r = sd_bus_error_copy(error, &incoming->error);
1904 sd_bus_message_unref(incoming);
1907 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
1910 streq(bus->unique_name, incoming->sender)) {
1912 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1915 /* Our own message? Somebody is trying
1916 * to send its own client a message,
1917 * let's not dead-lock, let's fail
1920 sd_bus_message_unref(incoming);
1924 /* Try to read more, right-away */
1928 r = bus_read_message(bus, false, 0);
1930 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1931 bus_enter_closing(bus);
1943 n = now(CLOCK_MONOTONIC);
1949 left = (uint64_t) -1;
1951 r = bus_poll(bus, true, left);
1957 r = dispatch_wqueue(bus);
1959 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1960 bus_enter_closing(bus);
1969 _public_ int sd_bus_get_fd(sd_bus *bus) {
1971 assert_return(bus, -EINVAL);
1972 assert_return(bus->input_fd == bus->output_fd, -EPERM);
1973 assert_return(!bus_pid_changed(bus), -ECHILD);
1975 return bus->input_fd;
1978 _public_ int sd_bus_get_events(sd_bus *bus) {
1981 assert_return(bus, -EINVAL);
1982 assert_return(BUS_IS_OPEN(bus->state) || bus->state == BUS_CLOSING, -ENOTCONN);
1983 assert_return(!bus_pid_changed(bus), -ECHILD);
1985 if (bus->state == BUS_OPENING)
1987 else if (bus->state == BUS_AUTHENTICATING) {
1989 if (bus_socket_auth_needs_write(bus))
1994 } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
1995 if (bus->rqueue_size <= 0)
1997 if (bus->wqueue_size > 0)
2004 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2005 struct reply_callback *c;
2007 assert_return(bus, -EINVAL);
2008 assert_return(timeout_usec, -EINVAL);
2009 assert_return(BUS_IS_OPEN(bus->state) || bus->state == BUS_CLOSING, -ENOTCONN);
2010 assert_return(!bus_pid_changed(bus), -ECHILD);
2012 if (bus->track_queue) {
2017 if (bus->state == BUS_CLOSING) {
2022 if (bus->state == BUS_AUTHENTICATING) {
2023 *timeout_usec = bus->auth_timeout;
2027 if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
2028 *timeout_usec = (uint64_t) -1;
2032 if (bus->rqueue_size > 0) {
2037 c = prioq_peek(bus->reply_callbacks_prioq);
2039 *timeout_usec = (uint64_t) -1;
2043 *timeout_usec = c->timeout;
2047 static int process_timeout(sd_bus *bus) {
2048 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2049 _cleanup_bus_message_unref_ sd_bus_message* m = NULL;
2050 struct reply_callback *c;
2056 c = prioq_peek(bus->reply_callbacks_prioq);
2060 n = now(CLOCK_MONOTONIC);
2064 r = bus_message_new_synthetic_error(
2067 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2072 m->sender = "org.freedesktop.DBus";
2074 r = bus_seal_synthetic_message(bus, m);
2078 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2079 hashmap_remove(bus->reply_callbacks, &c->cookie);
2082 bus->iteration_counter ++;
2084 r = c->callback(bus, m, c->userdata, &error_buffer);
2085 r = bus_maybe_reply_error(m, r, &error_buffer);
2088 bus->current = NULL;
2093 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2097 if (bus->state != BUS_HELLO)
2100 /* Let's make sure the first message on the bus is the HELLO
2101 * reply. But note that we don't actually parse the message
2102 * here (we leave that to the usual handling), we just verify
2103 * we don't let any earlier msg through. */
2105 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2106 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2109 if (m->reply_cookie != bus->hello_cookie)
2115 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2116 _cleanup_bus_message_unref_ sd_bus_message *synthetic_reply = NULL;
2117 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2118 _cleanup_free_ struct reply_callback *c = NULL;
2124 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2125 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2128 c = hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2132 if (c->timeout != 0)
2133 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2135 if (m->n_fds > 0 && !(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2137 /* If the reply contained a file descriptor which we
2138 * didn't want we pass an error instead. */
2140 r = bus_message_new_synthetic_error(
2143 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2148 r = bus_seal_synthetic_message(bus, synthetic_reply);
2152 m = synthetic_reply;
2154 r = sd_bus_message_rewind(m, true);
2159 r = c->callback(bus, m, c->userdata, &error_buffer);
2160 r = bus_maybe_reply_error(m, r, &error_buffer);
2165 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2166 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2167 struct filter_callback *l;
2174 bus->filter_callbacks_modified = false;
2176 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2178 if (bus->filter_callbacks_modified)
2181 /* Don't run this more than once per iteration */
2182 if (l->last_iteration == bus->iteration_counter)
2185 l->last_iteration = bus->iteration_counter;
2187 r = sd_bus_message_rewind(m, true);
2191 r = l->callback(bus, m, l->userdata, &error_buffer);
2192 r = bus_maybe_reply_error(m, r, &error_buffer);
2198 } while (bus->filter_callbacks_modified);
2203 static int process_match(sd_bus *bus, sd_bus_message *m) {
2210 bus->match_callbacks_modified = false;
2212 r = bus_match_run(bus, &bus->match_callbacks, m);
2216 } while (bus->match_callbacks_modified);
2221 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2222 _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
2228 if (bus->manual_peer_interface)
2231 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2234 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2237 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2240 if (streq_ptr(m->member, "Ping"))
2241 r = sd_bus_message_new_method_return(m, &reply);
2242 else if (streq_ptr(m->member, "GetMachineId")) {
2246 r = sd_id128_get_machine(&id);
2250 r = sd_bus_message_new_method_return(m, &reply);
2254 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2256 r = sd_bus_message_new_method_errorf(
2258 SD_BUS_ERROR_UNKNOWN_METHOD,
2259 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2265 r = sd_bus_send(bus, reply, NULL);
2272 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2276 /* If we got a message with a file descriptor which we didn't
2277 * want to accept, then let's drop it. How can this even
2278 * happen? For example, when the kernel queues a message into
2279 * an activatable names's queue which allows fds, and then is
2280 * delivered to us later even though we ourselves did not
2286 if (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)
2289 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2290 return 1; /* just eat it up */
2292 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2295 static int process_message(sd_bus *bus, sd_bus_message *m) {
2302 bus->iteration_counter++;
2304 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
2305 bus_message_type_to_string(m->header->type),
2306 strna(sd_bus_message_get_sender(m)),
2307 strna(sd_bus_message_get_destination(m)),
2308 strna(sd_bus_message_get_path(m)),
2309 strna(sd_bus_message_get_interface(m)),
2310 strna(sd_bus_message_get_member(m)),
2311 BUS_MESSAGE_COOKIE(m),
2313 strna(m->error.message));
2315 r = process_hello(bus, m);
2319 r = process_reply(bus, m);
2323 r = process_fd_check(bus, m);
2327 r = process_filter(bus, m);
2331 r = process_match(bus, m);
2335 r = process_builtin(bus, m);
2339 r = bus_process_object(bus, m);
2342 bus->current = NULL;
2346 static int dispatch_track(sd_bus *bus) {
2349 if (!bus->track_queue)
2352 bus_track_dispatch(bus->track_queue);
2356 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2357 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2361 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
2363 r = process_timeout(bus);
2367 r = dispatch_wqueue(bus);
2371 r = dispatch_track(bus);
2375 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2381 r = process_message(bus, m);
2386 r = sd_bus_message_rewind(m, true);
2395 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2397 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2398 strna(sd_bus_message_get_sender(m)),
2399 strna(sd_bus_message_get_path(m)),
2400 strna(sd_bus_message_get_interface(m)),
2401 strna(sd_bus_message_get_member(m)));
2403 r = sd_bus_reply_method_errorf(
2405 SD_BUS_ERROR_UNKNOWN_OBJECT,
2406 "Unknown object '%s'.", m->path);
2420 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2421 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2422 struct reply_callback *c;
2426 assert(bus->state == BUS_CLOSING);
2428 c = hashmap_first(bus->reply_callbacks);
2430 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2432 /* First, fail all outstanding method calls */
2433 r = bus_message_new_synthetic_error(
2436 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2441 r = bus_seal_synthetic_message(bus, m);
2445 if (c->timeout != 0)
2446 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2448 hashmap_remove(bus->reply_callbacks, &c->cookie);
2451 bus->iteration_counter++;
2453 r = c->callback(bus, m, c->userdata, &error_buffer);
2454 r = bus_maybe_reply_error(m, r, &error_buffer);
2460 /* Then, synthesize a Disconnected message */
2461 r = sd_bus_message_new_signal(
2464 "/org/freedesktop/DBus/Local",
2465 "org.freedesktop.DBus.Local",
2470 m->sender = "org.freedesktop.DBus.Local";
2472 r = bus_seal_synthetic_message(bus, m);
2479 bus->iteration_counter++;
2481 r = process_filter(bus, m);
2485 r = process_match(bus, m);
2497 bus->current = NULL;
2501 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2502 BUS_DONT_DESTROY(bus);
2505 /* Returns 0 when we didn't do anything. This should cause the
2506 * caller to invoke sd_bus_wait() before returning the next
2507 * time. Returns > 0 when we did something, which possibly
2508 * means *ret is filled in with an unprocessed message. */
2510 assert_return(bus, -EINVAL);
2511 assert_return(!bus_pid_changed(bus), -ECHILD);
2513 /* We don't allow recursively invoking sd_bus_process(). */
2514 assert_return(!bus->current, -EBUSY);
2516 switch (bus->state) {
2525 r = bus_socket_process_opening(bus);
2526 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2527 bus_enter_closing(bus);
2535 case BUS_AUTHENTICATING:
2536 r = bus_socket_process_authenticating(bus);
2537 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2538 bus_enter_closing(bus);
2550 r = process_running(bus, hint_priority, priority, ret);
2551 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2552 bus_enter_closing(bus);
2562 return process_closing(bus, ret);
2565 assert_not_reached("Unknown state");
2568 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2569 return bus_process_internal(bus, false, 0, ret);
2572 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2573 return bus_process_internal(bus, true, priority, ret);
2576 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2577 struct pollfd p[2] = {};
2580 usec_t m = (usec_t) -1;
2584 if (bus->state == BUS_CLOSING)
2587 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
2589 e = sd_bus_get_events(bus);
2594 /* The caller really needs some more data, he doesn't
2595 * care about what's already read, or any timeouts
2600 /* The caller wants to process if there's something to
2601 * process, but doesn't care otherwise */
2603 r = sd_bus_get_timeout(bus, &until);
2608 nw = now(CLOCK_MONOTONIC);
2609 m = until > nw ? until - nw : 0;
2613 if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2616 p[0].fd = bus->input_fd;
2617 if (bus->output_fd == bus->input_fd) {
2621 p[0].events = e & POLLIN;
2622 p[1].fd = bus->output_fd;
2623 p[1].events = e & POLLOUT;
2627 r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
2631 return r > 0 ? 1 : 0;
2634 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2636 assert_return(bus, -EINVAL);
2637 assert_return(!bus_pid_changed(bus), -ECHILD);
2639 if (bus->state == BUS_CLOSING)
2642 assert_return(BUS_IS_OPEN(bus->state) , -ENOTCONN);
2644 if (bus->rqueue_size > 0)
2647 return bus_poll(bus, false, timeout_usec);
2650 _public_ int sd_bus_flush(sd_bus *bus) {
2653 assert_return(bus, -EINVAL);
2654 assert_return(!bus_pid_changed(bus), -ECHILD);
2656 if (bus->state == BUS_CLOSING)
2659 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
2661 r = bus_ensure_running(bus);
2665 if (bus->wqueue_size <= 0)
2669 r = dispatch_wqueue(bus);
2671 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2672 bus_enter_closing(bus);
2679 if (bus->wqueue_size <= 0)
2682 r = bus_poll(bus, false, (uint64_t) -1);
2688 _public_ int sd_bus_add_filter(sd_bus *bus,
2689 sd_bus_message_handler_t callback,
2692 struct filter_callback *f;
2694 assert_return(bus, -EINVAL);
2695 assert_return(callback, -EINVAL);
2696 assert_return(!bus_pid_changed(bus), -ECHILD);
2698 f = new0(struct filter_callback, 1);
2701 f->callback = callback;
2702 f->userdata = userdata;
2704 bus->filter_callbacks_modified = true;
2705 LIST_PREPEND(callbacks, bus->filter_callbacks, f);
2709 _public_ int sd_bus_remove_filter(sd_bus *bus,
2710 sd_bus_message_handler_t callback,
2713 struct filter_callback *f;
2715 assert_return(bus, -EINVAL);
2716 assert_return(callback, -EINVAL);
2717 assert_return(!bus_pid_changed(bus), -ECHILD);
2719 LIST_FOREACH(callbacks, f, bus->filter_callbacks) {
2720 if (f->callback == callback && f->userdata == userdata) {
2721 bus->filter_callbacks_modified = true;
2722 LIST_REMOVE(callbacks, bus->filter_callbacks, f);
2731 _public_ int sd_bus_add_match(sd_bus *bus,
2733 sd_bus_message_handler_t callback,
2736 struct bus_match_component *components = NULL;
2737 unsigned n_components = 0;
2738 uint64_t cookie = 0;
2741 assert_return(bus, -EINVAL);
2742 assert_return(match, -EINVAL);
2743 assert_return(!bus_pid_changed(bus), -ECHILD);
2745 r = bus_match_parse(match, &components, &n_components);
2749 if (bus->bus_client) {
2750 cookie = ++bus->match_cookie;
2752 r = bus_add_match_internal(bus, match, components, n_components, cookie);
2757 bus->match_callbacks_modified = true;
2758 r = bus_match_add(&bus->match_callbacks, components, n_components, callback, userdata, cookie, NULL);
2760 if (bus->bus_client)
2761 bus_remove_match_internal(bus, match, cookie);
2765 bus_match_parse_free(components, n_components);
2769 _public_ int sd_bus_remove_match(sd_bus *bus,
2771 sd_bus_message_handler_t callback,
2774 struct bus_match_component *components = NULL;
2775 unsigned n_components = 0;
2777 uint64_t cookie = 0;
2779 assert_return(bus, -EINVAL);
2780 assert_return(match, -EINVAL);
2781 assert_return(!bus_pid_changed(bus), -ECHILD);
2783 r = bus_match_parse(match, &components, &n_components);
2787 bus->match_callbacks_modified = true;
2788 r = bus_match_remove(&bus->match_callbacks, components, n_components, callback, userdata, &cookie);
2790 if (bus->bus_client)
2791 q = bus_remove_match_internal(bus, match, cookie);
2793 bus_match_parse_free(components, n_components);
2795 return r < 0 ? r : q;
2798 bool bus_pid_changed(sd_bus *bus) {
2801 /* We don't support people creating a bus connection and
2802 * keeping it around over a fork(). Let's complain. */
2804 return bus->original_pid != getpid();
2807 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
2808 sd_bus *bus = userdata;
2813 r = sd_bus_process(bus, NULL);
2820 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
2821 sd_bus *bus = userdata;
2826 r = sd_bus_process(bus, NULL);
2833 static int prepare_callback(sd_event_source *s, void *userdata) {
2834 sd_bus *bus = userdata;
2841 e = sd_bus_get_events(bus);
2845 if (bus->output_fd != bus->input_fd) {
2847 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
2851 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
2855 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
2860 r = sd_bus_get_timeout(bus, &until);
2866 j = sd_event_source_set_time(bus->time_event_source, until);
2871 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
2878 static int quit_callback(sd_event_source *event, void *userdata) {
2879 sd_bus *bus = userdata;
2888 static int attach_io_events(sd_bus *bus) {
2893 if (bus->input_fd < 0)
2899 if (!bus->input_io_event_source) {
2900 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
2904 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
2908 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
2910 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
2915 if (bus->output_fd != bus->input_fd) {
2916 assert(bus->output_fd >= 0);
2918 if (!bus->output_io_event_source) {
2919 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
2923 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
2925 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
2934 static void detach_io_events(sd_bus *bus) {
2937 if (bus->input_io_event_source) {
2938 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
2939 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
2942 if (bus->output_io_event_source) {
2943 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
2944 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
2948 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
2951 assert_return(bus, -EINVAL);
2952 assert_return(!bus->event, -EBUSY);
2954 assert(!bus->input_io_event_source);
2955 assert(!bus->output_io_event_source);
2956 assert(!bus->time_event_source);
2959 bus->event = sd_event_ref(event);
2961 r = sd_event_default(&bus->event);
2966 bus->event_priority = priority;
2968 r = sd_event_add_monotonic(bus->event, &bus->time_event_source, 0, 0, time_callback, bus);
2972 r = sd_event_source_set_priority(bus->time_event_source, priority);
2976 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
2980 r = attach_io_events(bus);
2987 sd_bus_detach_event(bus);
2991 _public_ int sd_bus_detach_event(sd_bus *bus) {
2992 assert_return(bus, -EINVAL);
2997 detach_io_events(bus);
2999 if (bus->time_event_source) {
3000 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3001 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3004 if (bus->quit_event_source) {
3005 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3006 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3010 bus->event = sd_event_unref(bus->event);
3015 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3016 assert_return(bus, NULL);
3021 _public_ sd_bus_message* sd_bus_get_current(sd_bus *bus) {
3022 assert_return(bus, NULL);
3024 return bus->current;
3027 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3032 assert(default_bus);
3035 return !!*default_bus;
3038 *ret = sd_bus_ref(*default_bus);
3046 b->default_bus_ptr = default_bus;
3054 _public_ int sd_bus_default_system(sd_bus **ret) {
3055 static thread_local sd_bus *default_system_bus = NULL;
3057 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3060 _public_ int sd_bus_default_user(sd_bus **ret) {
3061 static thread_local sd_bus *default_user_bus = NULL;
3063 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3066 _public_ int sd_bus_default(sd_bus **ret) {
3070 /* Let's try our best to reuse another cached connection. If
3071 * the starter bus type is set, connect via our normal
3072 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3073 * we can share the connection with the user/system default
3076 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3078 if (streq(e, "system"))
3079 return sd_bus_default_system(ret);
3080 else if (streq(e, "user") || streq(e, "session"))
3081 return sd_bus_default_user(ret);
3084 /* No type is specified, so we have not other option than to
3085 * use the starter address if it is set. */
3087 e = secure_getenv("DBUS_STARTER_ADDRESS");
3089 static thread_local sd_bus *default_starter_bus = NULL;
3091 return bus_default(sd_bus_open, &default_starter_bus, ret);
3094 /* Finally, if nothing is set use the cached connection for
3095 * the right scope */
3097 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3098 return sd_bus_default_user(ret);
3100 return sd_bus_default_system(ret);
3103 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3104 assert_return(b, -EINVAL);
3105 assert_return(tid, -EINVAL);
3106 assert_return(!bus_pid_changed(b), -ECHILD);
3114 return sd_event_get_tid(b->event, tid);
3119 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3120 _cleanup_free_ char *e = NULL;
3123 assert_return(object_path_is_valid(prefix), -EINVAL);
3124 assert_return(external_id, -EINVAL);
3125 assert_return(ret_path, -EINVAL);
3127 e = bus_label_escape(external_id);
3131 ret = strjoin(prefix, "/", e, NULL);
3139 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3143 assert_return(object_path_is_valid(path), -EINVAL);
3144 assert_return(object_path_is_valid(prefix), -EINVAL);
3145 assert_return(external_id, -EINVAL);
3147 e = object_path_startswith(path, prefix);
3149 *external_id = NULL;
3153 ret = bus_label_unescape(e);
3161 _public_ int sd_bus_get_peer_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **ret) {
3166 assert_return(bus, -EINVAL);
3167 assert_return(mask <= _SD_BUS_CREDS_ALL, -ENOTSUP);
3168 assert_return(ret, -EINVAL);
3169 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
3170 assert_return(!bus_pid_changed(bus), -ECHILD);
3171 assert_return(!bus->is_kernel, -ENOTSUP);
3173 if (!bus->ucred_valid && !isempty(bus->label))
3176 c = bus_creds_new();
3180 if (bus->ucred_valid) {
3181 pid = c->pid = bus->ucred.pid;
3182 c->uid = bus->ucred.uid;
3183 c->gid = bus->ucred.gid;
3185 c->mask |= (SD_BUS_CREDS_UID | SD_BUS_CREDS_PID | SD_BUS_CREDS_GID) & mask;
3188 if (!isempty(bus->label) && (mask & SD_BUS_CREDS_SELINUX_CONTEXT)) {
3189 c->label = strdup(bus->label);
3191 sd_bus_creds_unref(c);
3195 c->mask |= SD_BUS_CREDS_SELINUX_CONTEXT;
3198 r = bus_creds_add_more(c, mask, pid, 0);
3206 _public_ int sd_bus_try_close(sd_bus *bus) {
3209 assert_return(bus, -EINVAL);
3210 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
3211 assert_return(!bus_pid_changed(bus), -ECHILD);
3212 assert_return(bus->is_kernel, -ENOTSUP);
3214 if (bus->rqueue_size > 0)
3217 if (bus->wqueue_size > 0)
3220 r = bus_kernel_try_close(bus);
3228 _public_ int sd_bus_get_name(sd_bus *bus, const char **name) {
3229 assert_return(bus, -EINVAL);
3230 assert_return(name, -EINVAL);
3231 assert_return(!bus_pid_changed(bus), -ECHILD);
3233 *name = bus->connection_name;