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/>.
39 #include "bus-internal.h"
40 #include "bus-message.h"
42 #include "bus-socket.h"
43 #include "bus-kernel.h"
44 #include "bus-control.h"
45 #include "bus-introspect.h"
46 #include "bus-signature.h"
47 #include "bus-objects.h"
49 #include "bus-container.h"
50 #include "bus-protocol.h"
52 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
54 static void bus_close_fds(sd_bus *b) {
58 close_nointr_nofail(b->input_fd);
60 if (b->output_fd >= 0 && b->output_fd != b->input_fd)
61 close_nointr_nofail(b->output_fd);
63 b->input_fd = b->output_fd = -1;
66 static void bus_node_destroy(sd_bus *b, struct node *n) {
67 struct node_callback *c;
68 struct node_vtable *v;
69 struct node_enumerator *e;
77 bus_node_destroy(b, n->child);
79 while ((c = n->callbacks)) {
80 LIST_REMOVE(callbacks, n->callbacks, c);
84 while ((v = n->vtables)) {
85 LIST_REMOVE(vtables, n->vtables, v);
90 while ((e = n->enumerators)) {
91 LIST_REMOVE(enumerators, n->enumerators, e);
96 LIST_REMOVE(siblings, n->parent->child, n);
98 assert_se(hashmap_remove(b->nodes, n->path) == n);
103 static void bus_reset_queues(sd_bus *b) {
108 for (i = 0; i < b->rqueue_size; i++)
109 sd_bus_message_unref(b->rqueue[i]);
112 for (i = 0; i < b->wqueue_size; i++)
113 sd_bus_message_unref(b->wqueue[i]);
116 b->rqueue = b->wqueue = NULL;
117 b->rqueue_size = b->wqueue_size = 0;
120 static void bus_free(sd_bus *b) {
121 struct filter_callback *f;
126 sd_bus_detach_event(b);
131 munmap(b->kdbus_buffer, KDBUS_POOL_SIZE);
134 free(b->unique_name);
135 free(b->auth_buffer);
141 strv_free(b->exec_argv);
143 close_many(b->fds, b->n_fds);
148 hashmap_free_free(b->reply_callbacks);
149 prioq_free(b->reply_callbacks_prioq);
151 while ((f = b->filter_callbacks)) {
152 LIST_REMOVE(callbacks, b->filter_callbacks, f);
156 bus_match_free(&b->match_callbacks);
158 hashmap_free_free(b->vtable_methods);
159 hashmap_free_free(b->vtable_properties);
161 while ((n = hashmap_first(b->nodes)))
162 bus_node_destroy(b, n);
164 hashmap_free(b->nodes);
166 bus_kernel_flush_memfd(b);
168 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
173 _public_ int sd_bus_new(sd_bus **ret) {
176 assert_return(ret, -EINVAL);
182 r->n_ref = REFCNT_INIT;
183 r->input_fd = r->output_fd = -1;
184 r->message_version = 1;
185 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
186 r->hello_flags |= KDBUS_HELLO_ACCEPT_FD;
187 r->attach_flags |= KDBUS_ATTACH_NAMES;
188 r->original_pid = getpid();
190 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
192 /* We guarantee that wqueue always has space for at least one
194 r->wqueue = new(sd_bus_message*, 1);
204 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
207 assert_return(bus, -EINVAL);
208 assert_return(bus->state == BUS_UNSET, -EPERM);
209 assert_return(address, -EINVAL);
210 assert_return(!bus_pid_changed(bus), -ECHILD);
222 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
223 assert_return(bus, -EINVAL);
224 assert_return(bus->state == BUS_UNSET, -EPERM);
225 assert_return(input_fd >= 0, -EINVAL);
226 assert_return(output_fd >= 0, -EINVAL);
227 assert_return(!bus_pid_changed(bus), -ECHILD);
229 bus->input_fd = input_fd;
230 bus->output_fd = output_fd;
234 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
237 assert_return(bus, -EINVAL);
238 assert_return(bus->state == BUS_UNSET, -EPERM);
239 assert_return(path, -EINVAL);
240 assert_return(!strv_isempty(argv), -EINVAL);
241 assert_return(!bus_pid_changed(bus), -ECHILD);
253 free(bus->exec_path);
254 strv_free(bus->exec_argv);
262 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
263 assert_return(bus, -EINVAL);
264 assert_return(bus->state == BUS_UNSET, -EPERM);
265 assert_return(!bus_pid_changed(bus), -ECHILD);
267 bus->bus_client = !!b;
271 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
272 assert_return(bus, -EINVAL);
273 assert_return(bus->state == BUS_UNSET, -EPERM);
274 assert_return(!bus_pid_changed(bus), -ECHILD);
276 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ACCEPT_FD, b);
280 _public_ int sd_bus_negotiate_attach_timestamp(sd_bus *bus, int b) {
281 assert_return(bus, -EINVAL);
282 assert_return(bus->state == BUS_UNSET, -EPERM);
283 assert_return(!bus_pid_changed(bus), -ECHILD);
285 SET_FLAG(bus->attach_flags, KDBUS_ATTACH_TIMESTAMP, b);
289 _public_ int sd_bus_negotiate_attach_creds(sd_bus *bus, uint64_t mask) {
290 assert_return(bus, -EINVAL);
291 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
292 assert_return(bus->state == BUS_UNSET, -EPERM);
293 assert_return(!bus_pid_changed(bus), -ECHILD);
295 /* The well knowns we need unconditionally, so that matches can work */
296 bus->creds_mask = mask | SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
298 return kdbus_translate_attach_flags(bus->creds_mask, &bus->creds_mask);
301 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
302 assert_return(bus, -EINVAL);
303 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
304 assert_return(bus->state == BUS_UNSET, -EPERM);
305 assert_return(!bus_pid_changed(bus), -ECHILD);
307 bus->is_server = !!b;
308 bus->server_id = server_id;
312 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
313 assert_return(bus, -EINVAL);
314 assert_return(bus->state == BUS_UNSET, -EPERM);
315 assert_return(!bus_pid_changed(bus), -ECHILD);
317 bus->anonymous_auth = !!b;
321 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
322 assert_return(bus, -EINVAL);
323 assert_return(bus->state == BUS_UNSET, -EPERM);
324 assert_return(!bus_pid_changed(bus), -ECHILD);
330 static int hello_callback(sd_bus *bus, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
335 assert(bus->state == BUS_HELLO || bus->state == BUS_CLOSING);
338 r = sd_bus_message_get_errno(reply);
344 r = sd_bus_message_read(reply, "s", &s);
348 if (!service_name_is_valid(s) || s[0] != ':')
351 bus->unique_name = strdup(s);
352 if (!bus->unique_name)
355 if (bus->state == BUS_HELLO)
356 bus->state = BUS_RUNNING;
361 static int bus_send_hello(sd_bus *bus) {
362 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
367 if (!bus->bus_client || bus->is_kernel)
370 r = sd_bus_message_new_method_call(
372 "org.freedesktop.DBus",
374 "org.freedesktop.DBus",
380 return sd_bus_call_async(bus, m, hello_callback, NULL, 0, &bus->hello_serial);
383 int bus_start_running(sd_bus *bus) {
386 if (bus->bus_client && !bus->is_kernel) {
387 bus->state = BUS_HELLO;
391 bus->state = BUS_RUNNING;
395 static int parse_address_key(const char **p, const char *key, char **value) {
406 if (strncmp(*p, key, l) != 0)
419 while (*a != ';' && *a != ',' && *a != 0) {
437 c = (char) ((x << 4) | y);
444 t = realloc(r, n + 2);
472 static void skip_address_key(const char **p) {
476 *p += strcspn(*p, ",");
482 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
483 _cleanup_free_ char *path = NULL, *abstract = NULL;
492 while (**p != 0 && **p != ';') {
493 r = parse_address_key(p, "guid", guid);
499 r = parse_address_key(p, "path", &path);
505 r = parse_address_key(p, "abstract", &abstract);
514 if (!path && !abstract)
517 if (path && abstract)
522 if (l > sizeof(b->sockaddr.un.sun_path))
525 b->sockaddr.un.sun_family = AF_UNIX;
526 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
527 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
528 } else if (abstract) {
529 l = strlen(abstract);
530 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
533 b->sockaddr.un.sun_family = AF_UNIX;
534 b->sockaddr.un.sun_path[0] = 0;
535 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
536 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
542 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
543 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
545 struct addrinfo *result, hints = {
546 .ai_socktype = SOCK_STREAM,
547 .ai_flags = AI_ADDRCONFIG,
555 while (**p != 0 && **p != ';') {
556 r = parse_address_key(p, "guid", guid);
562 r = parse_address_key(p, "host", &host);
568 r = parse_address_key(p, "port", &port);
574 r = parse_address_key(p, "family", &family);
587 if (streq(family, "ipv4"))
588 hints.ai_family = AF_INET;
589 else if (streq(family, "ipv6"))
590 hints.ai_family = AF_INET6;
595 r = getaddrinfo(host, port, &hints, &result);
599 return -EADDRNOTAVAIL;
601 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
602 b->sockaddr_size = result->ai_addrlen;
604 freeaddrinfo(result);
609 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
611 unsigned n_argv = 0, j;
620 while (**p != 0 && **p != ';') {
621 r = parse_address_key(p, "guid", guid);
627 r = parse_address_key(p, "path", &path);
633 if (startswith(*p, "argv")) {
637 ul = strtoul(*p + 4, (char**) p, 10);
638 if (errno > 0 || **p != '=' || ul > 256) {
648 x = realloc(argv, sizeof(char*) * (ul + 2));
654 memset(x + n_argv, 0, sizeof(char*) * (ul - n_argv + 2));
660 r = parse_address_key(p, NULL, argv + ul);
675 /* Make sure there are no holes in the array, with the
676 * exception of argv[0] */
677 for (j = 1; j < n_argv; j++)
683 if (argv && argv[0] == NULL) {
684 argv[0] = strdup(path);
696 for (j = 0; j < n_argv; j++)
704 static int parse_kernel_address(sd_bus *b, const char **p, char **guid) {
705 _cleanup_free_ char *path = NULL;
713 while (**p != 0 && **p != ';') {
714 r = parse_address_key(p, "guid", guid);
720 r = parse_address_key(p, "path", &path);
739 static int parse_container_address(sd_bus *b, const char **p, char **guid) {
740 _cleanup_free_ char *machine = NULL;
748 while (**p != 0 && **p != ';') {
749 r = parse_address_key(p, "guid", guid);
755 r = parse_address_key(p, "machine", &machine);
768 b->machine = machine;
771 b->sockaddr.un.sun_family = AF_UNIX;
772 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
773 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + sizeof("/var/run/dbus/system_bus_socket") - 1;
778 static void bus_reset_parsed_address(sd_bus *b) {
782 b->sockaddr_size = 0;
783 strv_free(b->exec_argv);
787 b->server_id = SD_ID128_NULL;
794 static int bus_parse_next_address(sd_bus *b) {
795 _cleanup_free_ char *guid = NULL;
803 if (b->address[b->address_index] == 0)
806 bus_reset_parsed_address(b);
808 a = b->address + b->address_index;
817 if (startswith(a, "unix:")) {
820 r = parse_unix_address(b, &a, &guid);
825 } else if (startswith(a, "tcp:")) {
828 r = parse_tcp_address(b, &a, &guid);
834 } else if (startswith(a, "unixexec:")) {
837 r = parse_exec_address(b, &a, &guid);
843 } else if (startswith(a, "kernel:")) {
846 r = parse_kernel_address(b, &a, &guid);
851 } else if (startswith(a, "x-container:")) {
854 r = parse_container_address(b, &a, &guid);
867 r = sd_id128_from_string(guid, &b->server_id);
872 b->address_index = a - b->address;
876 static int bus_start_address(sd_bus *b) {
886 r = bus_socket_exec(b);
890 b->last_connect_error = -r;
891 } else if (b->kernel) {
893 r = bus_kernel_connect(b);
897 b->last_connect_error = -r;
899 } else if (b->machine) {
901 r = bus_container_connect(b);
905 b->last_connect_error = -r;
907 } else if (b->sockaddr.sa.sa_family != AF_UNSPEC) {
909 r = bus_socket_connect(b);
913 b->last_connect_error = -r;
916 r = bus_parse_next_address(b);
920 return b->last_connect_error ? -b->last_connect_error : -ECONNREFUSED;
924 int bus_next_address(sd_bus *b) {
927 bus_reset_parsed_address(b);
928 return bus_start_address(b);
931 static int bus_start_fd(sd_bus *b) {
936 assert(b->input_fd >= 0);
937 assert(b->output_fd >= 0);
939 r = fd_nonblock(b->input_fd, true);
943 r = fd_cloexec(b->input_fd, true);
947 if (b->input_fd != b->output_fd) {
948 r = fd_nonblock(b->output_fd, true);
952 r = fd_cloexec(b->output_fd, true);
957 if (fstat(b->input_fd, &st) < 0)
960 if (S_ISCHR(b->input_fd))
961 return bus_kernel_take_fd(b);
963 return bus_socket_take_fd(b);
966 _public_ int sd_bus_start(sd_bus *bus) {
969 assert_return(bus, -EINVAL);
970 assert_return(bus->state == BUS_UNSET, -EPERM);
971 assert_return(!bus_pid_changed(bus), -ECHILD);
973 bus->state = BUS_OPENING;
975 if (bus->is_server && bus->bus_client)
978 if (bus->input_fd >= 0)
979 r = bus_start_fd(bus);
980 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->kernel || bus->machine)
981 r = bus_start_address(bus);
988 return bus_send_hello(bus);
991 _public_ int sd_bus_open_system(sd_bus **ret) {
996 assert_return(ret, -EINVAL);
1002 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1004 r = sd_bus_set_address(b, e);
1007 r = sd_bus_set_address(b, "kernel:path=/dev/kdbus/0-system/bus;unix:path=/run/dbus/system_bus_socket");
1009 r = sd_bus_set_address(b, "unix:path=/run/dbus/system_bus_socket");
1015 b->bus_client = true;
1017 /* Let's do per-method access control on the system bus. We
1018 * need the caller's UID and capability set for that. */
1020 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1022 r = sd_bus_start(b);
1034 _public_ int sd_bus_open_user(sd_bus **ret) {
1039 assert_return(ret, -EINVAL);
1045 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1047 r = sd_bus_set_address(b, e);
1051 e = secure_getenv("XDG_RUNTIME_DIR");
1053 _cleanup_free_ char *ee = NULL;
1055 ee = bus_address_escape(e);
1062 asprintf(&b->address, "kernel:path=/dev/kdbus/%lu-user/bus;unix:path=%s/bus", (unsigned long) getuid(), ee);
1064 b->address = strjoin("unix:path=", ee, "/bus", NULL);
1068 asprintf(&b->address, "kernel:path=/dev/kdbus/%lu-user/bus", (unsigned long) getuid());
1070 return -ECONNREFUSED;
1080 b->bus_client = true;
1082 /* We don't do any per-method access control on the user
1086 r = sd_bus_start(b);
1098 _public_ int sd_bus_open_system_remote(const char *host, sd_bus **ret) {
1099 _cleanup_free_ char *e = NULL;
1104 assert_return(host, -EINVAL);
1105 assert_return(ret, -EINVAL);
1107 e = bus_address_escape(host);
1111 p = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", NULL);
1115 r = sd_bus_new(&bus);
1122 bus->bus_client = true;
1124 r = sd_bus_start(bus);
1134 _public_ int sd_bus_open_system_container(const char *machine, sd_bus **ret) {
1135 _cleanup_free_ char *e = NULL;
1140 assert_return(machine, -EINVAL);
1141 assert_return(ret, -EINVAL);
1143 e = bus_address_escape(machine);
1147 p = strjoin("x-container:machine=", e, NULL);
1151 r = sd_bus_new(&bus);
1158 bus->bus_client = true;
1160 r = sd_bus_start(bus);
1170 _public_ void sd_bus_close(sd_bus *bus) {
1174 if (bus->state == BUS_CLOSED)
1176 if (bus_pid_changed(bus))
1179 bus->state = BUS_CLOSED;
1181 sd_bus_detach_event(bus);
1183 /* Drop all queued messages so that they drop references to
1184 * the bus object and the bus may be freed */
1185 bus_reset_queues(bus);
1187 if (!bus->is_kernel)
1190 /* We'll leave the fd open in case this is a kernel bus, since
1191 * there might still be memblocks around that reference this
1192 * bus, and they might need to invoke the * KDBUS_CMD_FREE
1193 * ioctl on the fd when they are freed. */
1196 static void bus_enter_closing(sd_bus *bus) {
1199 if (bus->state != BUS_OPENING &&
1200 bus->state != BUS_AUTHENTICATING &&
1201 bus->state != BUS_HELLO &&
1202 bus->state != BUS_RUNNING)
1205 bus->state = BUS_CLOSING;
1208 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1209 assert_return(bus, NULL);
1211 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1216 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1217 assert_return(bus, NULL);
1219 if (REFCNT_DEC(bus->n_ref) <= 0)
1225 _public_ int sd_bus_is_open(sd_bus *bus) {
1227 assert_return(bus, -EINVAL);
1228 assert_return(!bus_pid_changed(bus), -ECHILD);
1230 return BUS_IS_OPEN(bus->state);
1233 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1236 assert_return(bus, -EINVAL);
1237 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1238 assert_return(!bus_pid_changed(bus), -ECHILD);
1240 if (type == SD_BUS_TYPE_UNIX_FD) {
1241 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
1244 r = bus_ensure_running(bus);
1248 return bus->can_fds;
1251 return bus_type_is_valid(type);
1254 _public_ int sd_bus_get_server_id(sd_bus *bus, sd_id128_t *server_id) {
1257 assert_return(bus, -EINVAL);
1258 assert_return(server_id, -EINVAL);
1259 assert_return(!bus_pid_changed(bus), -ECHILD);
1261 r = bus_ensure_running(bus);
1265 *server_id = bus->server_id;
1269 static int bus_seal_message(sd_bus *b, sd_bus_message *m) {
1273 if (m->header->version > b->message_version)
1277 /* If we copy the same message to multiple
1278 * destinations, avoid using the same serial
1280 b->serial = MAX(b->serial, BUS_MESSAGE_SERIAL(m));
1284 return bus_message_seal(m, ++b->serial);
1287 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1291 if (m->header->version > b->message_version)
1294 /* The bus specification says the serial number cannot be 0,
1295 * hence let's fill something in for synthetic messages. Since
1296 * synthetic messages might have a fake sender and we don't
1297 * want to interfere with the real sender's serial numbers we
1298 * pick a fixed, artifical one. We use (uint32_t) -1 rather
1299 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1300 * even though kdbus can do 64bit. */
1302 return bus_message_seal(m, 0xFFFFFFFFULL);
1305 static int bus_write_message(sd_bus *bus, sd_bus_message *message, size_t *idx) {
1310 return bus_kernel_write_message(bus, message);
1312 return bus_socket_write_message(bus, message, idx);
1315 static int dispatch_wqueue(sd_bus *bus) {
1319 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1321 while (bus->wqueue_size > 0) {
1323 r = bus_write_message(bus, bus->wqueue[0], &bus->windex);
1327 /* Didn't do anything this time */
1329 else if (bus->is_kernel || bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1330 /* Fully written. Let's drop the entry from
1333 * This isn't particularly optimized, but
1334 * well, this is supposed to be our worst-case
1335 * buffer only, and the socket buffer is
1336 * supposed to be our primary buffer, and if
1337 * it got full, then all bets are off
1340 sd_bus_message_unref(bus->wqueue[0]);
1341 bus->wqueue_size --;
1342 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1352 static int bus_read_message(sd_bus *bus) {
1356 return bus_kernel_read_message(bus);
1358 return bus_socket_read_message(bus);
1361 int bus_rqueue_make_room(sd_bus *bus) {
1365 x = bus->rqueue_size + 1;
1367 if (bus->rqueue_allocated >= x)
1370 if (x > BUS_RQUEUE_MAX)
1373 q = realloc(bus->rqueue, x * sizeof(sd_bus_message*));
1378 bus->rqueue_allocated = x;
1383 static int dispatch_rqueue(sd_bus *bus, sd_bus_message **m) {
1388 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1391 if (bus->rqueue_size > 0) {
1392 /* Dispatch a queued message */
1394 *m = bus->rqueue[0];
1395 bus->rqueue_size --;
1396 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1400 /* Try to read a new message */
1401 r = bus_read_message(bus);
1411 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *serial) {
1414 assert_return(bus, -EINVAL);
1415 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1416 assert_return(m, -EINVAL);
1417 assert_return(!bus_pid_changed(bus), -ECHILD);
1420 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1427 /* If the serial number isn't kept, then we know that no reply
1429 if (!serial && !m->sealed)
1430 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1432 r = bus_seal_message(bus, m);
1436 /* If this is a reply and no reply was requested, then let's
1437 * suppress this, if we can */
1438 if (m->dont_send && !serial)
1441 if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
1444 r = bus_write_message(bus, m, &idx);
1446 if (r == -EPIPE || r == -ENOTCONN || r == -ESHUTDOWN)
1447 bus_enter_closing(bus);
1450 } else if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m)) {
1451 /* Wasn't fully written. So let's remember how
1452 * much was written. Note that the first entry
1453 * of the wqueue array is always allocated so
1454 * that we always can remember how much was
1456 bus->wqueue[0] = sd_bus_message_ref(m);
1457 bus->wqueue_size = 1;
1463 /* Just append it to the queue. */
1465 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1468 q = realloc(bus->wqueue, sizeof(sd_bus_message*) * (bus->wqueue_size + 1));
1473 q[bus->wqueue_size ++] = sd_bus_message_ref(m);
1477 *serial = BUS_MESSAGE_SERIAL(m);
1482 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *serial) {
1485 assert_return(bus, -EINVAL);
1486 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1487 assert_return(m, -EINVAL);
1488 assert_return(!bus_pid_changed(bus), -ECHILD);
1490 if (!streq_ptr(m->destination, destination)) {
1495 r = sd_bus_message_set_destination(m, destination);
1500 return sd_bus_send(bus, m, serial);
1503 static usec_t calc_elapse(uint64_t usec) {
1504 if (usec == (uint64_t) -1)
1508 usec = BUS_DEFAULT_TIMEOUT;
1510 return now(CLOCK_MONOTONIC) + usec;
1513 static int timeout_compare(const void *a, const void *b) {
1514 const struct reply_callback *x = a, *y = b;
1516 if (x->timeout != 0 && y->timeout == 0)
1519 if (x->timeout == 0 && y->timeout != 0)
1522 if (x->timeout < y->timeout)
1525 if (x->timeout > y->timeout)
1531 _public_ int sd_bus_call_async(
1534 sd_bus_message_handler_t callback,
1539 struct reply_callback *c;
1542 assert_return(bus, -EINVAL);
1543 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1544 assert_return(m, -EINVAL);
1545 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1546 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1547 assert_return(callback, -EINVAL);
1548 assert_return(!bus_pid_changed(bus), -ECHILD);
1550 r = hashmap_ensure_allocated(&bus->reply_callbacks, uint64_hash_func, uint64_compare_func);
1554 if (usec != (uint64_t) -1) {
1555 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1560 r = bus_seal_message(bus, m);
1564 c = new0(struct reply_callback, 1);
1568 c->callback = callback;
1569 c->userdata = userdata;
1570 c->serial = BUS_MESSAGE_SERIAL(m);
1571 c->timeout = calc_elapse(usec);
1573 r = hashmap_put(bus->reply_callbacks, &c->serial, c);
1579 if (c->timeout != 0) {
1580 r = prioq_put(bus->reply_callbacks_prioq, c, &c->prioq_idx);
1583 sd_bus_call_async_cancel(bus, c->serial);
1588 r = sd_bus_send(bus, m, serial);
1590 sd_bus_call_async_cancel(bus, c->serial);
1597 _public_ int sd_bus_call_async_cancel(sd_bus *bus, uint64_t serial) {
1598 struct reply_callback *c;
1600 assert_return(bus, -EINVAL);
1601 assert_return(serial != 0, -EINVAL);
1602 assert_return(!bus_pid_changed(bus), -ECHILD);
1604 c = hashmap_remove(bus->reply_callbacks, &serial);
1608 if (c->timeout != 0)
1609 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
1615 int bus_ensure_running(sd_bus *bus) {
1620 if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED || bus->state == BUS_CLOSING)
1622 if (bus->state == BUS_RUNNING)
1626 r = sd_bus_process(bus, NULL);
1629 if (bus->state == BUS_RUNNING)
1634 r = sd_bus_wait(bus, (uint64_t) -1);
1640 _public_ int sd_bus_call(
1644 sd_bus_error *error,
1645 sd_bus_message **reply) {
1652 assert_return(bus, -EINVAL);
1653 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1654 assert_return(m, -EINVAL);
1655 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1656 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1657 assert_return(!bus_error_is_dirty(error), -EINVAL);
1658 assert_return(!bus_pid_changed(bus), -ECHILD);
1660 r = bus_ensure_running(bus);
1664 i = bus->rqueue_size;
1666 r = sd_bus_send(bus, m, &serial);
1670 timeout = calc_elapse(usec);
1675 while (i < bus->rqueue_size) {
1676 sd_bus_message *incoming = NULL;
1678 incoming = bus->rqueue[i];
1680 if (incoming->reply_serial == serial) {
1681 /* Found a match! */
1683 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1686 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
1691 sd_bus_message_unref(incoming);
1694 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR)
1695 r = sd_bus_error_copy(error, &incoming->error);
1699 sd_bus_message_unref(incoming);
1702 } else if (incoming->header->serial == serial &&
1705 streq(bus->unique_name, incoming->sender)) {
1707 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1710 /* Our own message? Somebody is trying
1711 * to send its own client a message,
1712 * let's not dead-lock, let's fail
1715 sd_bus_message_unref(incoming);
1719 /* Try to read more, right-away */
1723 r = bus_read_message(bus);
1725 if (r == -EPIPE || r == -ENOTCONN || r == -ESHUTDOWN)
1726 bus_enter_closing(bus);
1736 n = now(CLOCK_MONOTONIC);
1742 left = (uint64_t) -1;
1744 r = bus_poll(bus, true, left);
1748 r = dispatch_wqueue(bus);
1750 if (r == -EPIPE || r == -ENOTCONN || r == -ESHUTDOWN)
1751 bus_enter_closing(bus);
1758 _public_ int sd_bus_get_fd(sd_bus *bus) {
1760 assert_return(bus, -EINVAL);
1761 assert_return(bus->input_fd == bus->output_fd, -EPERM);
1762 assert_return(!bus_pid_changed(bus), -ECHILD);
1764 return bus->input_fd;
1767 _public_ int sd_bus_get_events(sd_bus *bus) {
1770 assert_return(bus, -EINVAL);
1771 assert_return(BUS_IS_OPEN(bus->state) || bus->state == BUS_CLOSING, -ENOTCONN);
1772 assert_return(!bus_pid_changed(bus), -ECHILD);
1774 if (bus->state == BUS_OPENING)
1776 else if (bus->state == BUS_AUTHENTICATING) {
1778 if (bus_socket_auth_needs_write(bus))
1783 } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
1784 if (bus->rqueue_size <= 0)
1786 if (bus->wqueue_size > 0)
1793 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
1794 struct reply_callback *c;
1796 assert_return(bus, -EINVAL);
1797 assert_return(timeout_usec, -EINVAL);
1798 assert_return(BUS_IS_OPEN(bus->state) || bus->state == BUS_CLOSING, -ENOTCONN);
1799 assert_return(!bus_pid_changed(bus), -ECHILD);
1801 if (bus->state == BUS_CLOSING) {
1806 if (bus->state == BUS_AUTHENTICATING) {
1807 *timeout_usec = bus->auth_timeout;
1811 if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
1812 *timeout_usec = (uint64_t) -1;
1816 if (bus->rqueue_size > 0) {
1821 c = prioq_peek(bus->reply_callbacks_prioq);
1823 *timeout_usec = (uint64_t) -1;
1827 *timeout_usec = c->timeout;
1831 static int process_timeout(sd_bus *bus) {
1832 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
1833 _cleanup_bus_message_unref_ sd_bus_message* m = NULL;
1834 struct reply_callback *c;
1840 c = prioq_peek(bus->reply_callbacks_prioq);
1844 n = now(CLOCK_MONOTONIC);
1848 r = bus_message_new_synthetic_error(
1851 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
1856 m->sender = "org.freedesktop.DBus";
1858 r = bus_seal_synthetic_message(bus, m);
1862 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
1863 hashmap_remove(bus->reply_callbacks, &c->serial);
1866 bus->iteration_counter ++;
1868 r = c->callback(bus, m, c->userdata, &error_buffer);
1869 r = bus_maybe_reply_error(m, r, &error_buffer);
1872 bus->current = NULL;
1877 static int process_hello(sd_bus *bus, sd_bus_message *m) {
1881 if (bus->state != BUS_HELLO)
1884 /* Let's make sure the first message on the bus is the HELLO
1885 * reply. But note that we don't actually parse the message
1886 * here (we leave that to the usual handling), we just verify
1887 * we don't let any earlier msg through. */
1889 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
1890 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
1893 if (m->reply_serial != bus->hello_serial)
1899 static int process_reply(sd_bus *bus, sd_bus_message *m) {
1900 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
1901 struct reply_callback *c;
1907 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
1908 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
1911 c = hashmap_remove(bus->reply_callbacks, &m->reply_serial);
1915 if (c->timeout != 0)
1916 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
1918 r = sd_bus_message_rewind(m, true);
1922 r = c->callback(bus, m, c->userdata, &error_buffer);
1923 r = bus_maybe_reply_error(m, r, &error_buffer);
1929 static int process_filter(sd_bus *bus, sd_bus_message *m) {
1930 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
1931 struct filter_callback *l;
1938 bus->filter_callbacks_modified = false;
1940 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
1942 if (bus->filter_callbacks_modified)
1945 /* Don't run this more than once per iteration */
1946 if (l->last_iteration == bus->iteration_counter)
1949 l->last_iteration = bus->iteration_counter;
1951 r = sd_bus_message_rewind(m, true);
1955 r = l->callback(bus, m, l->userdata, &error_buffer);
1956 r = bus_maybe_reply_error(m, r, &error_buffer);
1962 } while (bus->filter_callbacks_modified);
1967 static int process_match(sd_bus *bus, sd_bus_message *m) {
1974 bus->match_callbacks_modified = false;
1976 r = bus_match_run(bus, &bus->match_callbacks, m);
1980 } while (bus->match_callbacks_modified);
1985 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
1986 _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
1992 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
1995 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
1998 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2001 if (streq_ptr(m->member, "Ping"))
2002 r = sd_bus_message_new_method_return(m, &reply);
2003 else if (streq_ptr(m->member, "GetMachineId")) {
2007 r = sd_id128_get_machine(&id);
2011 r = sd_bus_message_new_method_return(m, &reply);
2015 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2017 r = sd_bus_message_new_method_errorf(
2019 SD_BUS_ERROR_UNKNOWN_METHOD,
2020 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2026 r = sd_bus_send(bus, reply, NULL);
2033 static int process_message(sd_bus *bus, sd_bus_message *m) {
2040 bus->iteration_counter++;
2042 log_debug("Got message sender=%s object=%s interface=%s member=%s",
2043 strna(sd_bus_message_get_sender(m)),
2044 strna(sd_bus_message_get_path(m)),
2045 strna(sd_bus_message_get_interface(m)),
2046 strna(sd_bus_message_get_member(m)));
2048 r = process_hello(bus, m);
2052 r = process_reply(bus, m);
2056 r = process_filter(bus, m);
2060 r = process_match(bus, m);
2064 r = process_builtin(bus, m);
2068 r = bus_process_object(bus, m);
2071 bus->current = NULL;
2075 static int process_running(sd_bus *bus, sd_bus_message **ret) {
2076 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2080 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
2082 r = process_timeout(bus);
2086 r = dispatch_wqueue(bus);
2090 r = dispatch_rqueue(bus, &m);
2096 r = process_message(bus, m);
2101 r = sd_bus_message_rewind(m, true);
2110 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2112 r = sd_bus_reply_method_errorf(
2114 SD_BUS_ERROR_UNKNOWN_OBJECT,
2115 "Unknown object '%s'.", m->path);
2129 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2130 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2131 struct reply_callback *c;
2135 assert(bus->state == BUS_CLOSING);
2137 c = hashmap_first(bus->reply_callbacks);
2139 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2141 /* First, fail all outstanding method calls */
2142 r = bus_message_new_synthetic_error(
2145 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2150 r = bus_seal_synthetic_message(bus, m);
2154 if (c->timeout != 0)
2155 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2157 hashmap_remove(bus->reply_callbacks, &c->serial);
2160 bus->iteration_counter++;
2162 r = c->callback(bus, m, c->userdata, &error_buffer);
2163 r = bus_maybe_reply_error(m, r, &error_buffer);
2169 /* Then, synthesize a Disconnected message */
2170 r = sd_bus_message_new_signal(
2172 "/org/freedesktop/DBus/Local",
2173 "org.freedesktop.DBus.Local",
2179 m->sender = "org.freedesktop.DBus.Local";
2181 r = bus_seal_synthetic_message(bus, m);
2188 bus->iteration_counter++;
2190 r = process_filter(bus, m);
2194 r = process_match(bus, m);
2206 bus->current = NULL;
2210 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2211 BUS_DONT_DESTROY(bus);
2214 /* Returns 0 when we didn't do anything. This should cause the
2215 * caller to invoke sd_bus_wait() before returning the next
2216 * time. Returns > 0 when we did something, which possibly
2217 * means *ret is filled in with an unprocessed message. */
2219 assert_return(bus, -EINVAL);
2220 assert_return(!bus_pid_changed(bus), -ECHILD);
2222 /* We don't allow recursively invoking sd_bus_process(). */
2223 assert_return(!bus->current, -EBUSY);
2225 switch (bus->state) {
2232 r = bus_socket_process_opening(bus);
2233 if (r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2234 bus_enter_closing(bus);
2242 case BUS_AUTHENTICATING:
2243 r = bus_socket_process_authenticating(bus);
2244 if (r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2245 bus_enter_closing(bus);
2257 r = process_running(bus, ret);
2258 if (r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2259 bus_enter_closing(bus);
2269 return process_closing(bus, ret);
2272 assert_not_reached("Unknown state");
2275 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2276 struct pollfd p[2] = {};
2279 usec_t m = (usec_t) -1;
2283 if (bus->state == BUS_CLOSING)
2286 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
2288 e = sd_bus_get_events(bus);
2293 /* The caller really needs some more data, he doesn't
2294 * care about what's already read, or any timeouts
2299 /* The caller wants to process if there's something to
2300 * process, but doesn't care otherwise */
2302 r = sd_bus_get_timeout(bus, &until);
2307 nw = now(CLOCK_MONOTONIC);
2308 m = until > nw ? until - nw : 0;
2312 if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2315 p[0].fd = bus->input_fd;
2316 if (bus->output_fd == bus->input_fd) {
2320 p[0].events = e & POLLIN;
2321 p[1].fd = bus->output_fd;
2322 p[1].events = e & POLLOUT;
2326 r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
2330 return r > 0 ? 1 : 0;
2333 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2335 assert_return(bus, -EINVAL);
2336 assert_return(!bus_pid_changed(bus), -ECHILD);
2338 if (bus->state == BUS_CLOSING)
2341 assert_return(BUS_IS_OPEN(bus->state) , -ENOTCONN);
2343 if (bus->rqueue_size > 0)
2346 return bus_poll(bus, false, timeout_usec);
2349 _public_ int sd_bus_flush(sd_bus *bus) {
2352 assert_return(bus, -EINVAL);
2353 assert_return(!bus_pid_changed(bus), -ECHILD);
2355 if (bus->state == BUS_CLOSING)
2358 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
2360 r = bus_ensure_running(bus);
2364 if (bus->wqueue_size <= 0)
2368 r = dispatch_wqueue(bus);
2370 if (r == -EPIPE || r == -ENOTCONN || r == -ESHUTDOWN)
2371 bus_enter_closing(bus);
2376 if (bus->wqueue_size <= 0)
2379 r = bus_poll(bus, false, (uint64_t) -1);
2385 _public_ int sd_bus_add_filter(sd_bus *bus,
2386 sd_bus_message_handler_t callback,
2389 struct filter_callback *f;
2391 assert_return(bus, -EINVAL);
2392 assert_return(callback, -EINVAL);
2393 assert_return(!bus_pid_changed(bus), -ECHILD);
2395 f = new0(struct filter_callback, 1);
2398 f->callback = callback;
2399 f->userdata = userdata;
2401 bus->filter_callbacks_modified = true;
2402 LIST_PREPEND(callbacks, bus->filter_callbacks, f);
2406 _public_ int sd_bus_remove_filter(sd_bus *bus,
2407 sd_bus_message_handler_t callback,
2410 struct filter_callback *f;
2412 assert_return(bus, -EINVAL);
2413 assert_return(callback, -EINVAL);
2414 assert_return(!bus_pid_changed(bus), -ECHILD);
2416 LIST_FOREACH(callbacks, f, bus->filter_callbacks) {
2417 if (f->callback == callback && f->userdata == userdata) {
2418 bus->filter_callbacks_modified = true;
2419 LIST_REMOVE(callbacks, bus->filter_callbacks, f);
2428 _public_ int sd_bus_add_match(sd_bus *bus,
2430 sd_bus_message_handler_t callback,
2433 struct bus_match_component *components = NULL;
2434 unsigned n_components = 0;
2435 uint64_t cookie = 0;
2438 assert_return(bus, -EINVAL);
2439 assert_return(match, -EINVAL);
2440 assert_return(!bus_pid_changed(bus), -ECHILD);
2442 r = bus_match_parse(match, &components, &n_components);
2446 if (bus->bus_client) {
2447 cookie = ++bus->match_cookie;
2449 r = bus_add_match_internal(bus, match, components, n_components, cookie);
2454 bus->match_callbacks_modified = true;
2455 r = bus_match_add(&bus->match_callbacks, components, n_components, callback, userdata, cookie, NULL);
2457 if (bus->bus_client)
2458 bus_remove_match_internal(bus, match, cookie);
2462 bus_match_parse_free(components, n_components);
2466 _public_ int sd_bus_remove_match(sd_bus *bus,
2468 sd_bus_message_handler_t callback,
2471 struct bus_match_component *components = NULL;
2472 unsigned n_components = 0;
2474 uint64_t cookie = 0;
2476 assert_return(bus, -EINVAL);
2477 assert_return(match, -EINVAL);
2478 assert_return(!bus_pid_changed(bus), -ECHILD);
2480 r = bus_match_parse(match, &components, &n_components);
2484 bus->match_callbacks_modified = true;
2485 r = bus_match_remove(&bus->match_callbacks, components, n_components, callback, userdata, &cookie);
2487 if (bus->bus_client)
2488 q = bus_remove_match_internal(bus, match, cookie);
2490 bus_match_parse_free(components, n_components);
2492 return r < 0 ? r : q;
2495 bool bus_pid_changed(sd_bus *bus) {
2498 /* We don't support people creating a bus connection and
2499 * keeping it around over a fork(). Let's complain. */
2501 return bus->original_pid != getpid();
2504 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
2505 sd_bus *bus = userdata;
2510 r = sd_bus_process(bus, NULL);
2517 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
2518 sd_bus *bus = userdata;
2523 r = sd_bus_process(bus, NULL);
2530 static int prepare_callback(sd_event_source *s, void *userdata) {
2531 sd_bus *bus = userdata;
2538 e = sd_bus_get_events(bus);
2542 if (bus->output_fd != bus->input_fd) {
2544 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
2548 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
2552 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
2557 r = sd_bus_get_timeout(bus, &until);
2563 j = sd_event_source_set_time(bus->time_event_source, until);
2568 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
2575 static int quit_callback(sd_event_source *event, void *userdata) {
2576 sd_bus *bus = userdata;
2585 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
2588 assert_return(bus, -EINVAL);
2589 assert_return(!bus->event, -EBUSY);
2591 assert(!bus->input_io_event_source);
2592 assert(!bus->output_io_event_source);
2593 assert(!bus->time_event_source);
2596 bus->event = sd_event_ref(event);
2598 r = sd_event_default(&bus->event);
2603 r = sd_event_add_io(bus->event, bus->input_fd, 0, io_callback, bus, &bus->input_io_event_source);
2607 r = sd_event_source_set_priority(bus->input_io_event_source, priority);
2611 if (bus->output_fd != bus->input_fd) {
2612 r = sd_event_add_io(bus->event, bus->output_fd, 0, io_callback, bus, &bus->output_io_event_source);
2616 r = sd_event_source_set_priority(bus->output_io_event_source, priority);
2621 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
2625 r = sd_event_add_monotonic(bus->event, 0, 0, time_callback, bus, &bus->time_event_source);
2629 r = sd_event_source_set_priority(bus->time_event_source, priority);
2633 r = sd_event_add_quit(bus->event, quit_callback, bus, &bus->quit_event_source);
2640 sd_bus_detach_event(bus);
2644 _public_ int sd_bus_detach_event(sd_bus *bus) {
2645 assert_return(bus, -EINVAL);
2646 assert_return(bus->event, -ENXIO);
2648 if (bus->input_io_event_source) {
2649 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
2650 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
2653 if (bus->output_io_event_source) {
2654 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
2655 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
2658 if (bus->time_event_source) {
2659 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
2660 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
2663 if (bus->quit_event_source) {
2664 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
2665 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
2669 bus->event = sd_event_unref(bus->event);
2674 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
2675 assert_return(bus, NULL);
2680 _public_ sd_bus_message* sd_bus_get_current(sd_bus *bus) {
2681 assert_return(bus, NULL);
2683 return bus->current;
2686 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
2691 assert(default_bus);
2694 return !!*default_bus;
2697 *ret = sd_bus_ref(*default_bus);
2705 b->default_bus_ptr = default_bus;
2713 _public_ int sd_bus_default_system(sd_bus **ret) {
2714 static __thread sd_bus *default_system_bus = NULL;
2716 return bus_default(sd_bus_open_system, &default_system_bus, ret);
2719 _public_ int sd_bus_default_user(sd_bus **ret) {
2720 static __thread sd_bus *default_user_bus = NULL;
2722 return bus_default(sd_bus_open_user, &default_user_bus, ret);
2725 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
2726 assert_return(b, -EINVAL);
2727 assert_return(tid, -EINVAL);
2728 assert_return(!bus_pid_changed(b), -ECHILD);
2736 return sd_event_get_tid(b->event, tid);
2741 _public_ char *sd_bus_label_escape(const char *s) {
2745 assert_return(s, NULL);
2747 /* Escapes all chars that D-Bus' object path cannot deal
2748 * with. Can be reversed with bus_path_unescape(). We special
2749 * case the empty string. */
2754 r = new(char, strlen(s)*3 + 1);
2758 for (f = s, t = r; *f; f++) {
2760 /* Escape everything that is not a-zA-Z0-9. We also
2761 * escape 0-9 if it's the first character */
2763 if (!(*f >= 'A' && *f <= 'Z') &&
2764 !(*f >= 'a' && *f <= 'z') &&
2765 !(f > s && *f >= '0' && *f <= '9')) {
2767 *(t++) = hexchar(*f >> 4);
2768 *(t++) = hexchar(*f);
2778 _public_ char *sd_bus_label_unescape(const char *f) {
2781 assert_return(f, NULL);
2783 /* Special case for the empty string */
2787 r = new(char, strlen(f) + 1);
2791 for (t = r; *f; f++) {
2796 if ((a = unhexchar(f[1])) < 0 ||
2797 (b = unhexchar(f[2])) < 0) {
2798 /* Invalid escape code, let's take it literal then */
2801 *(t++) = (char) ((a << 4) | b);
2813 _public_ int sd_bus_get_peer_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **ret) {
2818 assert_return(bus, -EINVAL);
2819 assert_return(mask <= _SD_BUS_CREDS_ALL, -ENOTSUP);
2820 assert_return(ret, -EINVAL);
2821 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
2822 assert_return(!bus_pid_changed(bus), -ECHILD);
2823 assert_return(!bus->is_kernel, -ENOTSUP);
2825 if (!bus->ucred_valid && !isempty(bus->label))
2828 c = bus_creds_new();
2832 if (bus->ucred_valid) {
2833 pid = c->pid = bus->ucred.pid;
2834 c->uid = bus->ucred.uid;
2835 c->gid = bus->ucred.gid;
2837 c->mask |= (SD_BUS_CREDS_UID | SD_BUS_CREDS_PID | SD_BUS_CREDS_GID) & mask;
2840 if (!isempty(bus->label) && (mask & SD_BUS_CREDS_SELINUX_CONTEXT)) {
2841 c->label = strdup(bus->label);
2843 sd_bus_creds_unref(c);
2847 c->mask |= SD_BUS_CREDS_SELINUX_CONTEXT;
2850 r = bus_creds_add_more(c, mask, pid, 0);