chiark / gitweb /
sd-bus,log: remove unused variables
[elogind.git] / src / libsystemd / sd-bus / sd-bus.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2013 Lennart Poettering
7
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.
12
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.
17
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/>.
20 ***/
21
22 #include <endian.h>
23 #include <assert.h>
24 #include <stdlib.h>
25 #include <unistd.h>
26 #include <netdb.h>
27 #include <sys/poll.h>
28 #include <byteswap.h>
29 #include <sys/mman.h>
30 #include <pthread.h>
31
32 #include "util.h"
33 #include "macro.h"
34 #include "strv.h"
35 #include "set.h"
36 #include "missing.h"
37 #include "def.h"
38 #include "cgroup-util.h"
39 #include "bus-label.h"
40
41 #include "sd-bus.h"
42 #include "bus-internal.h"
43 #include "bus-message.h"
44 #include "bus-type.h"
45 #include "bus-socket.h"
46 #include "bus-kernel.h"
47 #include "bus-control.h"
48 #include "bus-introspect.h"
49 #include "bus-signature.h"
50 #include "bus-objects.h"
51 #include "bus-util.h"
52 #include "bus-container.h"
53 #include "bus-protocol.h"
54 #include "bus-track.h"
55 #include "bus-slot.h"
56
57 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
58 static int attach_io_events(sd_bus *b);
59 static void detach_io_events(sd_bus *b);
60
61 static void bus_close_fds(sd_bus *b) {
62         assert(b);
63
64         detach_io_events(b);
65
66         if (b->input_fd >= 0)
67                 safe_close(b->input_fd);
68
69         if (b->output_fd >= 0 && b->output_fd != b->input_fd)
70                 safe_close(b->output_fd);
71
72         b->input_fd = b->output_fd = -1;
73 }
74
75 static void bus_reset_queues(sd_bus *b) {
76         assert(b);
77
78         while (b->rqueue_size > 0)
79                 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
80
81         free(b->rqueue);
82         b->rqueue = NULL;
83         b->rqueue_allocated = 0;
84
85         while (b->wqueue_size > 0)
86                 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
87
88         free(b->wqueue);
89         b->wqueue = NULL;
90         b->wqueue_allocated = 0;
91 }
92
93 static void bus_free(sd_bus *b) {
94         sd_bus_slot *s;
95
96         assert(b);
97         assert(!b->track_queue);
98
99         b->state = BUS_CLOSED;
100
101         sd_bus_detach_event(b);
102
103         while ((s = b->slots)) {
104                 /* At this point only floating slots can still be
105                  * around, because the non-floating ones keep a
106                  * reference to the bus, and we thus couldn't be
107                  * destructing right now... We forcibly disconnect the
108                  * slots here, so that they still can be referenced by
109                  * apps, but are dead. */
110
111                 assert(s->floating);
112                 bus_slot_disconnect(s);
113                 sd_bus_slot_unref(s);
114         }
115
116         if (b->default_bus_ptr)
117                 *b->default_bus_ptr = NULL;
118
119         bus_close_fds(b);
120
121         if (b->kdbus_buffer)
122                 munmap(b->kdbus_buffer, KDBUS_POOL_SIZE);
123
124         free(b->rbuffer);
125         free(b->unique_name);
126         free(b->auth_buffer);
127         free(b->address);
128         free(b->kernel);
129         free(b->machine);
130         free(b->fake_label);
131         free(b->cgroup_root);
132         free(b->connection_name);
133
134         free(b->exec_path);
135         strv_free(b->exec_argv);
136
137         close_many(b->fds, b->n_fds);
138         free(b->fds);
139
140         bus_reset_queues(b);
141
142         hashmap_free_free(b->reply_callbacks);
143         prioq_free(b->reply_callbacks_prioq);
144
145         bus_match_free(&b->match_callbacks);
146
147         hashmap_free_free(b->vtable_methods);
148         hashmap_free_free(b->vtable_properties);
149
150         assert(hashmap_isempty(b->nodes));
151         hashmap_free(b->nodes);
152
153         bus_kernel_flush_memfd(b);
154
155         assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
156
157         free(b);
158 }
159
160 _public_ int sd_bus_new(sd_bus **ret) {
161         sd_bus *r;
162
163         assert_return(ret, -EINVAL);
164
165         r = new0(sd_bus, 1);
166         if (!r)
167                 return -ENOMEM;
168
169         r->n_ref = REFCNT_INIT;
170         r->input_fd = r->output_fd = -1;
171         r->message_version = 1;
172         r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
173         r->hello_flags |= KDBUS_HELLO_ACCEPT_FD;
174         r->attach_flags |= KDBUS_ATTACH_NAMES;
175         r->original_pid = getpid();
176
177         assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
178
179         /* We guarantee that wqueue always has space for at least one
180          * entry */
181         if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
182                 free(r);
183                 return -ENOMEM;
184         }
185
186         *ret = r;
187         return 0;
188 }
189
190 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
191         char *a;
192
193         assert_return(bus, -EINVAL);
194         assert_return(bus->state == BUS_UNSET, -EPERM);
195         assert_return(address, -EINVAL);
196         assert_return(!bus_pid_changed(bus), -ECHILD);
197
198         a = strdup(address);
199         if (!a)
200                 return -ENOMEM;
201
202         free(bus->address);
203         bus->address = a;
204
205         return 0;
206 }
207
208 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
209         assert_return(bus, -EINVAL);
210         assert_return(bus->state == BUS_UNSET, -EPERM);
211         assert_return(input_fd >= 0, -EINVAL);
212         assert_return(output_fd >= 0, -EINVAL);
213         assert_return(!bus_pid_changed(bus), -ECHILD);
214
215         bus->input_fd = input_fd;
216         bus->output_fd = output_fd;
217         return 0;
218 }
219
220 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
221         char *p, **a;
222
223         assert_return(bus, -EINVAL);
224         assert_return(bus->state == BUS_UNSET, -EPERM);
225         assert_return(path, -EINVAL);
226         assert_return(!strv_isempty(argv), -EINVAL);
227         assert_return(!bus_pid_changed(bus), -ECHILD);
228
229         p = strdup(path);
230         if (!p)
231                 return -ENOMEM;
232
233         a = strv_copy(argv);
234         if (!a) {
235                 free(p);
236                 return -ENOMEM;
237         }
238
239         free(bus->exec_path);
240         strv_free(bus->exec_argv);
241
242         bus->exec_path = p;
243         bus->exec_argv = a;
244
245         return 0;
246 }
247
248 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
249         assert_return(bus, -EINVAL);
250         assert_return(bus->state == BUS_UNSET, -EPERM);
251         assert_return(!bus_pid_changed(bus), -ECHILD);
252
253         bus->bus_client = !!b;
254         return 0;
255 }
256
257 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
258         assert_return(bus, -EINVAL);
259         assert_return(bus->state == BUS_UNSET, -EPERM);
260         assert_return(!bus_pid_changed(bus), -ECHILD);
261
262         SET_FLAG(bus->hello_flags, KDBUS_HELLO_MONITOR, b);
263         return 0;
264 }
265
266 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
267         assert_return(bus, -EINVAL);
268         assert_return(bus->state == BUS_UNSET, -EPERM);
269         assert_return(!bus_pid_changed(bus), -ECHILD);
270
271         SET_FLAG(bus->hello_flags, KDBUS_HELLO_ACCEPT_FD, b);
272         return 0;
273 }
274
275 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
276         assert_return(bus, -EINVAL);
277         assert_return(bus->state == BUS_UNSET, -EPERM);
278         assert_return(!bus_pid_changed(bus), -ECHILD);
279
280         SET_FLAG(bus->attach_flags, KDBUS_ATTACH_TIMESTAMP, b);
281         return 0;
282 }
283
284 _public_ int sd_bus_negotiate_creds(sd_bus *bus, uint64_t mask) {
285         assert_return(bus, -EINVAL);
286         assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
287         assert_return(bus->state == BUS_UNSET, -EPERM);
288         assert_return(!bus_pid_changed(bus), -ECHILD);
289
290         /* The well knowns we need unconditionally, so that matches can work */
291         bus->creds_mask = mask | SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
292
293         return kdbus_translate_attach_flags(bus->creds_mask, &bus->attach_flags);
294 }
295
296 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
297         assert_return(bus, -EINVAL);
298         assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
299         assert_return(bus->state == BUS_UNSET, -EPERM);
300         assert_return(!bus_pid_changed(bus), -ECHILD);
301
302         bus->is_server = !!b;
303         bus->server_id = server_id;
304         return 0;
305 }
306
307 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
308         assert_return(bus, -EINVAL);
309         assert_return(bus->state == BUS_UNSET, -EPERM);
310         assert_return(!bus_pid_changed(bus), -ECHILD);
311
312         bus->anonymous_auth = !!b;
313         return 0;
314 }
315
316 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
317         assert_return(bus, -EINVAL);
318         assert_return(bus->state == BUS_UNSET, -EPERM);
319         assert_return(!bus_pid_changed(bus), -ECHILD);
320
321         bus->trusted = !!b;
322         return 0;
323 }
324
325 _public_ int sd_bus_set_name(sd_bus *bus, const char *name) {
326         char *n;
327
328         assert_return(bus, -EINVAL);
329         assert_return(name, -EINVAL);
330         assert_return(bus->state == BUS_UNSET, -EPERM);
331         assert_return(!bus_pid_changed(bus), -ECHILD);
332
333         n = strdup(name);
334         if (!n)
335                 return -ENOMEM;
336
337         free(bus->connection_name);
338         bus->connection_name = n;
339
340         return 0;
341 }
342
343 static int hello_callback(sd_bus *bus, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
344         const char *s;
345         int r;
346
347         assert(bus);
348         assert(bus->state == BUS_HELLO || bus->state == BUS_CLOSING);
349         assert(reply);
350
351         r = sd_bus_message_get_errno(reply);
352         if (r < 0)
353                 return r;
354         if (r > 0)
355                 return -r;
356
357         r = sd_bus_message_read(reply, "s", &s);
358         if (r < 0)
359                 return r;
360
361         if (!service_name_is_valid(s) || s[0] != ':')
362                 return -EBADMSG;
363
364         bus->unique_name = strdup(s);
365         if (!bus->unique_name)
366                 return -ENOMEM;
367
368         if (bus->state == BUS_HELLO)
369                 bus->state = BUS_RUNNING;
370
371         return 1;
372 }
373
374 static int bus_send_hello(sd_bus *bus) {
375         _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
376         int r;
377
378         assert(bus);
379
380         if (!bus->bus_client || bus->is_kernel)
381                 return 0;
382
383         r = sd_bus_message_new_method_call(
384                         bus,
385                         &m,
386                         "org.freedesktop.DBus",
387                         "/org/freedesktop/DBus",
388                         "org.freedesktop.DBus",
389                         "Hello");
390         if (r < 0)
391                 return r;
392
393         return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
394 }
395
396 int bus_start_running(sd_bus *bus) {
397         assert(bus);
398
399         if (bus->bus_client && !bus->is_kernel) {
400                 bus->state = BUS_HELLO;
401                 return 1;
402         }
403
404         bus->state = BUS_RUNNING;
405         return 1;
406 }
407
408 static int parse_address_key(const char **p, const char *key, char **value) {
409         size_t l, n = 0, allocated = 0;
410         const char *a;
411         char *r = NULL;
412
413         assert(p);
414         assert(*p);
415         assert(value);
416
417         if (key) {
418                 l = strlen(key);
419                 if (strncmp(*p, key, l) != 0)
420                         return 0;
421
422                 if ((*p)[l] != '=')
423                         return 0;
424
425                 if (*value)
426                         return -EINVAL;
427
428                 a = *p + l + 1;
429         } else
430                 a = *p;
431
432         while (*a != ';' && *a != ',' && *a != 0) {
433                 char c;
434
435                 if (*a == '%') {
436                         int x, y;
437
438                         x = unhexchar(a[1]);
439                         if (x < 0) {
440                                 free(r);
441                                 return x;
442                         }
443
444                         y = unhexchar(a[2]);
445                         if (y < 0) {
446                                 free(r);
447                                 return y;
448                         }
449
450                         c = (char) ((x << 4) | y);
451                         a += 3;
452                 } else {
453                         c = *a;
454                         a++;
455                 }
456
457                 if (!GREEDY_REALLOC(r, allocated, n + 2))
458                         return -ENOMEM;
459
460                 r[n++] = c;
461         }
462
463         if (!r) {
464                 r = strdup("");
465                 if (!r)
466                         return -ENOMEM;
467         } else
468                 r[n] = 0;
469
470         if (*a == ',')
471                 a++;
472
473         *p = a;
474
475         free(*value);
476         *value = r;
477
478         return 1;
479 }
480
481 static void skip_address_key(const char **p) {
482         assert(p);
483         assert(*p);
484
485         *p += strcspn(*p, ",");
486
487         if (**p == ',')
488                 (*p) ++;
489 }
490
491 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
492         _cleanup_free_ char *path = NULL, *abstract = NULL;
493         size_t l;
494         int r;
495
496         assert(b);
497         assert(p);
498         assert(*p);
499         assert(guid);
500
501         while (**p != 0 && **p != ';') {
502                 r = parse_address_key(p, "guid", guid);
503                 if (r < 0)
504                         return r;
505                 else if (r > 0)
506                         continue;
507
508                 r = parse_address_key(p, "path", &path);
509                 if (r < 0)
510                         return r;
511                 else if (r > 0)
512                         continue;
513
514                 r = parse_address_key(p, "abstract", &abstract);
515                 if (r < 0)
516                         return r;
517                 else if (r > 0)
518                         continue;
519
520                 skip_address_key(p);
521         }
522
523         if (!path && !abstract)
524                 return -EINVAL;
525
526         if (path && abstract)
527                 return -EINVAL;
528
529         if (path) {
530                 l = strlen(path);
531                 if (l > sizeof(b->sockaddr.un.sun_path))
532                         return -E2BIG;
533
534                 b->sockaddr.un.sun_family = AF_UNIX;
535                 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
536                 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
537         } else if (abstract) {
538                 l = strlen(abstract);
539                 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
540                         return -E2BIG;
541
542                 b->sockaddr.un.sun_family = AF_UNIX;
543                 b->sockaddr.un.sun_path[0] = 0;
544                 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
545                 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
546         }
547
548         return 0;
549 }
550
551 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
552         _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
553         int r;
554         struct addrinfo *result, hints = {
555                 .ai_socktype = SOCK_STREAM,
556                 .ai_flags = AI_ADDRCONFIG,
557         };
558
559         assert(b);
560         assert(p);
561         assert(*p);
562         assert(guid);
563
564         while (**p != 0 && **p != ';') {
565                 r = parse_address_key(p, "guid", guid);
566                 if (r < 0)
567                         return r;
568                 else if (r > 0)
569                         continue;
570
571                 r = parse_address_key(p, "host", &host);
572                 if (r < 0)
573                         return r;
574                 else if (r > 0)
575                         continue;
576
577                 r = parse_address_key(p, "port", &port);
578                 if (r < 0)
579                         return r;
580                 else if (r > 0)
581                         continue;
582
583                 r = parse_address_key(p, "family", &family);
584                 if (r < 0)
585                         return r;
586                 else if (r > 0)
587                         continue;
588
589                 skip_address_key(p);
590         }
591
592         if (!host || !port)
593                 return -EINVAL;
594
595         if (family) {
596                 if (streq(family, "ipv4"))
597                         hints.ai_family = AF_INET;
598                 else if (streq(family, "ipv6"))
599                         hints.ai_family = AF_INET6;
600                 else
601                         return -EINVAL;
602         }
603
604         r = getaddrinfo(host, port, &hints, &result);
605         if (r == EAI_SYSTEM)
606                 return -errno;
607         else if (r != 0)
608                 return -EADDRNOTAVAIL;
609
610         memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
611         b->sockaddr_size = result->ai_addrlen;
612
613         freeaddrinfo(result);
614
615         return 0;
616 }
617
618 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
619         char *path = NULL;
620         unsigned n_argv = 0, j;
621         char **argv = NULL;
622         size_t allocated = 0;
623         int r;
624
625         assert(b);
626         assert(p);
627         assert(*p);
628         assert(guid);
629
630         while (**p != 0 && **p != ';') {
631                 r = parse_address_key(p, "guid", guid);
632                 if (r < 0)
633                         goto fail;
634                 else if (r > 0)
635                         continue;
636
637                 r = parse_address_key(p, "path", &path);
638                 if (r < 0)
639                         goto fail;
640                 else if (r > 0)
641                         continue;
642
643                 if (startswith(*p, "argv")) {
644                         unsigned ul;
645
646                         errno = 0;
647                         ul = strtoul(*p + 4, (char**) p, 10);
648                         if (errno > 0 || **p != '=' || ul > 256) {
649                                 r = -EINVAL;
650                                 goto fail;
651                         }
652
653                         (*p) ++;
654
655                         if (ul >= n_argv) {
656                                 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
657                                         r = -ENOMEM;
658                                         goto fail;
659                                 }
660
661                                 n_argv = ul + 1;
662                         }
663
664                         r = parse_address_key(p, NULL, argv + ul);
665                         if (r < 0)
666                                 goto fail;
667
668                         continue;
669                 }
670
671                 skip_address_key(p);
672         }
673
674         if (!path) {
675                 r = -EINVAL;
676                 goto fail;
677         }
678
679         /* Make sure there are no holes in the array, with the
680          * exception of argv[0] */
681         for (j = 1; j < n_argv; j++)
682                 if (!argv[j]) {
683                         r = -EINVAL;
684                         goto fail;
685                 }
686
687         if (argv && argv[0] == NULL) {
688                 argv[0] = strdup(path);
689                 if (!argv[0]) {
690                         r = -ENOMEM;
691                         goto fail;
692                 }
693         }
694
695         b->exec_path = path;
696         b->exec_argv = argv;
697         return 0;
698
699 fail:
700         for (j = 0; j < n_argv; j++)
701                 free(argv[j]);
702
703         free(argv);
704         free(path);
705         return r;
706 }
707
708 static int parse_kernel_address(sd_bus *b, const char **p, char **guid) {
709         _cleanup_free_ char *path = NULL;
710         int r;
711
712         assert(b);
713         assert(p);
714         assert(*p);
715         assert(guid);
716
717         while (**p != 0 && **p != ';') {
718                 r = parse_address_key(p, "guid", guid);
719                 if (r < 0)
720                         return r;
721                 else if (r > 0)
722                         continue;
723
724                 r = parse_address_key(p, "path", &path);
725                 if (r < 0)
726                         return r;
727                 else if (r > 0)
728                         continue;
729
730                 skip_address_key(p);
731         }
732
733         if (!path)
734                 return -EINVAL;
735
736         free(b->kernel);
737         b->kernel = path;
738         path = NULL;
739
740         return 0;
741 }
742
743 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
744         _cleanup_free_ char *machine = NULL;
745         int r;
746
747         assert(b);
748         assert(p);
749         assert(*p);
750         assert(guid);
751
752         while (**p != 0 && **p != ';') {
753                 r = parse_address_key(p, "guid", guid);
754                 if (r < 0)
755                         return r;
756                 else if (r > 0)
757                         continue;
758
759                 r = parse_address_key(p, "machine", &machine);
760                 if (r < 0)
761                         return r;
762                 else if (r > 0)
763                         continue;
764
765                 skip_address_key(p);
766         }
767
768         if (!machine)
769                 return -EINVAL;
770
771         if (!filename_is_safe(machine))
772                 return -EINVAL;
773
774         free(b->machine);
775         b->machine = machine;
776         machine = NULL;
777
778         b->sockaddr.un.sun_family = AF_UNIX;
779         strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
780         b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + strlen("/var/run/dbus/system_bus_socket");
781
782         return 0;
783 }
784
785 static int parse_container_kernel_address(sd_bus *b, const char **p, char **guid) {
786         _cleanup_free_ char *machine = NULL;
787         int r;
788
789         assert(b);
790         assert(p);
791         assert(*p);
792         assert(guid);
793
794         while (**p != 0 && **p != ';') {
795                 r = parse_address_key(p, "guid", guid);
796                 if (r < 0)
797                         return r;
798                 else if (r > 0)
799                         continue;
800
801                 r = parse_address_key(p, "machine", &machine);
802                 if (r < 0)
803                         return r;
804                 else if (r > 0)
805                         continue;
806
807                 skip_address_key(p);
808         }
809
810         if (!machine)
811                 return -EINVAL;
812
813         if (!filename_is_safe(machine))
814                 return -EINVAL;
815
816         free(b->machine);
817         b->machine = machine;
818         machine = NULL;
819
820         free(b->kernel);
821         b->kernel = strdup("/dev/kdbus/0-system/bus");
822         if (!b->kernel)
823                 return -ENOMEM;
824
825         return 0;
826 }
827
828 static void bus_reset_parsed_address(sd_bus *b) {
829         assert(b);
830
831         zero(b->sockaddr);
832         b->sockaddr_size = 0;
833         strv_free(b->exec_argv);
834         free(b->exec_path);
835         b->exec_path = NULL;
836         b->exec_argv = NULL;
837         b->server_id = SD_ID128_NULL;
838         free(b->kernel);
839         b->kernel = NULL;
840         free(b->machine);
841         b->machine = NULL;
842 }
843
844 static int bus_parse_next_address(sd_bus *b) {
845         _cleanup_free_ char *guid = NULL;
846         const char *a;
847         int r;
848
849         assert(b);
850
851         if (!b->address)
852                 return 0;
853         if (b->address[b->address_index] == 0)
854                 return 0;
855
856         bus_reset_parsed_address(b);
857
858         a = b->address + b->address_index;
859
860         while (*a != 0) {
861
862                 if (*a == ';') {
863                         a++;
864                         continue;
865                 }
866
867                 if (startswith(a, "unix:")) {
868                         a += 5;
869
870                         r = parse_unix_address(b, &a, &guid);
871                         if (r < 0)
872                                 return r;
873                         break;
874
875                 } else if (startswith(a, "tcp:")) {
876
877                         a += 4;
878                         r = parse_tcp_address(b, &a, &guid);
879                         if (r < 0)
880                                 return r;
881
882                         break;
883
884                 } else if (startswith(a, "unixexec:")) {
885
886                         a += 9;
887                         r = parse_exec_address(b, &a, &guid);
888                         if (r < 0)
889                                 return r;
890
891                         break;
892
893                 } else if (startswith(a, "kernel:")) {
894
895                         a += 7;
896                         r = parse_kernel_address(b, &a, &guid);
897                         if (r < 0)
898                                 return r;
899
900                         break;
901                 } else if (startswith(a, "x-container-unix:")) {
902
903                         a += 17;
904                         r = parse_container_unix_address(b, &a, &guid);
905                         if (r < 0)
906                                 return r;
907
908                         break;
909                 } else if (startswith(a, "x-container-kernel:")) {
910
911                         a += 19;
912                         r = parse_container_kernel_address(b, &a, &guid);
913                         if (r < 0)
914                                 return r;
915
916                         break;
917                 }
918
919                 a = strchr(a, ';');
920                 if (!a)
921                         return 0;
922         }
923
924         if (guid) {
925                 r = sd_id128_from_string(guid, &b->server_id);
926                 if (r < 0)
927                         return r;
928         }
929
930         b->address_index = a - b->address;
931         return 1;
932 }
933
934 static int bus_start_address(sd_bus *b) {
935         int r;
936
937         assert(b);
938
939         for (;;) {
940                 bool skipped = false;
941
942                 bus_close_fds(b);
943
944                 if (b->exec_path)
945                         r = bus_socket_exec(b);
946                 else if (b->machine && b->kernel)
947                         r = bus_container_connect_kernel(b);
948                 else if (b->machine && b->sockaddr.sa.sa_family != AF_UNSPEC)
949                         r = bus_container_connect_socket(b);
950                 else if (b->kernel)
951                         r = bus_kernel_connect(b);
952                 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
953                         r = bus_socket_connect(b);
954                 else
955                         skipped = true;
956
957                 if (!skipped) {
958                         if (r >= 0) {
959                                 r = attach_io_events(b);
960                                 if (r >= 0)
961                                         return r;
962                         }
963
964                         b->last_connect_error = -r;
965                 }
966
967                 r = bus_parse_next_address(b);
968                 if (r < 0)
969                         return r;
970                 if (r == 0)
971                         return b->last_connect_error ? -b->last_connect_error : -ECONNREFUSED;
972         }
973 }
974
975 int bus_next_address(sd_bus *b) {
976         assert(b);
977
978         bus_reset_parsed_address(b);
979         return bus_start_address(b);
980 }
981
982 static int bus_start_fd(sd_bus *b) {
983         struct stat st;
984         int r;
985
986         assert(b);
987         assert(b->input_fd >= 0);
988         assert(b->output_fd >= 0);
989
990         r = fd_nonblock(b->input_fd, true);
991         if (r < 0)
992                 return r;
993
994         r = fd_cloexec(b->input_fd, true);
995         if (r < 0)
996                 return r;
997
998         if (b->input_fd != b->output_fd) {
999                 r = fd_nonblock(b->output_fd, true);
1000                 if (r < 0)
1001                         return r;
1002
1003                 r = fd_cloexec(b->output_fd, true);
1004                 if (r < 0)
1005                         return r;
1006         }
1007
1008         if (fstat(b->input_fd, &st) < 0)
1009                 return -errno;
1010
1011         if (S_ISCHR(b->input_fd))
1012                 return bus_kernel_take_fd(b);
1013         else
1014                 return bus_socket_take_fd(b);
1015 }
1016
1017 _public_ int sd_bus_start(sd_bus *bus) {
1018         int r;
1019
1020         assert_return(bus, -EINVAL);
1021         assert_return(bus->state == BUS_UNSET, -EPERM);
1022         assert_return(!bus_pid_changed(bus), -ECHILD);
1023
1024         bus->state = BUS_OPENING;
1025
1026         if (bus->is_server && bus->bus_client)
1027                 return -EINVAL;
1028
1029         if (bus->input_fd >= 0)
1030                 r = bus_start_fd(bus);
1031         else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->kernel || bus->machine)
1032                 r = bus_start_address(bus);
1033         else
1034                 return -EINVAL;
1035
1036         if (r < 0) {
1037                 sd_bus_close(bus);
1038                 return r;
1039         }
1040
1041         return bus_send_hello(bus);
1042 }
1043
1044 _public_ int sd_bus_open(sd_bus **ret) {
1045         const char *e;
1046         sd_bus *b;
1047         int r;
1048
1049         assert_return(ret, -EINVAL);
1050
1051         /* Let's connect to the starter bus if it is set, and
1052          * otherwise to the bus that is appropropriate for the scope
1053          * we are running in */
1054
1055         e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1056         if (e) {
1057                 if (streq(e, "system"))
1058                         return sd_bus_open_system(ret);
1059                 else if (STR_IN_SET(e, "session", "user"))
1060                         return sd_bus_open_user(ret);
1061         }
1062
1063         e = secure_getenv("DBUS_STARTER_ADDRESS");
1064         if (!e) {
1065                 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1066                         return sd_bus_open_user(ret);
1067                 else
1068                         return sd_bus_open_system(ret);
1069         }
1070
1071         r = sd_bus_new(&b);
1072         if (r < 0)
1073                 return r;
1074
1075         r = sd_bus_set_address(b, e);
1076         if (r < 0)
1077                 goto fail;
1078
1079         b->bus_client = true;
1080
1081         /* We don't know whether the bus is trusted or not, so better
1082          * be safe, and authenticate everything */
1083         b->trusted = false;
1084         b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1085
1086         r = sd_bus_start(b);
1087         if (r < 0)
1088                 goto fail;
1089
1090         *ret = b;
1091         return 0;
1092
1093 fail:
1094         bus_free(b);
1095         return r;
1096 }
1097
1098 int bus_set_address_system(sd_bus *b) {
1099         const char *e;
1100         assert(b);
1101
1102         e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1103         if (e)
1104                 return sd_bus_set_address(b, e);
1105
1106         return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_PATH);
1107 }
1108
1109 _public_ int sd_bus_open_system(sd_bus **ret) {
1110         sd_bus *b;
1111         int r;
1112
1113         assert_return(ret, -EINVAL);
1114
1115         r = sd_bus_new(&b);
1116         if (r < 0)
1117                 return r;
1118
1119         r = bus_set_address_system(b);
1120         if (r < 0)
1121                 goto fail;
1122
1123         b->bus_client = true;
1124         b->is_system = true;
1125
1126         /* Let's do per-method access control on the system bus. We
1127          * need the caller's UID and capability set for that. */
1128         b->trusted = false;
1129         b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1130
1131         r = sd_bus_start(b);
1132         if (r < 0)
1133                 goto fail;
1134
1135         *ret = b;
1136         return 0;
1137
1138 fail:
1139         bus_free(b);
1140         return r;
1141 }
1142
1143 int bus_set_address_user(sd_bus *b) {
1144         const char *e;
1145
1146         assert(b);
1147
1148         e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1149         if (e)
1150                 return sd_bus_set_address(b, e);
1151
1152         e = secure_getenv("XDG_RUNTIME_DIR");
1153         if (e) {
1154                 _cleanup_free_ char *ee = NULL;
1155
1156                 ee = bus_address_escape(e);
1157                 if (!ee)
1158                         return -ENOMEM;
1159
1160 #ifdef ENABLE_KDBUS
1161                 asprintf(&b->address, KERNEL_USER_BUS_FMT ";" UNIX_USER_BUS_FMT, getuid(), ee);
1162 #else
1163                 asprintf(&b->address, UNIX_USER_BUS_FMT, ee);
1164 #endif
1165         } else {
1166 #ifdef ENABLE_KDBUS
1167                 asprintf(&b->address, KERNEL_USER_BUS_FMT, getuid());
1168 #else
1169                 return -ECONNREFUSED;
1170 #endif
1171         }
1172
1173         if (!b->address)
1174                 return -ENOMEM;
1175
1176         return 0;
1177 }
1178
1179 _public_ int sd_bus_open_user(sd_bus **ret) {
1180         sd_bus *b;
1181         int r;
1182
1183         assert_return(ret, -EINVAL);
1184
1185         r = sd_bus_new(&b);
1186         if (r < 0)
1187                 return r;
1188
1189         r = bus_set_address_user(b);
1190         if (r < 0)
1191                 return r;
1192
1193         b->bus_client = true;
1194         b->is_user = true;
1195
1196         /* We don't do any per-method access control on the user
1197          * bus. */
1198         b->trusted = true;
1199
1200         r = sd_bus_start(b);
1201         if (r < 0)
1202                 goto fail;
1203
1204         *ret = b;
1205         return 0;
1206
1207 fail:
1208         bus_free(b);
1209         return r;
1210 }
1211
1212 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1213         _cleanup_free_ char *e = NULL;
1214         char *m = NULL, *c = NULL;
1215
1216         assert(b);
1217         assert(host);
1218
1219         /* Let's see if we shall enter some container */
1220         m = strchr(host, ':');
1221         if (m) {
1222                 m++;
1223
1224                 /* Let's make sure this is not a port of some kind,
1225                  * and is a valid machine name. */
1226                 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1227                         char *t;
1228
1229                         /* Cut out the host part */
1230                         t = strndupa(host, m - host - 1);
1231                         e = bus_address_escape(t);
1232                         if (!e)
1233                                 return -ENOMEM;
1234
1235                         c = strappenda(",argv4=--machine=", m);
1236                 }
1237         }
1238
1239         if (!e) {
1240                 e = bus_address_escape(host);
1241                 if (!e)
1242                         return -ENOMEM;
1243         }
1244
1245         b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", c, NULL);
1246         if (!b->address)
1247                 return -ENOMEM;
1248
1249         return 0;
1250  }
1251
1252 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1253         sd_bus *bus;
1254         int r;
1255
1256         assert_return(host, -EINVAL);
1257         assert_return(ret, -EINVAL);
1258
1259         r = sd_bus_new(&bus);
1260         if (r < 0)
1261                 return r;
1262
1263         r = bus_set_address_system_remote(bus, host);
1264         if (r < 0)
1265                 goto fail;
1266
1267         bus->bus_client = true;
1268         bus->trusted = false;
1269
1270         r = sd_bus_start(bus);
1271         if (r < 0)
1272                 goto fail;
1273
1274         *ret = bus;
1275         return 0;
1276
1277 fail:
1278         bus_free(bus);
1279         return r;
1280 }
1281
1282 int bus_set_address_system_container(sd_bus *b, const char *machine) {
1283         _cleanup_free_ char *e = NULL;
1284
1285         assert(b);
1286         assert(machine);
1287
1288         e = bus_address_escape(machine);
1289         if (!e)
1290                 return -ENOMEM;
1291
1292 #ifdef ENABLE_KDBUS
1293         b->address = strjoin("x-container-kernel:machine=", e, ";x-container-unix:machine=", e, NULL);
1294 #else
1295         b->address = strjoin("x-container-unix:machine=", e, NULL);
1296 #endif
1297         if (!b->address)
1298                 return -ENOMEM;
1299
1300         return 0;
1301 }
1302
1303 _public_ int sd_bus_open_system_container(sd_bus **ret, const char *machine) {
1304         sd_bus *bus;
1305         int r;
1306
1307         assert_return(machine, -EINVAL);
1308         assert_return(ret, -EINVAL);
1309         assert_return(filename_is_safe(machine), -EINVAL);
1310
1311         r = sd_bus_new(&bus);
1312         if (r < 0)
1313                 return r;
1314
1315         r = bus_set_address_system_container(bus, machine);
1316         if (r < 0)
1317                 goto fail;
1318
1319         bus->bus_client = true;
1320         bus->trusted = false;
1321
1322         r = sd_bus_start(bus);
1323         if (r < 0)
1324                 goto fail;
1325
1326         *ret = bus;
1327         return 0;
1328
1329 fail:
1330         bus_free(bus);
1331         return r;
1332 }
1333
1334 _public_ void sd_bus_close(sd_bus *bus) {
1335
1336         if (!bus)
1337                 return;
1338         if (bus->state == BUS_CLOSED)
1339                 return;
1340         if (bus_pid_changed(bus))
1341                 return;
1342
1343         bus->state = BUS_CLOSED;
1344
1345         sd_bus_detach_event(bus);
1346
1347         /* Drop all queued messages so that they drop references to
1348          * the bus object and the bus may be freed */
1349         bus_reset_queues(bus);
1350
1351         if (!bus->is_kernel)
1352                 bus_close_fds(bus);
1353
1354         /* We'll leave the fd open in case this is a kernel bus, since
1355          * there might still be memblocks around that reference this
1356          * bus, and they might need to invoke the KDBUS_CMD_FREE
1357          * ioctl on the fd when they are freed. */
1358 }
1359
1360 static void bus_enter_closing(sd_bus *bus) {
1361         assert(bus);
1362
1363         if (bus->state != BUS_OPENING &&
1364             bus->state != BUS_AUTHENTICATING &&
1365             bus->state != BUS_HELLO &&
1366             bus->state != BUS_RUNNING)
1367                 return;
1368
1369         bus->state = BUS_CLOSING;
1370 }
1371
1372 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1373         assert_return(bus, NULL);
1374
1375         assert_se(REFCNT_INC(bus->n_ref) >= 2);
1376
1377         return bus;
1378 }
1379
1380 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1381         unsigned i;
1382
1383         if (!bus)
1384                 return NULL;
1385
1386         i = REFCNT_DEC(bus->n_ref);
1387         if (i > 0)
1388                 return NULL;
1389
1390         bus_free(bus);
1391         return NULL;
1392 }
1393
1394 _public_ int sd_bus_is_open(sd_bus *bus) {
1395
1396         assert_return(bus, -EINVAL);
1397         assert_return(!bus_pid_changed(bus), -ECHILD);
1398
1399         return BUS_IS_OPEN(bus->state);
1400 }
1401
1402 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1403         int r;
1404
1405         assert_return(bus, -EINVAL);
1406         assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1407         assert_return(!bus_pid_changed(bus), -ECHILD);
1408
1409         if (bus->hello_flags & KDBUS_HELLO_MONITOR)
1410                 return 0;
1411
1412         if (type == SD_BUS_TYPE_UNIX_FD) {
1413                 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
1414                         return 0;
1415
1416                 r = bus_ensure_running(bus);
1417                 if (r < 0)
1418                         return r;
1419
1420                 return bus->can_fds;
1421         }
1422
1423         return bus_type_is_valid(type);
1424 }
1425
1426 _public_ int sd_bus_get_server_id(sd_bus *bus, sd_id128_t *server_id) {
1427         int r;
1428
1429         assert_return(bus, -EINVAL);
1430         assert_return(server_id, -EINVAL);
1431         assert_return(!bus_pid_changed(bus), -ECHILD);
1432
1433         r = bus_ensure_running(bus);
1434         if (r < 0)
1435                 return r;
1436
1437         *server_id = bus->server_id;
1438         return 0;
1439 }
1440
1441 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1442         assert(b);
1443         assert(m);
1444
1445         if (m->sealed) {
1446                 /* If we copy the same message to multiple
1447                  * destinations, avoid using the same cookie
1448                  * numbers. */
1449                 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1450                 return 0;
1451         }
1452
1453         if (timeout == 0)
1454                 timeout = BUS_DEFAULT_TIMEOUT;
1455
1456         return bus_message_seal(m, ++b->cookie, timeout);
1457 }
1458
1459 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1460         assert(b);
1461
1462         /* Do packet version and endianness already match? */
1463         if ((b->message_version == 0 || b->message_version == (*m)->header->version) &&
1464             (b->message_endian == 0 || b->message_endian == (*m)->header->endian))
1465                 return 0;
1466
1467         /* No? Then remarshal! */
1468         return bus_message_remarshal(b, m);
1469 }
1470
1471 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1472         assert(b);
1473         assert(m);
1474
1475         /* The bus specification says the serial number cannot be 0,
1476          * hence let's fill something in for synthetic messages. Since
1477          * synthetic messages might have a fake sender and we don't
1478          * want to interfere with the real sender's serial numbers we
1479          * pick a fixed, artificial one. We use (uint32_t) -1 rather
1480          * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1481          * even though kdbus can do 64bit. */
1482
1483         return bus_message_seal(m, 0xFFFFFFFFULL, 0);
1484 }
1485
1486 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1487         int r;
1488
1489         assert(bus);
1490         assert(m);
1491
1492         if (bus->is_kernel)
1493                 r = bus_kernel_write_message(bus, m, hint_sync_call);
1494         else
1495                 r = bus_socket_write_message(bus, m, idx);
1496
1497         if (r <= 0)
1498                 return r;
1499
1500         if (bus->is_kernel || *idx >= BUS_MESSAGE_SIZE(m))
1501                 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
1502                           bus_message_type_to_string(m->header->type),
1503                           strna(sd_bus_message_get_sender(m)),
1504                           strna(sd_bus_message_get_destination(m)),
1505                           strna(sd_bus_message_get_path(m)),
1506                           strna(sd_bus_message_get_interface(m)),
1507                           strna(sd_bus_message_get_member(m)),
1508                           BUS_MESSAGE_COOKIE(m),
1509                           m->reply_cookie,
1510                           strna(m->error.message));
1511
1512         return r;
1513 }
1514
1515 static int dispatch_wqueue(sd_bus *bus) {
1516         int r, ret = 0;
1517
1518         assert(bus);
1519         assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1520
1521         while (bus->wqueue_size > 0) {
1522
1523                 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1524                 if (r < 0)
1525                         return r;
1526                 else if (r == 0)
1527                         /* Didn't do anything this time */
1528                         return ret;
1529                 else if (bus->is_kernel || bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1530                         /* Fully written. Let's drop the entry from
1531                          * the queue.
1532                          *
1533                          * This isn't particularly optimized, but
1534                          * well, this is supposed to be our worst-case
1535                          * buffer only, and the socket buffer is
1536                          * supposed to be our primary buffer, and if
1537                          * it got full, then all bets are off
1538                          * anyway. */
1539
1540                         bus->wqueue_size --;
1541                         sd_bus_message_unref(bus->wqueue[0]);
1542                         memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1543                         bus->windex = 0;
1544
1545                         ret = 1;
1546                 }
1547         }
1548
1549         return ret;
1550 }
1551
1552 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1553         assert(bus);
1554
1555         if (bus->is_kernel)
1556                 return bus_kernel_read_message(bus, hint_priority, priority);
1557         else
1558                 return bus_socket_read_message(bus);
1559 }
1560
1561 int bus_rqueue_make_room(sd_bus *bus) {
1562         assert(bus);
1563
1564         if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1565                 return -ENOBUFS;
1566
1567         if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1568                 return -ENOMEM;
1569
1570         return 0;
1571 }
1572
1573 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1574         int r, ret = 0;
1575
1576         assert(bus);
1577         assert(m);
1578         assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1579
1580         /* Note that the priority logic is only available on kdbus,
1581          * where the rqueue is unused. We check the rqueue here
1582          * anyway, because it's simple... */
1583
1584         for (;;) {
1585                 if (bus->rqueue_size > 0) {
1586                         /* Dispatch a queued message */
1587
1588                         *m = bus->rqueue[0];
1589                         bus->rqueue_size --;
1590                         memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1591                         return 1;
1592                 }
1593
1594                 /* Try to read a new message */
1595                 r = bus_read_message(bus, hint_priority, priority);
1596                 if (r < 0)
1597                         return r;
1598                 if (r == 0)
1599                         return ret;
1600
1601                 ret = 1;
1602         }
1603 }
1604
1605 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1606         _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1607         int r;
1608
1609         assert_return(bus, -EINVAL);
1610         assert_return(m, -EINVAL);
1611         assert_return(!bus_pid_changed(bus), -ECHILD);
1612         assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1613
1614         if (!BUS_IS_OPEN(bus->state))
1615                 return -ENOTCONN;
1616
1617         if (m->n_fds > 0) {
1618                 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1619                 if (r < 0)
1620                         return r;
1621                 if (r == 0)
1622                         return -ENOTSUP;
1623         }
1624
1625         /* If the cookie number isn't kept, then we know that no reply
1626          * is expected */
1627         if (!cookie && !m->sealed)
1628                 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1629
1630         r = bus_seal_message(bus, m, 0);
1631         if (r < 0)
1632                 return r;
1633
1634         /* Remarshall if we have to. This will possibly unref the
1635          * message and place a replacement in m */
1636         r = bus_remarshal_message(bus, &m);
1637         if (r < 0)
1638                 return r;
1639
1640         /* If this is a reply and no reply was requested, then let's
1641          * suppress this, if we can */
1642         if (m->dont_send && !cookie)
1643                 return 1;
1644
1645         if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
1646                 size_t idx = 0;
1647
1648                 r = bus_write_message(bus, m, hint_sync_call, &idx);
1649                 if (r < 0) {
1650                         if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1651                                 bus_enter_closing(bus);
1652                                 return -ECONNRESET;
1653                         }
1654
1655                         return r;
1656                 } else if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m))  {
1657                         /* Wasn't fully written. So let's remember how
1658                          * much was written. Note that the first entry
1659                          * of the wqueue array is always allocated so
1660                          * that we always can remember how much was
1661                          * written. */
1662                         bus->wqueue[0] = sd_bus_message_ref(m);
1663                         bus->wqueue_size = 1;
1664                         bus->windex = idx;
1665                 }
1666         } else {
1667                 /* Just append it to the queue. */
1668
1669                 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1670                         return -ENOBUFS;
1671
1672                 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1673                         return -ENOMEM;
1674
1675                 bus->wqueue[bus->wqueue_size ++] = sd_bus_message_ref(m);
1676         }
1677
1678         if (cookie)
1679                 *cookie = BUS_MESSAGE_COOKIE(m);
1680
1681         return 1;
1682 }
1683
1684 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1685         return bus_send_internal(bus, m, cookie, false);
1686 }
1687
1688 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1689         int r;
1690
1691         assert_return(bus, -EINVAL);
1692         assert_return(m, -EINVAL);
1693         assert_return(!bus_pid_changed(bus), -ECHILD);
1694
1695         if (!BUS_IS_OPEN(bus->state))
1696                 return -ENOTCONN;
1697
1698         if (!streq_ptr(m->destination, destination)) {
1699
1700                 if (!destination)
1701                         return -EEXIST;
1702
1703                 r = sd_bus_message_set_destination(m, destination);
1704                 if (r < 0)
1705                         return r;
1706         }
1707
1708         return sd_bus_send(bus, m, cookie);
1709 }
1710
1711 static usec_t calc_elapse(uint64_t usec) {
1712         if (usec == (uint64_t) -1)
1713                 return 0;
1714
1715         return now(CLOCK_MONOTONIC) + usec;
1716 }
1717
1718 static int timeout_compare(const void *a, const void *b) {
1719         const struct reply_callback *x = a, *y = b;
1720
1721         if (x->timeout != 0 && y->timeout == 0)
1722                 return -1;
1723
1724         if (x->timeout == 0 && y->timeout != 0)
1725                 return 1;
1726
1727         if (x->timeout < y->timeout)
1728                 return -1;
1729
1730         if (x->timeout > y->timeout)
1731                 return 1;
1732
1733         return 0;
1734 }
1735
1736 _public_ int sd_bus_call_async(
1737                 sd_bus *bus,
1738                 sd_bus_slot **slot,
1739                 sd_bus_message *_m,
1740                 sd_bus_message_handler_t callback,
1741                 void *userdata,
1742                 uint64_t usec) {
1743
1744         _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1745         _cleanup_bus_slot_unref_ sd_bus_slot *s = NULL;
1746         int r;
1747
1748         assert_return(bus, -EINVAL);
1749         assert_return(m, -EINVAL);
1750         assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1751         assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1752         assert_return(callback, -EINVAL);
1753         assert_return(!bus_pid_changed(bus), -ECHILD);
1754         assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1755
1756         if (!BUS_IS_OPEN(bus->state))
1757                 return -ENOTCONN;
1758
1759         r = hashmap_ensure_allocated(&bus->reply_callbacks, uint64_hash_func, uint64_compare_func);
1760         if (r < 0)
1761                 return r;
1762
1763         r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1764         if (r < 0)
1765                 return r;
1766
1767         r = bus_seal_message(bus, m, usec);
1768         if (r < 0)
1769                 return r;
1770
1771         r = bus_remarshal_message(bus, &m);
1772         if (r < 0)
1773                 return r;
1774
1775         s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1776         if (!s)
1777                 return -ENOMEM;
1778
1779         s->reply_callback.callback = callback;
1780
1781         s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1782         r = hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1783         if (r < 0) {
1784                 s->reply_callback.cookie = 0;
1785                 return r;
1786         }
1787
1788         s->reply_callback.timeout = calc_elapse(m->timeout);
1789         if (s->reply_callback.timeout != 0) {
1790                 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1791                 if (r < 0) {
1792                         s->reply_callback.timeout = 0;
1793                         return r;
1794                 }
1795         }
1796
1797         r = sd_bus_send(bus, m, &s->reply_callback.cookie);
1798         if (r < 0)
1799                 return r;
1800
1801         if (slot)
1802                 *slot = s;
1803         s = NULL;
1804
1805         return r;
1806 }
1807
1808 int bus_ensure_running(sd_bus *bus) {
1809         int r;
1810
1811         assert(bus);
1812
1813         if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED || bus->state == BUS_CLOSING)
1814                 return -ENOTCONN;
1815         if (bus->state == BUS_RUNNING)
1816                 return 1;
1817
1818         for (;;) {
1819                 r = sd_bus_process(bus, NULL);
1820                 if (r < 0)
1821                         return r;
1822                 if (bus->state == BUS_RUNNING)
1823                         return 1;
1824                 if (r > 0)
1825                         continue;
1826
1827                 r = sd_bus_wait(bus, (uint64_t) -1);
1828                 if (r < 0)
1829                         return r;
1830         }
1831 }
1832
1833 _public_ int sd_bus_call(
1834                 sd_bus *bus,
1835                 sd_bus_message *_m,
1836                 uint64_t usec,
1837                 sd_bus_error *error,
1838                 sd_bus_message **reply) {
1839
1840         _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1841         usec_t timeout;
1842         uint64_t cookie;
1843         unsigned i;
1844         int r;
1845
1846         assert_return(bus, -EINVAL);
1847         assert_return(m, -EINVAL);
1848         assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1849         assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1850         assert_return(!bus_error_is_dirty(error), -EINVAL);
1851         assert_return(!bus_pid_changed(bus), -ECHILD);
1852         assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1853
1854         if (!BUS_IS_OPEN(bus->state))
1855                 return -ENOTCONN;
1856
1857         r = bus_ensure_running(bus);
1858         if (r < 0)
1859                 return r;
1860
1861         i = bus->rqueue_size;
1862
1863         r = bus_seal_message(bus, m, usec);
1864         if (r < 0)
1865                 return r;
1866
1867         r = bus_remarshal_message(bus, &m);
1868         if (r < 0)
1869                 return r;
1870
1871         r = bus_send_internal(bus, m, &cookie, true);
1872         if (r < 0)
1873                 return r;
1874
1875         timeout = calc_elapse(m->timeout);
1876
1877         for (;;) {
1878                 usec_t left;
1879
1880                 while (i < bus->rqueue_size) {
1881                         sd_bus_message *incoming = NULL;
1882
1883                         incoming = bus->rqueue[i];
1884
1885                         if (incoming->reply_cookie == cookie) {
1886                                 /* Found a match! */
1887
1888                                 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1889                                 bus->rqueue_size--;
1890
1891                                 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
1892
1893                                         if (incoming->n_fds <= 0 || (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
1894                                                 if (reply)
1895                                                         *reply = incoming;
1896                                                 else
1897                                                         sd_bus_message_unref(incoming);
1898
1899                                                 return 1;
1900                                         }
1901
1902                                         r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
1903
1904                                 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR)
1905                                         r = sd_bus_error_copy(error, &incoming->error);
1906                                 else
1907                                         r = -EIO;
1908
1909                                 sd_bus_message_unref(incoming);
1910                                 return r;
1911
1912                         } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
1913                                    bus->unique_name &&
1914                                    incoming->sender &&
1915                                    streq(bus->unique_name, incoming->sender)) {
1916
1917                                 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1918                                 bus->rqueue_size--;
1919
1920                                 /* Our own message? Somebody is trying
1921                                  * to send its own client a message,
1922                                  * let's not dead-lock, let's fail
1923                                  * immediately. */
1924
1925                                 sd_bus_message_unref(incoming);
1926                                 return -ELOOP;
1927                         }
1928
1929                         /* Try to read more, right-away */
1930                         i++;
1931                 }
1932
1933                 r = bus_read_message(bus, false, 0);
1934                 if (r < 0) {
1935                         if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1936                                 bus_enter_closing(bus);
1937                                 return -ECONNRESET;
1938                         }
1939
1940                         return r;
1941                 }
1942                 if (r > 0)
1943                         continue;
1944
1945                 if (timeout > 0) {
1946                         usec_t n;
1947
1948                         n = now(CLOCK_MONOTONIC);
1949                         if (n >= timeout)
1950                                 return -ETIMEDOUT;
1951
1952                         left = timeout - n;
1953                 } else
1954                         left = (uint64_t) -1;
1955
1956                 r = bus_poll(bus, true, left);
1957                 if (r < 0)
1958                         return r;
1959                 if (r == 0)
1960                         return -ETIMEDOUT;
1961
1962                 r = dispatch_wqueue(bus);
1963                 if (r < 0) {
1964                         if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1965                                 bus_enter_closing(bus);
1966                                 return -ECONNRESET;
1967                         }
1968
1969                         return r;
1970                 }
1971         }
1972 }
1973
1974 _public_ int sd_bus_get_fd(sd_bus *bus) {
1975
1976         assert_return(bus, -EINVAL);
1977         assert_return(bus->input_fd == bus->output_fd, -EPERM);
1978         assert_return(!bus_pid_changed(bus), -ECHILD);
1979
1980         return bus->input_fd;
1981 }
1982
1983 _public_ int sd_bus_get_events(sd_bus *bus) {
1984         int flags = 0;
1985
1986         assert_return(bus, -EINVAL);
1987         assert_return(!bus_pid_changed(bus), -ECHILD);
1988
1989         if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
1990                 return -ENOTCONN;
1991
1992         if (bus->state == BUS_OPENING)
1993                 flags |= POLLOUT;
1994         else if (bus->state == BUS_AUTHENTICATING) {
1995
1996                 if (bus_socket_auth_needs_write(bus))
1997                         flags |= POLLOUT;
1998
1999                 flags |= POLLIN;
2000
2001         } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
2002                 if (bus->rqueue_size <= 0)
2003                         flags |= POLLIN;
2004                 if (bus->wqueue_size > 0)
2005                         flags |= POLLOUT;
2006         }
2007
2008         return flags;
2009 }
2010
2011 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2012         struct reply_callback *c;
2013
2014         assert_return(bus, -EINVAL);
2015         assert_return(timeout_usec, -EINVAL);
2016         assert_return(!bus_pid_changed(bus), -ECHILD);
2017
2018         if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2019                 return -ENOTCONN;
2020
2021         if (bus->track_queue) {
2022                 *timeout_usec = 0;
2023                 return 1;
2024         }
2025
2026         if (bus->state == BUS_CLOSING) {
2027                 *timeout_usec = 0;
2028                 return 1;
2029         }
2030
2031         if (bus->state == BUS_AUTHENTICATING) {
2032                 *timeout_usec = bus->auth_timeout;
2033                 return 1;
2034         }
2035
2036         if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
2037                 *timeout_usec = (uint64_t) -1;
2038                 return 0;
2039         }
2040
2041         if (bus->rqueue_size > 0) {
2042                 *timeout_usec = 0;
2043                 return 1;
2044         }
2045
2046         c = prioq_peek(bus->reply_callbacks_prioq);
2047         if (!c) {
2048                 *timeout_usec = (uint64_t) -1;
2049                 return 0;
2050         }
2051
2052         if (c->timeout == 0) {
2053                 *timeout_usec = (uint64_t) -1;
2054                 return 0;
2055         }
2056
2057         *timeout_usec = c->timeout;
2058         return 1;
2059 }
2060
2061 static int process_timeout(sd_bus *bus) {
2062         _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2063         _cleanup_bus_message_unref_ sd_bus_message* m = NULL;
2064         struct reply_callback *c;
2065         sd_bus_slot *slot;
2066         usec_t n;
2067         int r;
2068
2069         assert(bus);
2070
2071         c = prioq_peek(bus->reply_callbacks_prioq);
2072         if (!c)
2073                 return 0;
2074
2075         n = now(CLOCK_MONOTONIC);
2076         if (c->timeout > n)
2077                 return 0;
2078
2079         r = bus_message_new_synthetic_error(
2080                         bus,
2081                         c->cookie,
2082                         &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2083                         &m);
2084         if (r < 0)
2085                 return r;
2086
2087         m->sender = "org.freedesktop.DBus";
2088
2089         r = bus_seal_synthetic_message(bus, m);
2090         if (r < 0)
2091                 return r;
2092
2093         assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2094         c->timeout = 0;
2095
2096         hashmap_remove(bus->reply_callbacks, &c->cookie);
2097         c->cookie = 0;
2098
2099         slot = container_of(c, sd_bus_slot, reply_callback);
2100
2101         bus->iteration_counter ++;
2102
2103         bus->current_message = m;
2104         bus->current_slot = sd_bus_slot_ref(slot);
2105         r = c->callback(bus, m, slot->userdata, &error_buffer);
2106         bus->current_slot = sd_bus_slot_unref(slot);
2107         bus->current_message = NULL;
2108
2109         if (slot->floating) {
2110                 bus_slot_disconnect(slot);
2111                 sd_bus_slot_unref(slot);
2112         }
2113
2114         return bus_maybe_reply_error(m, r, &error_buffer);
2115 }
2116
2117 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2118         assert(bus);
2119         assert(m);
2120
2121         if (bus->state != BUS_HELLO)
2122                 return 0;
2123
2124         /* Let's make sure the first message on the bus is the HELLO
2125          * reply. But note that we don't actually parse the message
2126          * here (we leave that to the usual handling), we just verify
2127          * we don't let any earlier msg through. */
2128
2129         if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2130             m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2131                 return -EIO;
2132
2133         if (m->reply_cookie != 1)
2134                 return -EIO;
2135
2136         return 0;
2137 }
2138
2139 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2140         _cleanup_bus_message_unref_ sd_bus_message *synthetic_reply = NULL;
2141         _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2142         struct reply_callback *c;
2143         sd_bus_slot *slot;
2144         int r;
2145
2146         assert(bus);
2147         assert(m);
2148
2149         if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2150             m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2151                 return 0;
2152
2153         if (bus->is_kernel && (bus->hello_flags & KDBUS_HELLO_MONITOR))
2154                 return 0;
2155
2156         if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2157                 return 0;
2158
2159         c = hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2160         if (!c)
2161                 return 0;
2162
2163         c->cookie = 0;
2164
2165         slot = container_of(c, sd_bus_slot, reply_callback);
2166
2167         if (m->n_fds > 0 && !(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2168
2169                 /* If the reply contained a file descriptor which we
2170                  * didn't want we pass an error instead. */
2171
2172                 r = bus_message_new_synthetic_error(
2173                                 bus,
2174                                 m->reply_cookie,
2175                                 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2176                                 &synthetic_reply);
2177                 if (r < 0)
2178                         return r;
2179
2180                 r = bus_seal_synthetic_message(bus, synthetic_reply);
2181                 if (r < 0)
2182                         return r;
2183
2184                 m = synthetic_reply;
2185         } else {
2186                 r = sd_bus_message_rewind(m, true);
2187                 if (r < 0)
2188                         return r;
2189         }
2190
2191         if (c->timeout != 0) {
2192                 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2193                 c->timeout = 0;
2194         }
2195
2196         bus->current_slot = sd_bus_slot_ref(slot);
2197         r = c->callback(bus, m, slot->userdata, &error_buffer);
2198         bus->current_slot = sd_bus_slot_unref(slot);
2199
2200         if (slot->floating) {
2201                 bus_slot_disconnect(slot);
2202                 sd_bus_slot_unref(slot);
2203         }
2204
2205         return bus_maybe_reply_error(m, r, &error_buffer);
2206 }
2207
2208 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2209         _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2210         struct filter_callback *l;
2211         int r;
2212
2213         assert(bus);
2214         assert(m);
2215
2216         do {
2217                 bus->filter_callbacks_modified = false;
2218
2219                 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2220                         sd_bus_slot *slot;
2221
2222                         if (bus->filter_callbacks_modified)
2223                                 break;
2224
2225                         /* Don't run this more than once per iteration */
2226                         if (l->last_iteration == bus->iteration_counter)
2227                                 continue;
2228
2229                         l->last_iteration = bus->iteration_counter;
2230
2231                         r = sd_bus_message_rewind(m, true);
2232                         if (r < 0)
2233                                 return r;
2234
2235                         slot = container_of(l, sd_bus_slot, filter_callback);
2236
2237                         bus->current_slot = sd_bus_slot_ref(slot);
2238                         r = l->callback(bus, m, slot->userdata, &error_buffer);
2239                         bus->current_slot = sd_bus_slot_unref(slot);
2240
2241                         r = bus_maybe_reply_error(m, r, &error_buffer);
2242                         if (r != 0)
2243                                 return r;
2244
2245                 }
2246
2247         } while (bus->filter_callbacks_modified);
2248
2249         return 0;
2250 }
2251
2252 static int process_match(sd_bus *bus, sd_bus_message *m) {
2253         int r;
2254
2255         assert(bus);
2256         assert(m);
2257
2258         do {
2259                 bus->match_callbacks_modified = false;
2260
2261                 r = bus_match_run(bus, &bus->match_callbacks, m);
2262                 if (r != 0)
2263                         return r;
2264
2265         } while (bus->match_callbacks_modified);
2266
2267         return 0;
2268 }
2269
2270 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2271         _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
2272         int r;
2273
2274         assert(bus);
2275         assert(m);
2276
2277         if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2278                 return 0;
2279
2280         if (bus->manual_peer_interface)
2281                 return 0;
2282
2283         if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2284                 return 0;
2285
2286         if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2287                 return 0;
2288
2289         if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2290                 return 1;
2291
2292         if (streq_ptr(m->member, "Ping"))
2293                 r = sd_bus_message_new_method_return(m, &reply);
2294         else if (streq_ptr(m->member, "GetMachineId")) {
2295                 sd_id128_t id;
2296                 char sid[33];
2297
2298                 r = sd_id128_get_machine(&id);
2299                 if (r < 0)
2300                         return r;
2301
2302                 r = sd_bus_message_new_method_return(m, &reply);
2303                 if (r < 0)
2304                         return r;
2305
2306                 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2307         } else {
2308                 r = sd_bus_message_new_method_errorf(
2309                                 m, &reply,
2310                                 SD_BUS_ERROR_UNKNOWN_METHOD,
2311                                  "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2312         }
2313
2314         if (r < 0)
2315                 return r;
2316
2317         r = sd_bus_send(bus, reply, NULL);
2318         if (r < 0)
2319                 return r;
2320
2321         return 1;
2322 }
2323
2324 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2325         assert(bus);
2326         assert(m);
2327
2328         /* If we got a message with a file descriptor which we didn't
2329          * want to accept, then let's drop it. How can this even
2330          * happen? For example, when the kernel queues a message into
2331          * an activatable names's queue which allows fds, and then is
2332          * delivered to us later even though we ourselves did not
2333          * negotiate it. */
2334
2335         if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2336                 return 0;
2337
2338         if (m->n_fds <= 0)
2339                 return 0;
2340
2341         if (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)
2342                 return 0;
2343
2344         if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2345                 return 1; /* just eat it up */
2346
2347         return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2348 }
2349
2350 static int process_message(sd_bus *bus, sd_bus_message *m) {
2351         int r;
2352
2353         assert(bus);
2354         assert(m);
2355
2356         bus->current_message = m;
2357         bus->iteration_counter++;
2358
2359         log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
2360                   bus_message_type_to_string(m->header->type),
2361                   strna(sd_bus_message_get_sender(m)),
2362                   strna(sd_bus_message_get_destination(m)),
2363                   strna(sd_bus_message_get_path(m)),
2364                   strna(sd_bus_message_get_interface(m)),
2365                   strna(sd_bus_message_get_member(m)),
2366                   BUS_MESSAGE_COOKIE(m),
2367                   m->reply_cookie,
2368                   strna(m->error.message));
2369
2370         r = process_hello(bus, m);
2371         if (r != 0)
2372                 goto finish;
2373
2374         r = process_reply(bus, m);
2375         if (r != 0)
2376                 goto finish;
2377
2378         r = process_fd_check(bus, m);
2379         if (r != 0)
2380                 goto finish;
2381
2382         r = process_filter(bus, m);
2383         if (r != 0)
2384                 goto finish;
2385
2386         r = process_match(bus, m);
2387         if (r != 0)
2388                 goto finish;
2389
2390         r = process_builtin(bus, m);
2391         if (r != 0)
2392                 goto finish;
2393
2394         r = bus_process_object(bus, m);
2395
2396 finish:
2397         bus->current_message = NULL;
2398         return r;
2399 }
2400
2401 static int dispatch_track(sd_bus *bus) {
2402         assert(bus);
2403
2404         if (!bus->track_queue)
2405                 return 0;
2406
2407         bus_track_dispatch(bus->track_queue);
2408         return 1;
2409 }
2410
2411 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2412         _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2413         int r;
2414
2415         assert(bus);
2416         assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
2417
2418         r = process_timeout(bus);
2419         if (r != 0)
2420                 goto null_message;
2421
2422         r = dispatch_wqueue(bus);
2423         if (r != 0)
2424                 goto null_message;
2425
2426         r = dispatch_track(bus);
2427         if (r != 0)
2428                 goto null_message;
2429
2430         r = dispatch_rqueue(bus, hint_priority, priority, &m);
2431         if (r < 0)
2432                 return r;
2433         if (!m)
2434                 goto null_message;
2435
2436         r = process_message(bus, m);
2437         if (r != 0)
2438                 goto null_message;
2439
2440         if (ret) {
2441                 r = sd_bus_message_rewind(m, true);
2442                 if (r < 0)
2443                         return r;
2444
2445                 *ret = m;
2446                 m = NULL;
2447                 return 1;
2448         }
2449
2450         if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2451
2452                 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2453                           strna(sd_bus_message_get_sender(m)),
2454                           strna(sd_bus_message_get_path(m)),
2455                           strna(sd_bus_message_get_interface(m)),
2456                           strna(sd_bus_message_get_member(m)));
2457
2458                 r = sd_bus_reply_method_errorf(
2459                                 m,
2460                                 SD_BUS_ERROR_UNKNOWN_OBJECT,
2461                                 "Unknown object '%s'.", m->path);
2462                 if (r < 0)
2463                         return r;
2464         }
2465
2466         return 1;
2467
2468 null_message:
2469         if (r >= 0 && ret)
2470                 *ret = NULL;
2471
2472         return r;
2473 }
2474
2475 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2476         _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2477         struct reply_callback *c;
2478         int r;
2479
2480         assert(bus);
2481         assert(bus->state == BUS_CLOSING);
2482
2483         c = hashmap_first(bus->reply_callbacks);
2484         if (c) {
2485                 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2486                 sd_bus_slot *slot;
2487
2488                 /* First, fail all outstanding method calls */
2489                 r = bus_message_new_synthetic_error(
2490                                 bus,
2491                                 c->cookie,
2492                                 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2493                                 &m);
2494                 if (r < 0)
2495                         return r;
2496
2497                 r = bus_seal_synthetic_message(bus, m);
2498                 if (r < 0)
2499                         return r;
2500
2501                 if (c->timeout != 0) {
2502                         prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2503                         c->timeout = 0;
2504                 }
2505
2506                 hashmap_remove(bus->reply_callbacks, &c->cookie);
2507                 c->cookie = 0;
2508
2509                 slot = container_of(c, sd_bus_slot, reply_callback);
2510
2511                 bus->iteration_counter++;
2512
2513                 bus->current_message = m;
2514                 bus->current_slot = sd_bus_slot_ref(slot);
2515                 r = c->callback(bus, m, slot->userdata, &error_buffer);
2516                 bus->current_slot = sd_bus_slot_unref(slot);
2517                 bus->current_message = NULL;
2518
2519                 if (slot->floating) {
2520                         bus_slot_disconnect(slot);
2521                         sd_bus_slot_unref(slot);
2522                 }
2523
2524                 return bus_maybe_reply_error(m, r, &error_buffer);
2525         }
2526
2527         /* Then, synthesize a Disconnected message */
2528         r = sd_bus_message_new_signal(
2529                         bus,
2530                         &m,
2531                         "/org/freedesktop/DBus/Local",
2532                         "org.freedesktop.DBus.Local",
2533                         "Disconnected");
2534         if (r < 0)
2535                 return r;
2536
2537         m->sender = "org.freedesktop.DBus.Local";
2538
2539         r = bus_seal_synthetic_message(bus, m);
2540         if (r < 0)
2541                 return r;
2542
2543         sd_bus_close(bus);
2544
2545         bus->current_message = m;
2546         bus->iteration_counter++;
2547
2548         r = process_filter(bus, m);
2549         if (r != 0)
2550                 goto finish;
2551
2552         r = process_match(bus, m);
2553         if (r != 0)
2554                 goto finish;
2555
2556         if (ret) {
2557                 *ret = m;
2558                 m = NULL;
2559         }
2560
2561         r = 1;
2562
2563 finish:
2564         bus->current_message = NULL;
2565
2566         return r;
2567 }
2568
2569 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2570         BUS_DONT_DESTROY(bus);
2571         int r;
2572
2573         /* Returns 0 when we didn't do anything. This should cause the
2574          * caller to invoke sd_bus_wait() before returning the next
2575          * time. Returns > 0 when we did something, which possibly
2576          * means *ret is filled in with an unprocessed message. */
2577
2578         assert_return(bus, -EINVAL);
2579         assert_return(!bus_pid_changed(bus), -ECHILD);
2580
2581         /* We don't allow recursively invoking sd_bus_process(). */
2582         assert_return(!bus->current_message, -EBUSY);
2583         assert(!bus->current_slot);
2584
2585         switch (bus->state) {
2586
2587         case BUS_UNSET:
2588                 return -ENOTCONN;
2589
2590         case BUS_CLOSED:
2591                 return -ECONNRESET;
2592
2593         case BUS_OPENING:
2594                 r = bus_socket_process_opening(bus);
2595                 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2596                         bus_enter_closing(bus);
2597                         r = 1;
2598                 } else if (r < 0)
2599                         return r;
2600                 if (ret)
2601                         *ret = NULL;
2602                 return r;
2603
2604         case BUS_AUTHENTICATING:
2605                 r = bus_socket_process_authenticating(bus);
2606                 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2607                         bus_enter_closing(bus);
2608                         r = 1;
2609                 } else if (r < 0)
2610                         return r;
2611
2612                 if (ret)
2613                         *ret = NULL;
2614
2615                 return r;
2616
2617         case BUS_RUNNING:
2618         case BUS_HELLO:
2619                 r = process_running(bus, hint_priority, priority, ret);
2620                 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2621                         bus_enter_closing(bus);
2622                         r = 1;
2623
2624                         if (ret)
2625                                 *ret = NULL;
2626                 }
2627
2628                 return r;
2629
2630         case BUS_CLOSING:
2631                 return process_closing(bus, ret);
2632         }
2633
2634         assert_not_reached("Unknown state");
2635 }
2636
2637 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2638         return bus_process_internal(bus, false, 0, ret);
2639 }
2640
2641 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2642         return bus_process_internal(bus, true, priority, ret);
2643 }
2644
2645 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2646         struct pollfd p[2] = {};
2647         int r, e, n;
2648         struct timespec ts;
2649         usec_t m = USEC_INFINITY;
2650
2651         assert(bus);
2652
2653         if (bus->state == BUS_CLOSING)
2654                 return 1;
2655
2656         if (!BUS_IS_OPEN(bus->state))
2657                 return -ENOTCONN;
2658
2659         e = sd_bus_get_events(bus);
2660         if (e < 0)
2661                 return e;
2662
2663         if (need_more)
2664                 /* The caller really needs some more data, he doesn't
2665                  * care about what's already read, or any timeouts
2666                  * except its own.*/
2667                 e |= POLLIN;
2668         else {
2669                 usec_t until;
2670                 /* The caller wants to process if there's something to
2671                  * process, but doesn't care otherwise */
2672
2673                 r = sd_bus_get_timeout(bus, &until);
2674                 if (r < 0)
2675                         return r;
2676                 if (r > 0) {
2677                         usec_t nw;
2678                         nw = now(CLOCK_MONOTONIC);
2679                         m = until > nw ? until - nw : 0;
2680                 }
2681         }
2682
2683         if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2684                 m = timeout_usec;
2685
2686         p[0].fd = bus->input_fd;
2687         if (bus->output_fd == bus->input_fd) {
2688                 p[0].events = e;
2689                 n = 1;
2690         } else {
2691                 p[0].events = e & POLLIN;
2692                 p[1].fd = bus->output_fd;
2693                 p[1].events = e & POLLOUT;
2694                 n = 2;
2695         }
2696
2697         r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
2698         if (r < 0)
2699                 return -errno;
2700
2701         return r > 0 ? 1 : 0;
2702 }
2703
2704 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2705
2706         assert_return(bus, -EINVAL);
2707         assert_return(!bus_pid_changed(bus), -ECHILD);
2708
2709         if (bus->state == BUS_CLOSING)
2710                 return 0;
2711
2712         if (!BUS_IS_OPEN(bus->state))
2713                 return -ENOTCONN;
2714
2715         if (bus->rqueue_size > 0)
2716                 return 0;
2717
2718         return bus_poll(bus, false, timeout_usec);
2719 }
2720
2721 _public_ int sd_bus_flush(sd_bus *bus) {
2722         int r;
2723
2724         assert_return(bus, -EINVAL);
2725         assert_return(!bus_pid_changed(bus), -ECHILD);
2726
2727         if (bus->state == BUS_CLOSING)
2728                 return 0;
2729
2730         if (!BUS_IS_OPEN(bus->state))
2731                 return -ENOTCONN;
2732
2733         r = bus_ensure_running(bus);
2734         if (r < 0)
2735                 return r;
2736
2737         if (bus->wqueue_size <= 0)
2738                 return 0;
2739
2740         for (;;) {
2741                 r = dispatch_wqueue(bus);
2742                 if (r < 0) {
2743                         if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2744                                 bus_enter_closing(bus);
2745                                 return -ECONNRESET;
2746                         }
2747
2748                         return r;
2749                 }
2750
2751                 if (bus->wqueue_size <= 0)
2752                         return 0;
2753
2754                 r = bus_poll(bus, false, (uint64_t) -1);
2755                 if (r < 0)
2756                         return r;
2757         }
2758 }
2759
2760 _public_ int sd_bus_add_filter(
2761                 sd_bus *bus,
2762                 sd_bus_slot **slot,
2763                 sd_bus_message_handler_t callback,
2764                 void *userdata) {
2765
2766         sd_bus_slot *s;
2767
2768         assert_return(bus, -EINVAL);
2769         assert_return(callback, -EINVAL);
2770         assert_return(!bus_pid_changed(bus), -ECHILD);
2771
2772         s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
2773         if (!s)
2774                 return -ENOMEM;
2775
2776         s->filter_callback.callback = callback;
2777
2778         bus->filter_callbacks_modified = true;
2779         LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
2780
2781         if (slot)
2782                 *slot = s;
2783
2784         return 0;
2785 }
2786
2787 _public_ int sd_bus_add_match(
2788                 sd_bus *bus,
2789                 sd_bus_slot **slot,
2790                 const char *match,
2791                 sd_bus_message_handler_t callback,
2792                 void *userdata) {
2793
2794         struct bus_match_component *components = NULL;
2795         unsigned n_components = 0;
2796         sd_bus_slot *s = NULL;
2797         int r = 0;
2798
2799         assert_return(bus, -EINVAL);
2800         assert_return(match, -EINVAL);
2801         assert_return(!bus_pid_changed(bus), -ECHILD);
2802
2803         r = bus_match_parse(match, &components, &n_components);
2804         if (r < 0)
2805                 goto finish;
2806
2807         s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
2808         if (!s) {
2809                 r = -ENOMEM;
2810                 goto finish;
2811         }
2812
2813         s->match_callback.callback = callback;
2814         s->match_callback.cookie = ++bus->match_cookie;
2815
2816         if (bus->bus_client) {
2817
2818                 if (!bus->is_kernel) {
2819                         /* When this is not a kernel transport, we
2820                          * store the original match string, so that we
2821                          * can use it to remove the match again */
2822
2823                         s->match_callback.match_string = strdup(match);
2824                         if (!s->match_callback.match_string) {
2825                                 r = -ENOMEM;
2826                                 goto finish;
2827                         }
2828                 }
2829
2830                 r = bus_add_match_internal(bus, s->match_callback.match_string, components, n_components, s->match_callback.cookie);
2831                 if (r < 0)
2832                         goto finish;
2833         }
2834
2835         bus->match_callbacks_modified = true;
2836         r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
2837         if (r < 0)
2838                 goto finish;
2839
2840         if (slot)
2841                 *slot = s;
2842         s = NULL;
2843
2844 finish:
2845         bus_match_parse_free(components, n_components);
2846         sd_bus_slot_unref(s);
2847
2848         return r;
2849 }
2850
2851 int bus_remove_match_by_string(
2852                 sd_bus *bus,
2853                 const char *match,
2854                 sd_bus_message_handler_t callback,
2855                 void *userdata) {
2856
2857         struct bus_match_component *components = NULL;
2858         unsigned n_components = 0;
2859         struct match_callback *c;
2860         int r = 0;
2861
2862         assert_return(bus, -EINVAL);
2863         assert_return(match, -EINVAL);
2864         assert_return(!bus_pid_changed(bus), -ECHILD);
2865
2866         r = bus_match_parse(match, &components, &n_components);
2867         if (r < 0)
2868                 goto finish;
2869
2870         r = bus_match_find(&bus->match_callbacks, components, n_components, NULL, NULL, &c);
2871         if (r <= 0)
2872                 goto finish;
2873
2874         sd_bus_slot_unref(container_of(c, sd_bus_slot, match_callback));
2875
2876 finish:
2877         bus_match_parse_free(components, n_components);
2878
2879         return r;
2880 }
2881
2882 bool bus_pid_changed(sd_bus *bus) {
2883         assert(bus);
2884
2885         /* We don't support people creating a bus connection and
2886          * keeping it around over a fork(). Let's complain. */
2887
2888         return bus->original_pid != getpid();
2889 }
2890
2891 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
2892         sd_bus *bus = userdata;
2893         int r;
2894
2895         assert(bus);
2896
2897         r = sd_bus_process(bus, NULL);
2898         if (r < 0)
2899                 return r;
2900
2901         return 1;
2902 }
2903
2904 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
2905         sd_bus *bus = userdata;
2906         int r;
2907
2908         assert(bus);
2909
2910         r = sd_bus_process(bus, NULL);
2911         if (r < 0)
2912                 return r;
2913
2914         return 1;
2915 }
2916
2917 static int prepare_callback(sd_event_source *s, void *userdata) {
2918         sd_bus *bus = userdata;
2919         int r, e;
2920         usec_t until;
2921
2922         assert(s);
2923         assert(bus);
2924
2925         e = sd_bus_get_events(bus);
2926         if (e < 0)
2927                 return e;
2928
2929         if (bus->output_fd != bus->input_fd) {
2930
2931                 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
2932                 if (r < 0)
2933                         return r;
2934
2935                 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
2936                 if (r < 0)
2937                         return r;
2938         } else {
2939                 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
2940                 if (r < 0)
2941                         return r;
2942         }
2943
2944         r = sd_bus_get_timeout(bus, &until);
2945         if (r < 0)
2946                 return r;
2947         if (r > 0) {
2948                 int j;
2949
2950                 j = sd_event_source_set_time(bus->time_event_source, until);
2951                 if (j < 0)
2952                         return j;
2953         }
2954
2955         r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
2956         if (r < 0)
2957                 return r;
2958
2959         return 1;
2960 }
2961
2962 static int quit_callback(sd_event_source *event, void *userdata) {
2963         sd_bus *bus = userdata;
2964
2965         assert(event);
2966
2967         sd_bus_flush(bus);
2968         sd_bus_close(bus);
2969
2970         return 1;
2971 }
2972
2973 static int attach_io_events(sd_bus *bus) {
2974         int r;
2975
2976         assert(bus);
2977
2978         if (bus->input_fd < 0)
2979                 return 0;
2980
2981         if (!bus->event)
2982                 return 0;
2983
2984         if (!bus->input_io_event_source) {
2985                 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
2986                 if (r < 0)
2987                         return r;
2988
2989                 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
2990                 if (r < 0)
2991                         return r;
2992
2993                 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
2994         } else
2995                 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
2996
2997         if (r < 0)
2998                 return r;
2999
3000         if (bus->output_fd != bus->input_fd) {
3001                 assert(bus->output_fd >= 0);
3002
3003                 if (!bus->output_io_event_source) {
3004                         r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3005                         if (r < 0)
3006                                 return r;
3007
3008                         r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3009                 } else
3010                         r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3011
3012                 if (r < 0)
3013                         return r;
3014         }
3015
3016         return 0;
3017 }
3018
3019 static void detach_io_events(sd_bus *bus) {
3020         assert(bus);
3021
3022         if (bus->input_io_event_source) {
3023                 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3024                 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3025         }
3026
3027         if (bus->output_io_event_source) {
3028                 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3029                 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3030         }
3031 }
3032
3033 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3034         int r;
3035
3036         assert_return(bus, -EINVAL);
3037         assert_return(!bus->event, -EBUSY);
3038
3039         assert(!bus->input_io_event_source);
3040         assert(!bus->output_io_event_source);
3041         assert(!bus->time_event_source);
3042
3043         if (event)
3044                 bus->event = sd_event_ref(event);
3045         else  {
3046                 r = sd_event_default(&bus->event);
3047                 if (r < 0)
3048                         return r;
3049         }
3050
3051         bus->event_priority = priority;
3052
3053         r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3054         if (r < 0)
3055                 goto fail;
3056
3057         r = sd_event_source_set_priority(bus->time_event_source, priority);
3058         if (r < 0)
3059                 goto fail;
3060
3061         r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3062         if (r < 0)
3063                 goto fail;
3064
3065         r = attach_io_events(bus);
3066         if (r < 0)
3067                 goto fail;
3068
3069         return 0;
3070
3071 fail:
3072         sd_bus_detach_event(bus);
3073         return r;
3074 }
3075
3076 _public_ int sd_bus_detach_event(sd_bus *bus) {
3077         assert_return(bus, -EINVAL);
3078
3079         if (!bus->event)
3080                 return 0;
3081
3082         detach_io_events(bus);
3083
3084         if (bus->time_event_source) {
3085                 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3086                 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3087         }
3088
3089         if (bus->quit_event_source) {
3090                 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3091                 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3092         }
3093
3094         bus->event = sd_event_unref(bus->event);
3095         return 1;
3096 }
3097
3098 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3099         assert_return(bus, NULL);
3100
3101         return bus->event;
3102 }
3103
3104 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3105         assert_return(bus, NULL);
3106
3107         return bus->current_message;
3108 }
3109
3110 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3111         assert_return(bus, NULL);
3112
3113         return bus->current_slot;
3114 }
3115
3116 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3117         sd_bus *b = NULL;
3118         int r;
3119
3120         assert(bus_open);
3121         assert(default_bus);
3122
3123         if (!ret)
3124                 return !!*default_bus;
3125
3126         if (*default_bus) {
3127                 *ret = sd_bus_ref(*default_bus);
3128                 return 0;
3129         }
3130
3131         r = bus_open(&b);
3132         if (r < 0)
3133                 return r;
3134
3135         b->default_bus_ptr = default_bus;
3136         b->tid = gettid();
3137         *default_bus = b;
3138
3139         *ret = b;
3140         return 1;
3141 }
3142
3143 _public_ int sd_bus_default_system(sd_bus **ret) {
3144         static thread_local sd_bus *default_system_bus = NULL;
3145
3146         return bus_default(sd_bus_open_system, &default_system_bus, ret);
3147 }
3148
3149 _public_ int sd_bus_default_user(sd_bus **ret) {
3150         static thread_local sd_bus *default_user_bus = NULL;
3151
3152         return bus_default(sd_bus_open_user, &default_user_bus, ret);
3153 }
3154
3155 _public_ int sd_bus_default(sd_bus **ret) {
3156
3157         const char *e;
3158
3159         /* Let's try our best to reuse another cached connection. If
3160          * the starter bus type is set, connect via our normal
3161          * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3162          * we can share the connection with the user/system default
3163          * bus. */
3164
3165         e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3166         if (e) {
3167                 if (streq(e, "system"))
3168                         return sd_bus_default_system(ret);
3169                 else if (STR_IN_SET(e, "user", "session"))
3170                         return sd_bus_default_user(ret);
3171         }
3172
3173         /* No type is specified, so we have not other option than to
3174          * use the starter address if it is set. */
3175
3176         e = secure_getenv("DBUS_STARTER_ADDRESS");
3177         if (e) {
3178                 static thread_local sd_bus *default_starter_bus = NULL;
3179
3180                 return bus_default(sd_bus_open, &default_starter_bus, ret);
3181         }
3182
3183         /* Finally, if nothing is set use the cached connection for
3184          * the right scope */
3185
3186         if (cg_pid_get_owner_uid(0, NULL) >= 0)
3187                 return sd_bus_default_user(ret);
3188         else
3189                 return sd_bus_default_system(ret);
3190 }
3191
3192 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3193         assert_return(b, -EINVAL);
3194         assert_return(tid, -EINVAL);
3195         assert_return(!bus_pid_changed(b), -ECHILD);
3196
3197         if (b->tid != 0) {
3198                 *tid = b->tid;
3199                 return 0;
3200         }
3201
3202         if (b->event)
3203                 return sd_event_get_tid(b->event, tid);
3204
3205         return -ENXIO;
3206 }
3207
3208 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3209         _cleanup_free_ char *e = NULL;
3210         char *ret;
3211
3212         assert_return(object_path_is_valid(prefix), -EINVAL);
3213         assert_return(external_id, -EINVAL);
3214         assert_return(ret_path, -EINVAL);
3215
3216         e = bus_label_escape(external_id);
3217         if (!e)
3218                 return -ENOMEM;
3219
3220         ret = strjoin(prefix, "/", e, NULL);
3221         if (!ret)
3222                 return -ENOMEM;
3223
3224         *ret_path = ret;
3225         return 0;
3226 }
3227
3228 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3229         const char *e;
3230         char *ret;
3231
3232         assert_return(object_path_is_valid(path), -EINVAL);
3233         assert_return(object_path_is_valid(prefix), -EINVAL);
3234         assert_return(external_id, -EINVAL);
3235
3236         e = object_path_startswith(path, prefix);
3237         if (!e) {
3238                 *external_id = NULL;
3239                 return 0;
3240         }
3241
3242         ret = bus_label_unescape(e);
3243         if (!ret)
3244                 return -ENOMEM;
3245
3246         *external_id = ret;
3247         return 1;
3248 }
3249
3250 _public_ int sd_bus_get_peer_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **ret) {
3251         sd_bus_creds *c;
3252         pid_t pid = 0;
3253         int r;
3254
3255         assert_return(bus, -EINVAL);
3256         assert_return(mask <= _SD_BUS_CREDS_ALL, -ENOTSUP);
3257         assert_return(ret, -EINVAL);
3258         assert_return(!bus_pid_changed(bus), -ECHILD);
3259
3260         if (bus->is_kernel)
3261                 return -ENOTSUP;
3262
3263         if (!BUS_IS_OPEN(bus->state))
3264                 return -ENOTCONN;
3265
3266         if (!bus->ucred_valid && !isempty(bus->label))
3267                 return -ENODATA;
3268
3269         c = bus_creds_new();
3270         if (!c)
3271                 return -ENOMEM;
3272
3273         if (bus->ucred_valid) {
3274                 pid = c->pid = bus->ucred.pid;
3275                 c->uid = bus->ucred.uid;
3276                 c->gid = bus->ucred.gid;
3277
3278                 c->mask |= (SD_BUS_CREDS_UID | SD_BUS_CREDS_PID | SD_BUS_CREDS_GID) & mask;
3279         }
3280
3281         if (!isempty(bus->label) && (mask & SD_BUS_CREDS_SELINUX_CONTEXT)) {
3282                 c->label = strdup(bus->label);
3283                 if (!c->label) {
3284                         sd_bus_creds_unref(c);
3285                         return -ENOMEM;
3286                 }
3287
3288                 c->mask |= SD_BUS_CREDS_SELINUX_CONTEXT;
3289         }
3290
3291         r = bus_creds_add_more(c, mask, pid, 0);
3292         if (r < 0)
3293                 return r;
3294
3295         *ret = c;
3296         return 0;
3297 }
3298
3299 _public_ int sd_bus_try_close(sd_bus *bus) {
3300         int r;
3301
3302         assert_return(bus, -EINVAL);
3303         assert_return(!bus_pid_changed(bus), -ECHILD);
3304
3305         if (!bus->is_kernel)
3306                 return -ENOTSUP;
3307
3308         if (!BUS_IS_OPEN(bus->state))
3309                 return -ENOTCONN;
3310
3311         if (bus->rqueue_size > 0)
3312                 return -EBUSY;
3313
3314         if (bus->wqueue_size > 0)
3315                 return -EBUSY;
3316
3317         r = bus_kernel_try_close(bus);
3318         if (r < 0)
3319                 return r;
3320
3321         sd_bus_close(bus);
3322         return 0;
3323 }
3324
3325 _public_ int sd_bus_get_name(sd_bus *bus, const char **name) {
3326         assert_return(bus, -EINVAL);
3327         assert_return(name, -EINVAL);
3328         assert_return(!bus_pid_changed(bus), -ECHILD);
3329
3330         *name = bus->connection_name;
3331         return 0;
3332 }