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