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