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"
41 #include "bus-internal.h"
42 #include "bus-message.h"
44 #include "bus-socket.h"
45 #include "bus-kernel.h"
46 #include "bus-control.h"
47 #include "bus-introspect.h"
48 #include "bus-signature.h"
49 #include "bus-objects.h"
51 #include "bus-container.h"
52 #include "bus-protocol.h"
54 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
55 static int attach_io_events(sd_bus *b);
56 static void detach_io_events(sd_bus *b);
58 static void bus_close_fds(sd_bus *b) {
64 close_nointr_nofail(b->input_fd);
66 if (b->output_fd >= 0 && b->output_fd != b->input_fd)
67 close_nointr_nofail(b->output_fd);
69 b->input_fd = b->output_fd = -1;
72 static void bus_node_destroy(sd_bus *b, struct node *n) {
73 struct node_callback *c;
74 struct node_vtable *v;
75 struct node_enumerator *e;
83 bus_node_destroy(b, n->child);
85 while ((c = n->callbacks)) {
86 LIST_REMOVE(callbacks, n->callbacks, c);
90 while ((v = n->vtables)) {
91 LIST_REMOVE(vtables, n->vtables, v);
96 while ((e = n->enumerators)) {
97 LIST_REMOVE(enumerators, n->enumerators, e);
102 LIST_REMOVE(siblings, n->parent->child, n);
104 assert_se(hashmap_remove(b->nodes, n->path) == n);
109 static void bus_reset_queues(sd_bus *b) {
112 while (b->rqueue_size > 0)
113 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
117 b->rqueue_allocated = 0;
119 while (b->wqueue_size > 0)
120 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
124 b->wqueue_allocated = 0;
127 static void bus_free(sd_bus *b) {
128 struct filter_callback *f;
133 sd_bus_detach_event(b);
135 if (b->default_bus_ptr)
136 *b->default_bus_ptr = NULL;
141 munmap(b->kdbus_buffer, KDBUS_POOL_SIZE);
144 free(b->unique_name);
145 free(b->auth_buffer);
150 free(b->cgroup_root);
151 free(b->connection_name);
154 strv_free(b->exec_argv);
156 close_many(b->fds, b->n_fds);
161 hashmap_free_free(b->reply_callbacks);
162 prioq_free(b->reply_callbacks_prioq);
164 while ((f = b->filter_callbacks)) {
165 LIST_REMOVE(callbacks, b->filter_callbacks, f);
169 bus_match_free(&b->match_callbacks);
171 hashmap_free_free(b->vtable_methods);
172 hashmap_free_free(b->vtable_properties);
174 while ((n = hashmap_first(b->nodes)))
175 bus_node_destroy(b, n);
177 hashmap_free(b->nodes);
179 bus_kernel_flush_memfd(b);
181 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
186 _public_ int sd_bus_new(sd_bus **ret) {
189 assert_return(ret, -EINVAL);
195 r->n_ref = REFCNT_INIT;
196 r->input_fd = r->output_fd = -1;
197 r->message_version = 1;
198 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
199 r->hello_flags |= KDBUS_HELLO_ACCEPT_FD;
200 r->attach_flags |= KDBUS_ATTACH_NAMES;
201 r->original_pid = getpid();
203 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
205 /* We guarantee that wqueue always has space for at least one
207 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
216 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
219 assert_return(bus, -EINVAL);
220 assert_return(bus->state == BUS_UNSET, -EPERM);
221 assert_return(address, -EINVAL);
222 assert_return(!bus_pid_changed(bus), -ECHILD);
234 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
235 assert_return(bus, -EINVAL);
236 assert_return(bus->state == BUS_UNSET, -EPERM);
237 assert_return(input_fd >= 0, -EINVAL);
238 assert_return(output_fd >= 0, -EINVAL);
239 assert_return(!bus_pid_changed(bus), -ECHILD);
241 bus->input_fd = input_fd;
242 bus->output_fd = output_fd;
246 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
249 assert_return(bus, -EINVAL);
250 assert_return(bus->state == BUS_UNSET, -EPERM);
251 assert_return(path, -EINVAL);
252 assert_return(!strv_isempty(argv), -EINVAL);
253 assert_return(!bus_pid_changed(bus), -ECHILD);
265 free(bus->exec_path);
266 strv_free(bus->exec_argv);
274 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
275 assert_return(bus, -EINVAL);
276 assert_return(bus->state == BUS_UNSET, -EPERM);
277 assert_return(!bus_pid_changed(bus), -ECHILD);
279 bus->bus_client = !!b;
283 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
284 assert_return(bus, -EINVAL);
285 assert_return(bus->state == BUS_UNSET, -EPERM);
286 assert_return(!bus_pid_changed(bus), -ECHILD);
288 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ACCEPT_FD, b);
292 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
293 assert_return(bus, -EINVAL);
294 assert_return(bus->state == BUS_UNSET, -EPERM);
295 assert_return(!bus_pid_changed(bus), -ECHILD);
297 SET_FLAG(bus->attach_flags, KDBUS_ATTACH_TIMESTAMP, b);
301 _public_ int sd_bus_negotiate_creds(sd_bus *bus, uint64_t mask) {
302 assert_return(bus, -EINVAL);
303 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
304 assert_return(bus->state == BUS_UNSET, -EPERM);
305 assert_return(!bus_pid_changed(bus), -ECHILD);
307 /* The well knowns we need unconditionally, so that matches can work */
308 bus->creds_mask = mask | SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
310 return kdbus_translate_attach_flags(bus->creds_mask, &bus->creds_mask);
313 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
314 assert_return(bus, -EINVAL);
315 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
316 assert_return(bus->state == BUS_UNSET, -EPERM);
317 assert_return(!bus_pid_changed(bus), -ECHILD);
319 bus->is_server = !!b;
320 bus->server_id = server_id;
324 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
325 assert_return(bus, -EINVAL);
326 assert_return(bus->state == BUS_UNSET, -EPERM);
327 assert_return(!bus_pid_changed(bus), -ECHILD);
329 bus->anonymous_auth = !!b;
333 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
334 assert_return(bus, -EINVAL);
335 assert_return(bus->state == BUS_UNSET, -EPERM);
336 assert_return(!bus_pid_changed(bus), -ECHILD);
342 _public_ int sd_bus_set_name(sd_bus *bus, const char *name) {
345 assert_return(bus, -EINVAL);
346 assert_return(name, -EINVAL);
347 assert_return(bus->state == BUS_UNSET, -EPERM);
348 assert_return(!bus_pid_changed(bus), -ECHILD);
354 free(bus->connection_name);
355 bus->connection_name = n;
360 static int hello_callback(sd_bus *bus, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
365 assert(bus->state == BUS_HELLO || bus->state == BUS_CLOSING);
368 r = sd_bus_message_get_errno(reply);
374 r = sd_bus_message_read(reply, "s", &s);
378 if (!service_name_is_valid(s) || s[0] != ':')
381 bus->unique_name = strdup(s);
382 if (!bus->unique_name)
385 if (bus->state == BUS_HELLO)
386 bus->state = BUS_RUNNING;
391 static int bus_send_hello(sd_bus *bus) {
392 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
397 if (!bus->bus_client || bus->is_kernel)
400 r = sd_bus_message_new_method_call(
402 "org.freedesktop.DBus",
403 "/org/freedesktop/DBus",
404 "org.freedesktop.DBus",
410 return sd_bus_call_async(bus, m, hello_callback, NULL, 0, &bus->hello_cookie);
413 int bus_start_running(sd_bus *bus) {
416 if (bus->bus_client && !bus->is_kernel) {
417 bus->state = BUS_HELLO;
421 bus->state = BUS_RUNNING;
425 static int parse_address_key(const char **p, const char *key, char **value) {
426 size_t l, n = 0, allocated = 0;
436 if (strncmp(*p, key, l) != 0)
449 while (*a != ';' && *a != ',' && *a != 0) {
467 c = (char) ((x << 4) | y);
474 if (!GREEDY_REALLOC(r, allocated, n + 2))
498 static void skip_address_key(const char **p) {
502 *p += strcspn(*p, ",");
508 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
509 _cleanup_free_ char *path = NULL, *abstract = NULL;
518 while (**p != 0 && **p != ';') {
519 r = parse_address_key(p, "guid", guid);
525 r = parse_address_key(p, "path", &path);
531 r = parse_address_key(p, "abstract", &abstract);
540 if (!path && !abstract)
543 if (path && abstract)
548 if (l > sizeof(b->sockaddr.un.sun_path))
551 b->sockaddr.un.sun_family = AF_UNIX;
552 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
553 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
554 } else if (abstract) {
555 l = strlen(abstract);
556 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
559 b->sockaddr.un.sun_family = AF_UNIX;
560 b->sockaddr.un.sun_path[0] = 0;
561 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
562 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
568 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
569 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
571 struct addrinfo *result, hints = {
572 .ai_socktype = SOCK_STREAM,
573 .ai_flags = AI_ADDRCONFIG,
581 while (**p != 0 && **p != ';') {
582 r = parse_address_key(p, "guid", guid);
588 r = parse_address_key(p, "host", &host);
594 r = parse_address_key(p, "port", &port);
600 r = parse_address_key(p, "family", &family);
613 if (streq(family, "ipv4"))
614 hints.ai_family = AF_INET;
615 else if (streq(family, "ipv6"))
616 hints.ai_family = AF_INET6;
621 r = getaddrinfo(host, port, &hints, &result);
625 return -EADDRNOTAVAIL;
627 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
628 b->sockaddr_size = result->ai_addrlen;
630 freeaddrinfo(result);
635 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
637 unsigned n_argv = 0, j;
639 size_t allocated = 0;
647 while (**p != 0 && **p != ';') {
648 r = parse_address_key(p, "guid", guid);
654 r = parse_address_key(p, "path", &path);
660 if (startswith(*p, "argv")) {
664 ul = strtoul(*p + 4, (char**) p, 10);
665 if (errno > 0 || **p != '=' || ul > 256) {
673 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
681 r = parse_address_key(p, NULL, argv + ul);
696 /* Make sure there are no holes in the array, with the
697 * exception of argv[0] */
698 for (j = 1; j < n_argv; j++)
704 if (argv && argv[0] == NULL) {
705 argv[0] = strdup(path);
717 for (j = 0; j < n_argv; j++)
725 static int parse_kernel_address(sd_bus *b, const char **p, char **guid) {
726 _cleanup_free_ char *path = NULL;
734 while (**p != 0 && **p != ';') {
735 r = parse_address_key(p, "guid", guid);
741 r = parse_address_key(p, "path", &path);
760 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
761 _cleanup_free_ char *machine = NULL;
769 while (**p != 0 && **p != ';') {
770 r = parse_address_key(p, "guid", guid);
776 r = parse_address_key(p, "machine", &machine);
788 if (!filename_is_safe(machine))
792 b->machine = machine;
795 b->sockaddr.un.sun_family = AF_UNIX;
796 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
797 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + sizeof("/var/run/dbus/system_bus_socket") - 1;
802 static int parse_container_kernel_address(sd_bus *b, const char **p, char **guid) {
803 _cleanup_free_ char *machine = NULL;
811 while (**p != 0 && **p != ';') {
812 r = parse_address_key(p, "guid", guid);
818 r = parse_address_key(p, "machine", &machine);
830 if (!filename_is_safe(machine))
834 b->machine = machine;
838 b->kernel = strdup("/dev/kdbus/0-system/bus");
845 static void bus_reset_parsed_address(sd_bus *b) {
849 b->sockaddr_size = 0;
850 strv_free(b->exec_argv);
854 b->server_id = SD_ID128_NULL;
861 static int bus_parse_next_address(sd_bus *b) {
862 _cleanup_free_ char *guid = NULL;
870 if (b->address[b->address_index] == 0)
873 bus_reset_parsed_address(b);
875 a = b->address + b->address_index;
884 if (startswith(a, "unix:")) {
887 r = parse_unix_address(b, &a, &guid);
892 } else if (startswith(a, "tcp:")) {
895 r = parse_tcp_address(b, &a, &guid);
901 } else if (startswith(a, "unixexec:")) {
904 r = parse_exec_address(b, &a, &guid);
910 } else if (startswith(a, "kernel:")) {
913 r = parse_kernel_address(b, &a, &guid);
918 } else if (startswith(a, "x-container-unix:")) {
921 r = parse_container_unix_address(b, &a, &guid);
926 } else if (startswith(a, "x-container-kernel:")) {
929 r = parse_container_kernel_address(b, &a, &guid);
942 r = sd_id128_from_string(guid, &b->server_id);
947 b->address_index = a - b->address;
951 static int bus_start_address(sd_bus *b) {
957 bool skipped = false;
962 r = bus_socket_exec(b);
963 else if (b->machine && b->kernel)
964 r = bus_container_connect_kernel(b);
965 else if (b->machine && b->sockaddr.sa.sa_family != AF_UNSPEC)
966 r = bus_container_connect_socket(b);
968 r = bus_kernel_connect(b);
969 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
970 r = bus_socket_connect(b);
976 r = attach_io_events(b);
981 b->last_connect_error = -r;
984 r = bus_parse_next_address(b);
988 return b->last_connect_error ? -b->last_connect_error : -ECONNREFUSED;
992 int bus_next_address(sd_bus *b) {
995 bus_reset_parsed_address(b);
996 return bus_start_address(b);
999 static int bus_start_fd(sd_bus *b) {
1004 assert(b->input_fd >= 0);
1005 assert(b->output_fd >= 0);
1007 r = fd_nonblock(b->input_fd, true);
1011 r = fd_cloexec(b->input_fd, true);
1015 if (b->input_fd != b->output_fd) {
1016 r = fd_nonblock(b->output_fd, true);
1020 r = fd_cloexec(b->output_fd, true);
1025 if (fstat(b->input_fd, &st) < 0)
1028 if (S_ISCHR(b->input_fd))
1029 return bus_kernel_take_fd(b);
1031 return bus_socket_take_fd(b);
1034 _public_ int sd_bus_start(sd_bus *bus) {
1037 assert_return(bus, -EINVAL);
1038 assert_return(bus->state == BUS_UNSET, -EPERM);
1039 assert_return(!bus_pid_changed(bus), -ECHILD);
1041 bus->state = BUS_OPENING;
1043 if (bus->is_server && bus->bus_client)
1046 if (bus->input_fd >= 0)
1047 r = bus_start_fd(bus);
1048 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->kernel || bus->machine)
1049 r = bus_start_address(bus);
1056 return bus_send_hello(bus);
1059 _public_ int sd_bus_open(sd_bus **ret) {
1064 assert_return(ret, -EINVAL);
1066 /* Let's connect to the starter bus if it is set, and
1067 * otherwise to the bus that is appropropriate for the scope
1068 * we are running in */
1070 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1072 if (streq(e, "system"))
1073 return sd_bus_open_system(ret);
1074 else if (streq(e, "session") || streq(e, "user"))
1075 return sd_bus_open_user(ret);
1078 e = secure_getenv("DBUS_STARTER_ADDRESS");
1080 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1081 return sd_bus_open_user(ret);
1083 return sd_bus_open_system(ret);
1090 r = sd_bus_set_address(b, e);
1094 b->bus_client = true;
1096 /* We don't know whether the bus is trusted or not, so better
1097 * be safe, and authenticate everything */
1099 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1101 r = sd_bus_start(b);
1113 _public_ int sd_bus_open_system(sd_bus **ret) {
1118 assert_return(ret, -EINVAL);
1124 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1126 r = sd_bus_set_address(b, e);
1128 r = sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_PATH);
1132 b->bus_client = true;
1133 b->is_system = true;
1135 /* Let's do per-method access control on the system bus. We
1136 * need the caller's UID and capability set for that. */
1138 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1140 r = sd_bus_start(b);
1152 _public_ int sd_bus_open_user(sd_bus **ret) {
1157 assert_return(ret, -EINVAL);
1163 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1165 r = sd_bus_set_address(b, e);
1169 e = secure_getenv("XDG_RUNTIME_DIR");
1171 _cleanup_free_ char *ee = NULL;
1173 ee = bus_address_escape(e);
1180 asprintf(&b->address, KERNEL_USER_BUS_FMT ";" UNIX_USER_BUS_FMT, (unsigned long) getuid(), ee);
1182 asprintf(&b->address, UNIX_USER_BUS_FMT, ee);
1186 asprintf(&b->address, KERNEL_USER_BUS_FMT, (unsigned long) getuid());
1188 return -ECONNREFUSED;
1198 b->bus_client = true;
1201 /* We don't do any per-method access control on the user
1205 r = sd_bus_start(b);
1217 _public_ int sd_bus_open_system_remote(const char *host, sd_bus **ret) {
1218 _cleanup_free_ char *e = NULL;
1223 assert_return(host, -EINVAL);
1224 assert_return(ret, -EINVAL);
1226 e = bus_address_escape(host);
1230 p = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", NULL);
1234 r = sd_bus_new(&bus);
1241 bus->bus_client = true;
1243 r = sd_bus_start(bus);
1253 _public_ int sd_bus_open_system_container(const char *machine, sd_bus **ret) {
1254 _cleanup_free_ char *e = NULL;
1259 assert_return(machine, -EINVAL);
1260 assert_return(ret, -EINVAL);
1261 assert_return(filename_is_safe(machine), -EINVAL);
1263 e = bus_address_escape(machine);
1268 p = strjoin("x-container-kernel:machine=", e, ";x-container-unix:machine=", e, NULL);
1270 p = strjoin("x-container-unix:machine=", e, NULL);
1275 r = sd_bus_new(&bus);
1282 bus->bus_client = true;
1284 r = sd_bus_start(bus);
1294 _public_ void sd_bus_close(sd_bus *bus) {
1298 if (bus->state == BUS_CLOSED)
1300 if (bus_pid_changed(bus))
1303 bus->state = BUS_CLOSED;
1305 sd_bus_detach_event(bus);
1307 /* Drop all queued messages so that they drop references to
1308 * the bus object and the bus may be freed */
1309 bus_reset_queues(bus);
1311 if (!bus->is_kernel)
1314 /* We'll leave the fd open in case this is a kernel bus, since
1315 * there might still be memblocks around that reference this
1316 * bus, and they might need to invoke the KDBUS_CMD_FREE
1317 * ioctl on the fd when they are freed. */
1320 static void bus_enter_closing(sd_bus *bus) {
1323 if (bus->state != BUS_OPENING &&
1324 bus->state != BUS_AUTHENTICATING &&
1325 bus->state != BUS_HELLO &&
1326 bus->state != BUS_RUNNING)
1329 bus->state = BUS_CLOSING;
1332 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1333 assert_return(bus, NULL);
1335 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1340 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1346 if (REFCNT_GET(bus->n_ref) == bus->rqueue_size + bus->wqueue_size + 1) {
1349 for (i = 0; i < bus->rqueue_size; i++)
1350 if (bus->rqueue[i]->n_ref > 1) {
1356 for (i = 0; i < bus->wqueue_size; i++)
1357 if (bus->wqueue[i]->n_ref > 1) {
1363 /* We are the only holders on the messages, and the
1364 * messages are the only holders on us, so let's drop
1365 * the messages and thus implicitly also kill our own
1366 * last references */
1368 bus_reset_queues(bus);
1371 i = REFCNT_DEC(bus->n_ref);
1379 _public_ int sd_bus_is_open(sd_bus *bus) {
1381 assert_return(bus, -EINVAL);
1382 assert_return(!bus_pid_changed(bus), -ECHILD);
1384 return BUS_IS_OPEN(bus->state);
1387 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1390 assert_return(bus, -EINVAL);
1391 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1392 assert_return(!bus_pid_changed(bus), -ECHILD);
1394 if (type == SD_BUS_TYPE_UNIX_FD) {
1395 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
1398 r = bus_ensure_running(bus);
1402 return bus->can_fds;
1405 return bus_type_is_valid(type);
1408 _public_ int sd_bus_get_server_id(sd_bus *bus, sd_id128_t *server_id) {
1411 assert_return(bus, -EINVAL);
1412 assert_return(server_id, -EINVAL);
1413 assert_return(!bus_pid_changed(bus), -ECHILD);
1415 r = bus_ensure_running(bus);
1419 *server_id = bus->server_id;
1423 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1428 /* If we copy the same message to multiple
1429 * destinations, avoid using the same cookie
1431 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1436 timeout = BUS_DEFAULT_TIMEOUT;
1438 return bus_message_seal(m, ++b->cookie, timeout);
1441 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1444 /* Do packet version and endianess already match? */
1445 if ((b->message_version == 0 || b->message_version == (*m)->header->version) &&
1446 (b->message_endian == 0 || b->message_endian == (*m)->header->endian))
1449 /* No? Then remarshal! */
1450 return bus_message_remarshal(b, m);
1453 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1457 /* The bus specification says the serial number cannot be 0,
1458 * hence let's fill something in for synthetic messages. Since
1459 * synthetic messages might have a fake sender and we don't
1460 * want to interfere with the real sender's serial numbers we
1461 * pick a fixed, artifical one. We use (uint32_t) -1 rather
1462 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1463 * even though kdbus can do 64bit. */
1465 return bus_message_seal(m, 0xFFFFFFFFULL, 0);
1468 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1475 r = bus_kernel_write_message(bus, m, hint_sync_call);
1477 r = bus_socket_write_message(bus, m, idx);
1482 if (bus->is_kernel || *idx >= BUS_MESSAGE_SIZE(m))
1483 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%lu reply_cookie=%lu error=%s",
1484 bus_message_type_to_string(m->header->type),
1485 strna(sd_bus_message_get_sender(m)),
1486 strna(sd_bus_message_get_destination(m)),
1487 strna(sd_bus_message_get_path(m)),
1488 strna(sd_bus_message_get_interface(m)),
1489 strna(sd_bus_message_get_member(m)),
1490 (unsigned long) BUS_MESSAGE_COOKIE(m),
1491 (unsigned long) m->reply_cookie,
1492 strna(m->error.message));
1497 static int dispatch_wqueue(sd_bus *bus) {
1501 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1503 while (bus->wqueue_size > 0) {
1505 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1509 /* Didn't do anything this time */
1511 else if (bus->is_kernel || bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1512 /* Fully written. Let's drop the entry from
1515 * This isn't particularly optimized, but
1516 * well, this is supposed to be our worst-case
1517 * buffer only, and the socket buffer is
1518 * supposed to be our primary buffer, and if
1519 * it got full, then all bets are off
1522 bus->wqueue_size --;
1523 sd_bus_message_unref(bus->wqueue[0]);
1524 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1534 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1538 return bus_kernel_read_message(bus, hint_priority, priority);
1540 return bus_socket_read_message(bus);
1543 int bus_rqueue_make_room(sd_bus *bus) {
1546 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1549 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1555 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1560 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1562 /* Note that the priority logic is only available on kdbus,
1563 * where the rqueue is unused. We check the rqueue here
1564 * anyway, because it's simple... */
1567 if (bus->rqueue_size > 0) {
1568 /* Dispatch a queued message */
1570 *m = bus->rqueue[0];
1571 bus->rqueue_size --;
1572 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1576 /* Try to read a new message */
1577 r = bus_read_message(bus, hint_priority, priority);
1587 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1588 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1591 assert_return(bus, -EINVAL);
1592 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1593 assert_return(m, -EINVAL);
1594 assert_return(!bus_pid_changed(bus), -ECHILD);
1597 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1604 /* If the cookie number isn't kept, then we know that no reply
1606 if (!cookie && !m->sealed)
1607 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1609 r = bus_seal_message(bus, m, 0);
1613 /* Remarshall if we have to. This will possibly unref the
1614 * message and place a replacement in m */
1615 r = bus_remarshal_message(bus, &m);
1619 /* If this is a reply and no reply was requested, then let's
1620 * suppress this, if we can */
1621 if (m->dont_send && !cookie)
1624 if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
1627 r = bus_write_message(bus, m, hint_sync_call, &idx);
1629 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1630 bus_enter_closing(bus);
1635 } else if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m)) {
1636 /* Wasn't fully written. So let's remember how
1637 * much was written. Note that the first entry
1638 * of the wqueue array is always allocated so
1639 * that we always can remember how much was
1641 bus->wqueue[0] = sd_bus_message_ref(m);
1642 bus->wqueue_size = 1;
1646 /* Just append it to the queue. */
1648 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1651 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1654 bus->wqueue[bus->wqueue_size ++] = sd_bus_message_ref(m);
1658 *cookie = BUS_MESSAGE_COOKIE(m);
1663 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1664 return bus_send_internal(bus, m, cookie, false);
1667 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1670 assert_return(bus, -EINVAL);
1671 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1672 assert_return(m, -EINVAL);
1673 assert_return(!bus_pid_changed(bus), -ECHILD);
1675 if (!streq_ptr(m->destination, destination)) {
1680 r = sd_bus_message_set_destination(m, destination);
1685 return sd_bus_send(bus, m, cookie);
1688 static usec_t calc_elapse(uint64_t usec) {
1689 if (usec == (uint64_t) -1)
1692 return now(CLOCK_MONOTONIC) + usec;
1695 static int timeout_compare(const void *a, const void *b) {
1696 const struct reply_callback *x = a, *y = b;
1698 if (x->timeout != 0 && y->timeout == 0)
1701 if (x->timeout == 0 && y->timeout != 0)
1704 if (x->timeout < y->timeout)
1707 if (x->timeout > y->timeout)
1713 _public_ int sd_bus_call_async(
1716 sd_bus_message_handler_t callback,
1721 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1722 struct reply_callback *c;
1725 assert_return(bus, -EINVAL);
1726 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1727 assert_return(m, -EINVAL);
1728 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1729 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1730 assert_return(callback, -EINVAL);
1731 assert_return(!bus_pid_changed(bus), -ECHILD);
1733 r = hashmap_ensure_allocated(&bus->reply_callbacks, uint64_hash_func, uint64_compare_func);
1737 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1741 r = bus_seal_message(bus, m, usec);
1745 r = bus_remarshal_message(bus, &m);
1749 c = new0(struct reply_callback, 1);
1753 c->callback = callback;
1754 c->userdata = userdata;
1755 c->cookie = BUS_MESSAGE_COOKIE(m);
1756 c->timeout = calc_elapse(m->timeout);
1758 r = hashmap_put(bus->reply_callbacks, &c->cookie, c);
1764 if (c->timeout != 0) {
1765 r = prioq_put(bus->reply_callbacks_prioq, c, &c->prioq_idx);
1768 sd_bus_call_async_cancel(bus, c->cookie);
1773 r = sd_bus_send(bus, m, cookie);
1775 sd_bus_call_async_cancel(bus, c->cookie);
1782 _public_ int sd_bus_call_async_cancel(sd_bus *bus, uint64_t cookie) {
1783 struct reply_callback *c;
1785 assert_return(bus, -EINVAL);
1786 assert_return(cookie != 0, -EINVAL);
1787 assert_return(!bus_pid_changed(bus), -ECHILD);
1789 c = hashmap_remove(bus->reply_callbacks, &cookie);
1793 if (c->timeout != 0)
1794 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
1800 int bus_ensure_running(sd_bus *bus) {
1805 if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED || bus->state == BUS_CLOSING)
1807 if (bus->state == BUS_RUNNING)
1811 r = sd_bus_process(bus, NULL);
1814 if (bus->state == BUS_RUNNING)
1819 r = sd_bus_wait(bus, (uint64_t) -1);
1825 _public_ int sd_bus_call(
1829 sd_bus_error *error,
1830 sd_bus_message **reply) {
1832 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1838 assert_return(bus, -EINVAL);
1839 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1840 assert_return(m, -EINVAL);
1841 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1842 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1843 assert_return(!bus_error_is_dirty(error), -EINVAL);
1844 assert_return(!bus_pid_changed(bus), -ECHILD);
1846 r = bus_ensure_running(bus);
1850 i = bus->rqueue_size;
1852 r = bus_seal_message(bus, m, usec);
1856 r = bus_remarshal_message(bus, &m);
1860 r = bus_send_internal(bus, m, &cookie, true);
1864 timeout = calc_elapse(m->timeout);
1869 while (i < bus->rqueue_size) {
1870 sd_bus_message *incoming = NULL;
1872 incoming = bus->rqueue[i];
1874 if (incoming->reply_cookie == cookie) {
1875 /* Found a match! */
1877 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1880 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
1885 sd_bus_message_unref(incoming);
1888 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR)
1889 r = sd_bus_error_copy(error, &incoming->error);
1893 sd_bus_message_unref(incoming);
1896 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
1899 streq(bus->unique_name, incoming->sender)) {
1901 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1904 /* Our own message? Somebody is trying
1905 * to send its own client a message,
1906 * let's not dead-lock, let's fail
1909 sd_bus_message_unref(incoming);
1913 /* Try to read more, right-away */
1917 r = bus_read_message(bus, false, 0);
1919 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1920 bus_enter_closing(bus);
1932 n = now(CLOCK_MONOTONIC);
1938 left = (uint64_t) -1;
1940 r = bus_poll(bus, true, left);
1946 r = dispatch_wqueue(bus);
1948 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1949 bus_enter_closing(bus);
1958 _public_ int sd_bus_get_fd(sd_bus *bus) {
1960 assert_return(bus, -EINVAL);
1961 assert_return(bus->input_fd == bus->output_fd, -EPERM);
1962 assert_return(!bus_pid_changed(bus), -ECHILD);
1964 return bus->input_fd;
1967 _public_ int sd_bus_get_events(sd_bus *bus) {
1970 assert_return(bus, -EINVAL);
1971 assert_return(BUS_IS_OPEN(bus->state) || bus->state == BUS_CLOSING, -ENOTCONN);
1972 assert_return(!bus_pid_changed(bus), -ECHILD);
1974 if (bus->state == BUS_OPENING)
1976 else if (bus->state == BUS_AUTHENTICATING) {
1978 if (bus_socket_auth_needs_write(bus))
1983 } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
1984 if (bus->rqueue_size <= 0)
1986 if (bus->wqueue_size > 0)
1993 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
1994 struct reply_callback *c;
1996 assert_return(bus, -EINVAL);
1997 assert_return(timeout_usec, -EINVAL);
1998 assert_return(BUS_IS_OPEN(bus->state) || bus->state == BUS_CLOSING, -ENOTCONN);
1999 assert_return(!bus_pid_changed(bus), -ECHILD);
2001 if (bus->state == BUS_CLOSING) {
2006 if (bus->state == BUS_AUTHENTICATING) {
2007 *timeout_usec = bus->auth_timeout;
2011 if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
2012 *timeout_usec = (uint64_t) -1;
2016 if (bus->rqueue_size > 0) {
2021 c = prioq_peek(bus->reply_callbacks_prioq);
2023 *timeout_usec = (uint64_t) -1;
2027 *timeout_usec = c->timeout;
2031 static int process_timeout(sd_bus *bus) {
2032 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2033 _cleanup_bus_message_unref_ sd_bus_message* m = NULL;
2034 struct reply_callback *c;
2040 c = prioq_peek(bus->reply_callbacks_prioq);
2044 n = now(CLOCK_MONOTONIC);
2048 r = bus_message_new_synthetic_error(
2051 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2056 m->sender = "org.freedesktop.DBus";
2058 r = bus_seal_synthetic_message(bus, m);
2062 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2063 hashmap_remove(bus->reply_callbacks, &c->cookie);
2066 bus->iteration_counter ++;
2068 r = c->callback(bus, m, c->userdata, &error_buffer);
2069 r = bus_maybe_reply_error(m, r, &error_buffer);
2072 bus->current = NULL;
2077 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2081 if (bus->state != BUS_HELLO)
2084 /* Let's make sure the first message on the bus is the HELLO
2085 * reply. But note that we don't actually parse the message
2086 * here (we leave that to the usual handling), we just verify
2087 * we don't let any earlier msg through. */
2089 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2090 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2093 if (m->reply_cookie != bus->hello_cookie)
2099 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2100 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2101 struct reply_callback *c;
2107 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2108 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2111 c = hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2115 if (c->timeout != 0)
2116 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2118 r = sd_bus_message_rewind(m, true);
2122 r = c->callback(bus, m, c->userdata, &error_buffer);
2123 r = bus_maybe_reply_error(m, r, &error_buffer);
2129 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2130 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2131 struct filter_callback *l;
2138 bus->filter_callbacks_modified = false;
2140 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2142 if (bus->filter_callbacks_modified)
2145 /* Don't run this more than once per iteration */
2146 if (l->last_iteration == bus->iteration_counter)
2149 l->last_iteration = bus->iteration_counter;
2151 r = sd_bus_message_rewind(m, true);
2155 r = l->callback(bus, m, l->userdata, &error_buffer);
2156 r = bus_maybe_reply_error(m, r, &error_buffer);
2162 } while (bus->filter_callbacks_modified);
2167 static int process_match(sd_bus *bus, sd_bus_message *m) {
2174 bus->match_callbacks_modified = false;
2176 r = bus_match_run(bus, &bus->match_callbacks, m);
2180 } while (bus->match_callbacks_modified);
2185 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2186 _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
2192 if (bus->manual_peer_interface)
2195 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2198 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2201 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2204 if (streq_ptr(m->member, "Ping"))
2205 r = sd_bus_message_new_method_return(m, &reply);
2206 else if (streq_ptr(m->member, "GetMachineId")) {
2210 r = sd_id128_get_machine(&id);
2214 r = sd_bus_message_new_method_return(m, &reply);
2218 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2220 r = sd_bus_message_new_method_errorf(
2222 SD_BUS_ERROR_UNKNOWN_METHOD,
2223 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2229 r = sd_bus_send(bus, reply, NULL);
2236 static int process_message(sd_bus *bus, sd_bus_message *m) {
2243 bus->iteration_counter++;
2245 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%lu reply_cookie=%lu error=%s",
2246 bus_message_type_to_string(m->header->type),
2247 strna(sd_bus_message_get_sender(m)),
2248 strna(sd_bus_message_get_destination(m)),
2249 strna(sd_bus_message_get_path(m)),
2250 strna(sd_bus_message_get_interface(m)),
2251 strna(sd_bus_message_get_member(m)),
2252 (unsigned long) BUS_MESSAGE_COOKIE(m),
2253 (unsigned long) m->reply_cookie,
2254 strna(m->error.message));
2256 r = process_hello(bus, m);
2260 r = process_reply(bus, m);
2264 r = process_filter(bus, m);
2268 r = process_match(bus, m);
2272 r = process_builtin(bus, m);
2276 r = bus_process_object(bus, m);
2279 bus->current = NULL;
2283 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2284 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2288 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
2290 r = process_timeout(bus);
2294 r = dispatch_wqueue(bus);
2298 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2304 r = process_message(bus, m);
2309 r = sd_bus_message_rewind(m, true);
2318 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2320 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2321 strna(sd_bus_message_get_sender(m)),
2322 strna(sd_bus_message_get_path(m)),
2323 strna(sd_bus_message_get_interface(m)),
2324 strna(sd_bus_message_get_member(m)));
2326 r = sd_bus_reply_method_errorf(
2328 SD_BUS_ERROR_UNKNOWN_OBJECT,
2329 "Unknown object '%s'.", m->path);
2343 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2344 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2345 struct reply_callback *c;
2349 assert(bus->state == BUS_CLOSING);
2351 c = hashmap_first(bus->reply_callbacks);
2353 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2355 /* First, fail all outstanding method calls */
2356 r = bus_message_new_synthetic_error(
2359 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2364 r = bus_seal_synthetic_message(bus, m);
2368 if (c->timeout != 0)
2369 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2371 hashmap_remove(bus->reply_callbacks, &c->cookie);
2374 bus->iteration_counter++;
2376 r = c->callback(bus, m, c->userdata, &error_buffer);
2377 r = bus_maybe_reply_error(m, r, &error_buffer);
2383 /* Then, synthesize a Disconnected message */
2384 r = sd_bus_message_new_signal(
2386 "/org/freedesktop/DBus/Local",
2387 "org.freedesktop.DBus.Local",
2393 m->sender = "org.freedesktop.DBus.Local";
2395 r = bus_seal_synthetic_message(bus, m);
2402 bus->iteration_counter++;
2404 r = process_filter(bus, m);
2408 r = process_match(bus, m);
2420 bus->current = NULL;
2424 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2425 BUS_DONT_DESTROY(bus);
2428 /* Returns 0 when we didn't do anything. This should cause the
2429 * caller to invoke sd_bus_wait() before returning the next
2430 * time. Returns > 0 when we did something, which possibly
2431 * means *ret is filled in with an unprocessed message. */
2433 assert_return(bus, -EINVAL);
2434 assert_return(!bus_pid_changed(bus), -ECHILD);
2436 /* We don't allow recursively invoking sd_bus_process(). */
2437 assert_return(!bus->current, -EBUSY);
2439 switch (bus->state) {
2448 r = bus_socket_process_opening(bus);
2449 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2450 bus_enter_closing(bus);
2458 case BUS_AUTHENTICATING:
2459 r = bus_socket_process_authenticating(bus);
2460 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2461 bus_enter_closing(bus);
2473 r = process_running(bus, hint_priority, priority, ret);
2474 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2475 bus_enter_closing(bus);
2485 return process_closing(bus, ret);
2488 assert_not_reached("Unknown state");
2491 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2492 return bus_process_internal(bus, false, 0, ret);
2495 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2496 return bus_process_internal(bus, true, priority, ret);
2499 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2500 struct pollfd p[2] = {};
2503 usec_t m = (usec_t) -1;
2507 if (bus->state == BUS_CLOSING)
2510 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
2512 e = sd_bus_get_events(bus);
2517 /* The caller really needs some more data, he doesn't
2518 * care about what's already read, or any timeouts
2523 /* The caller wants to process if there's something to
2524 * process, but doesn't care otherwise */
2526 r = sd_bus_get_timeout(bus, &until);
2531 nw = now(CLOCK_MONOTONIC);
2532 m = until > nw ? until - nw : 0;
2536 if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2539 p[0].fd = bus->input_fd;
2540 if (bus->output_fd == bus->input_fd) {
2544 p[0].events = e & POLLIN;
2545 p[1].fd = bus->output_fd;
2546 p[1].events = e & POLLOUT;
2550 r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
2554 return r > 0 ? 1 : 0;
2557 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2559 assert_return(bus, -EINVAL);
2560 assert_return(!bus_pid_changed(bus), -ECHILD);
2562 if (bus->state == BUS_CLOSING)
2565 assert_return(BUS_IS_OPEN(bus->state) , -ENOTCONN);
2567 if (bus->rqueue_size > 0)
2570 return bus_poll(bus, false, timeout_usec);
2573 _public_ int sd_bus_flush(sd_bus *bus) {
2576 assert_return(bus, -EINVAL);
2577 assert_return(!bus_pid_changed(bus), -ECHILD);
2579 if (bus->state == BUS_CLOSING)
2582 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
2584 r = bus_ensure_running(bus);
2588 if (bus->wqueue_size <= 0)
2592 r = dispatch_wqueue(bus);
2594 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2595 bus_enter_closing(bus);
2602 if (bus->wqueue_size <= 0)
2605 r = bus_poll(bus, false, (uint64_t) -1);
2611 _public_ int sd_bus_add_filter(sd_bus *bus,
2612 sd_bus_message_handler_t callback,
2615 struct filter_callback *f;
2617 assert_return(bus, -EINVAL);
2618 assert_return(callback, -EINVAL);
2619 assert_return(!bus_pid_changed(bus), -ECHILD);
2621 f = new0(struct filter_callback, 1);
2624 f->callback = callback;
2625 f->userdata = userdata;
2627 bus->filter_callbacks_modified = true;
2628 LIST_PREPEND(callbacks, bus->filter_callbacks, f);
2632 _public_ int sd_bus_remove_filter(sd_bus *bus,
2633 sd_bus_message_handler_t callback,
2636 struct filter_callback *f;
2638 assert_return(bus, -EINVAL);
2639 assert_return(callback, -EINVAL);
2640 assert_return(!bus_pid_changed(bus), -ECHILD);
2642 LIST_FOREACH(callbacks, f, bus->filter_callbacks) {
2643 if (f->callback == callback && f->userdata == userdata) {
2644 bus->filter_callbacks_modified = true;
2645 LIST_REMOVE(callbacks, bus->filter_callbacks, f);
2654 _public_ int sd_bus_add_match(sd_bus *bus,
2656 sd_bus_message_handler_t callback,
2659 struct bus_match_component *components = NULL;
2660 unsigned n_components = 0;
2661 uint64_t cookie = 0;
2664 assert_return(bus, -EINVAL);
2665 assert_return(match, -EINVAL);
2666 assert_return(!bus_pid_changed(bus), -ECHILD);
2668 r = bus_match_parse(match, &components, &n_components);
2672 if (bus->bus_client) {
2673 cookie = ++bus->match_cookie;
2675 r = bus_add_match_internal(bus, match, components, n_components, cookie);
2680 bus->match_callbacks_modified = true;
2681 r = bus_match_add(&bus->match_callbacks, components, n_components, callback, userdata, cookie, NULL);
2683 if (bus->bus_client)
2684 bus_remove_match_internal(bus, match, cookie);
2688 bus_match_parse_free(components, n_components);
2692 _public_ int sd_bus_remove_match(sd_bus *bus,
2694 sd_bus_message_handler_t callback,
2697 struct bus_match_component *components = NULL;
2698 unsigned n_components = 0;
2700 uint64_t cookie = 0;
2702 assert_return(bus, -EINVAL);
2703 assert_return(match, -EINVAL);
2704 assert_return(!bus_pid_changed(bus), -ECHILD);
2706 r = bus_match_parse(match, &components, &n_components);
2710 bus->match_callbacks_modified = true;
2711 r = bus_match_remove(&bus->match_callbacks, components, n_components, callback, userdata, &cookie);
2713 if (bus->bus_client)
2714 q = bus_remove_match_internal(bus, match, cookie);
2716 bus_match_parse_free(components, n_components);
2718 return r < 0 ? r : q;
2721 bool bus_pid_changed(sd_bus *bus) {
2724 /* We don't support people creating a bus connection and
2725 * keeping it around over a fork(). Let's complain. */
2727 return bus->original_pid != getpid();
2730 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
2731 sd_bus *bus = userdata;
2736 r = sd_bus_process(bus, NULL);
2743 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
2744 sd_bus *bus = userdata;
2749 r = sd_bus_process(bus, NULL);
2756 static int prepare_callback(sd_event_source *s, void *userdata) {
2757 sd_bus *bus = userdata;
2764 e = sd_bus_get_events(bus);
2768 if (bus->output_fd != bus->input_fd) {
2770 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
2774 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
2778 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
2783 r = sd_bus_get_timeout(bus, &until);
2789 j = sd_event_source_set_time(bus->time_event_source, until);
2794 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
2801 static int quit_callback(sd_event_source *event, void *userdata) {
2802 sd_bus *bus = userdata;
2811 static int attach_io_events(sd_bus *bus) {
2816 if (bus->input_fd < 0)
2822 if (!bus->input_io_event_source) {
2823 r = sd_event_add_io(bus->event, bus->input_fd, 0, io_callback, bus, &bus->input_io_event_source);
2827 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
2831 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
2833 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
2838 if (bus->output_fd != bus->input_fd) {
2839 assert(bus->output_fd >= 0);
2841 if (!bus->output_io_event_source) {
2842 r = sd_event_add_io(bus->event, bus->output_fd, 0, io_callback, bus, &bus->output_io_event_source);
2846 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
2848 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
2857 static void detach_io_events(sd_bus *bus) {
2860 if (bus->input_io_event_source) {
2861 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
2862 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
2865 if (bus->output_io_event_source) {
2866 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
2867 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
2871 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
2874 assert_return(bus, -EINVAL);
2875 assert_return(!bus->event, -EBUSY);
2877 assert(!bus->input_io_event_source);
2878 assert(!bus->output_io_event_source);
2879 assert(!bus->time_event_source);
2882 bus->event = sd_event_ref(event);
2884 r = sd_event_default(&bus->event);
2889 bus->event_priority = priority;
2891 r = sd_event_add_monotonic(bus->event, 0, 0, time_callback, bus, &bus->time_event_source);
2895 r = sd_event_source_set_priority(bus->time_event_source, priority);
2899 r = sd_event_add_exit(bus->event, quit_callback, bus, &bus->quit_event_source);
2903 r = attach_io_events(bus);
2910 sd_bus_detach_event(bus);
2914 _public_ int sd_bus_detach_event(sd_bus *bus) {
2915 assert_return(bus, -EINVAL);
2920 detach_io_events(bus);
2922 if (bus->time_event_source) {
2923 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
2924 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
2927 if (bus->quit_event_source) {
2928 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
2929 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
2933 bus->event = sd_event_unref(bus->event);
2938 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
2939 assert_return(bus, NULL);
2944 _public_ sd_bus_message* sd_bus_get_current(sd_bus *bus) {
2945 assert_return(bus, NULL);
2947 return bus->current;
2950 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
2955 assert(default_bus);
2958 return !!*default_bus;
2961 *ret = sd_bus_ref(*default_bus);
2969 b->default_bus_ptr = default_bus;
2977 _public_ int sd_bus_default_system(sd_bus **ret) {
2978 static thread_local sd_bus *default_system_bus = NULL;
2980 return bus_default(sd_bus_open_system, &default_system_bus, ret);
2983 _public_ int sd_bus_default_user(sd_bus **ret) {
2984 static thread_local sd_bus *default_user_bus = NULL;
2986 return bus_default(sd_bus_open_user, &default_user_bus, ret);
2989 _public_ int sd_bus_default(sd_bus **ret) {
2993 /* Let's try our best to reuse another cached connection. If
2994 * the starter bus type is set, connect via our normal
2995 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
2996 * we can share the connection with the user/system default
2999 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3001 if (streq(e, "system"))
3002 return sd_bus_default_system(ret);
3003 else if (streq(e, "user") || streq(e, "session"))
3004 return sd_bus_default_user(ret);
3007 /* No type is specified, so we have not other option than to
3008 * use the starter address if it is set. */
3010 e = secure_getenv("DBUS_STARTER_ADDRESS");
3012 static thread_local sd_bus *default_starter_bus = NULL;
3014 return bus_default(sd_bus_open, &default_starter_bus, ret);
3017 /* Finally, if nothing is set use the cached connection for
3018 * the right scope */
3020 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3021 return sd_bus_default_user(ret);
3023 return sd_bus_default_system(ret);
3026 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3027 assert_return(b, -EINVAL);
3028 assert_return(tid, -EINVAL);
3029 assert_return(!bus_pid_changed(b), -ECHILD);
3037 return sd_event_get_tid(b->event, tid);
3042 _public_ char *sd_bus_label_escape(const char *s) {
3046 assert_return(s, NULL);
3048 /* Escapes all chars that D-Bus' object path cannot deal
3049 * with. Can be reversed with bus_path_unescape(). We special
3050 * case the empty string. */
3055 r = new(char, strlen(s)*3 + 1);
3059 for (f = s, t = r; *f; f++) {
3061 /* Escape everything that is not a-zA-Z0-9. We also
3062 * escape 0-9 if it's the first character */
3064 if (!(*f >= 'A' && *f <= 'Z') &&
3065 !(*f >= 'a' && *f <= 'z') &&
3066 !(f > s && *f >= '0' && *f <= '9')) {
3068 *(t++) = hexchar(*f >> 4);
3069 *(t++) = hexchar(*f);
3079 _public_ char *sd_bus_label_unescape(const char *f) {
3082 assert_return(f, NULL);
3084 /* Special case for the empty string */
3088 r = new(char, strlen(f) + 1);
3092 for (t = r; *f; f++) {
3097 if ((a = unhexchar(f[1])) < 0 ||
3098 (b = unhexchar(f[2])) < 0) {
3099 /* Invalid escape code, let's take it literal then */
3102 *(t++) = (char) ((a << 4) | b);
3114 _public_ int sd_bus_get_peer_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **ret) {
3119 assert_return(bus, -EINVAL);
3120 assert_return(mask <= _SD_BUS_CREDS_ALL, -ENOTSUP);
3121 assert_return(ret, -EINVAL);
3122 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
3123 assert_return(!bus_pid_changed(bus), -ECHILD);
3124 assert_return(!bus->is_kernel, -ENOTSUP);
3126 if (!bus->ucred_valid && !isempty(bus->label))
3129 c = bus_creds_new();
3133 if (bus->ucred_valid) {
3134 pid = c->pid = bus->ucred.pid;
3135 c->uid = bus->ucred.uid;
3136 c->gid = bus->ucred.gid;
3138 c->mask |= (SD_BUS_CREDS_UID | SD_BUS_CREDS_PID | SD_BUS_CREDS_GID) & mask;
3141 if (!isempty(bus->label) && (mask & SD_BUS_CREDS_SELINUX_CONTEXT)) {
3142 c->label = strdup(bus->label);
3144 sd_bus_creds_unref(c);
3148 c->mask |= SD_BUS_CREDS_SELINUX_CONTEXT;
3151 r = bus_creds_add_more(c, mask, pid, 0);
3159 _public_ int sd_bus_try_close(sd_bus *bus) {
3162 assert_return(bus, -EINVAL);
3163 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
3164 assert_return(!bus_pid_changed(bus), -ECHILD);
3165 assert_return(bus->is_kernel, -ENOTSUP);
3167 if (bus->rqueue_size > 0)
3170 if (bus->wqueue_size > 0)
3173 r = bus_kernel_try_close(bus);
3181 _public_ int sd_bus_get_name(sd_bus *bus, const char **name) {
3182 assert_return(bus, -EINVAL);
3183 assert_return(name, -EINVAL);
3184 assert_return(!bus_pid_changed(bus), -ECHILD);
3186 *name = bus->connection_name;