1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #ifdef HAVE_VALGRIND_MEMCHECK_H
23 #include <valgrind/memcheck.h>
30 #include <sys/prctl.h>
34 #include "memfd-util.h"
36 #include "bus-internal.h"
37 #include "bus-message.h"
38 #include "bus-kernel.h"
39 #include "bus-bloom.h"
41 #include "bus-label.h"
42 #include "cgroup-util.h"
44 #define UNIQUE_NAME_MAX (3+DECIMAL_STR_MAX(uint64_t))
46 int bus_kernel_parse_unique_name(const char *s, uint64_t *id) {
52 if (!startswith(s, ":1."))
55 r = safe_atou64(s + 3, id);
62 static void append_payload_vec(struct kdbus_item **d, const void *p, size_t sz) {
68 /* Note that p can be NULL, which encodes a region full of
69 * zeroes, which is useful to optimize certain padding
72 (*d)->size = offsetof(struct kdbus_item, vec) + sizeof(struct kdbus_vec);
73 (*d)->type = KDBUS_ITEM_PAYLOAD_VEC;
74 (*d)->vec.address = PTR_TO_UINT64(p);
77 *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
80 static void append_payload_memfd(struct kdbus_item **d, int memfd, size_t sz) {
86 (*d)->size = offsetof(struct kdbus_item, memfd) + sizeof(struct kdbus_memfd);
87 (*d)->type = KDBUS_ITEM_PAYLOAD_MEMFD;
88 (*d)->memfd.fd = memfd;
89 (*d)->memfd.size = sz;
91 *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
94 static void append_destination(struct kdbus_item **d, const char *s, size_t length) {
100 (*d)->size = offsetof(struct kdbus_item, str) + length + 1;
101 (*d)->type = KDBUS_ITEM_DST_NAME;
102 memcpy((*d)->str, s, length + 1);
104 *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
107 static struct kdbus_bloom_filter *append_bloom(struct kdbus_item **d, size_t length) {
108 struct kdbus_item *i;
114 i->size = offsetof(struct kdbus_item, bloom_filter) +
115 offsetof(struct kdbus_bloom_filter, data) +
117 i->type = KDBUS_ITEM_BLOOM_FILTER;
119 *d = (struct kdbus_item *) ((uint8_t*) i + i->size);
121 return &i->bloom_filter;
124 static void append_fds(struct kdbus_item **d, const int fds[], unsigned n_fds) {
130 (*d)->size = offsetof(struct kdbus_item, fds) + sizeof(int) * n_fds;
131 (*d)->type = KDBUS_ITEM_FDS;
132 memcpy((*d)->fds, fds, sizeof(int) * n_fds);
134 *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
137 static int bus_message_setup_bloom(sd_bus_message *m, struct kdbus_bloom_filter *bloom) {
146 memzero(data, m->bus->bloom_size);
147 bloom->generation = 0;
149 bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, "message-type", bus_message_type_to_string(m->header->type));
152 bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, "interface", m->interface);
154 bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, "member", m->member);
156 bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, "path", m->path);
157 bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, "path-slash-prefix", m->path);
158 bloom_add_prefixes(data, m->bus->bloom_size, m->bus->bloom_n_hash, "path-slash-prefix", m->path, '/');
161 r = sd_bus_message_rewind(m, true);
165 for (i = 0; i < 64; i++) {
168 char buf[sizeof("arg")-1 + 2 + sizeof("-slash-prefix")];
171 r = sd_bus_message_peek_type(m, &type, NULL);
175 if (type != SD_BUS_TYPE_STRING &&
176 type != SD_BUS_TYPE_OBJECT_PATH &&
177 type != SD_BUS_TYPE_SIGNATURE)
180 r = sd_bus_message_read_basic(m, type, &t);
184 e = stpcpy(buf, "arg");
186 *(e++) = '0' + (char) i;
188 *(e++) = '0' + (char) (i / 10);
189 *(e++) = '0' + (char) (i % 10);
193 bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, buf, t);
195 strcpy(e, "-dot-prefix");
196 bloom_add_prefixes(data, m->bus->bloom_size, m->bus->bloom_n_hash, buf, t, '.');
197 strcpy(e, "-slash-prefix");
198 bloom_add_prefixes(data, m->bus->bloom_size, m->bus->bloom_n_hash, buf, t, '/');
204 static int bus_message_setup_kmsg(sd_bus *b, sd_bus_message *m) {
205 struct bus_body_part *part;
206 struct kdbus_item *d;
207 const char *destination;
218 /* We put this together only once, if this message is reused
219 * we reuse the earlier-built version */
223 destination = m->destination ?: m->destination_ptr;
226 r = bus_kernel_parse_unique_name(destination, &unique);
234 sz = offsetof(struct kdbus_msg, items);
236 assert_cc(ALIGN8(offsetof(struct kdbus_item, vec) + sizeof(struct kdbus_vec)) ==
237 ALIGN8(offsetof(struct kdbus_item, memfd) + sizeof(struct kdbus_memfd)));
239 /* Add in fixed header, fields header and payload */
240 sz += (1 + m->n_body_parts) *
241 ALIGN8(offsetof(struct kdbus_item, vec) + sizeof(struct kdbus_vec));
243 /* Add space for bloom filter */
244 sz += ALIGN8(offsetof(struct kdbus_item, bloom_filter) +
245 offsetof(struct kdbus_bloom_filter, data) +
248 /* Add in well-known destination header */
250 dl = strlen(destination);
251 sz += ALIGN8(offsetof(struct kdbus_item, str) + dl + 1);
254 /* Add space for unix fds */
256 sz += ALIGN8(offsetof(struct kdbus_item, fds) + sizeof(int)*m->n_fds);
258 m->kdbus = memalign(8, sz);
264 m->free_kdbus = true;
265 memzero(m->kdbus, sz);
268 ((m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) ? 0 : KDBUS_MSG_FLAGS_EXPECT_REPLY) |
269 ((m->header->flags & BUS_MESSAGE_NO_AUTO_START) ? KDBUS_MSG_FLAGS_NO_AUTO_START : 0);
272 /* verify_destination_id will usually be 0, which makes the kernel driver only look
273 * at the provided well-known name. Otherwise, the kernel will make sure the provided
274 * destination id matches the owner of the provided weel-known-name, and fail if they
275 * differ. Currently, this is only needed for bus-proxyd. */
276 m->kdbus->dst_id = m->verify_destination_id;
278 m->kdbus->dst_id = destination ? unique : KDBUS_DST_ID_BROADCAST;
280 m->kdbus->payload_type = KDBUS_PAYLOAD_DBUS;
281 m->kdbus->cookie = (uint64_t) m->header->serial;
282 m->kdbus->priority = m->priority;
284 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
285 m->kdbus->cookie_reply = m->reply_cookie;
289 assert_se(clock_gettime(CLOCK_MONOTONIC_COARSE, &now) == 0);
290 m->kdbus->timeout_ns = now.tv_sec * NSEC_PER_SEC + now.tv_nsec +
291 m->timeout * NSEC_PER_USEC;
297 append_destination(&d, destination, dl);
299 append_payload_vec(&d, m->header, BUS_MESSAGE_BODY_BEGIN(m));
301 MESSAGE_FOREACH_PART(part, i, m) {
303 /* If this is padding then simply send a
304 * vector with a NULL data pointer which the
305 * kernel will just pass through. This is the
306 * most efficient way to encode zeroes */
308 append_payload_vec(&d, NULL, part->size);
312 if (part->memfd >= 0 && part->sealed && destination) {
313 /* Try to send a memfd, if the part is
314 * sealed and this is not a broadcast. Since we can only */
316 append_payload_memfd(&d, part->memfd, part->size);
320 /* Otherwise, let's send a vector to the actual data.
321 * For that, we need to map it first. */
322 r = bus_body_part_map(part);
326 append_payload_vec(&d, part->data, part->size);
329 if (m->kdbus->dst_id == KDBUS_DST_ID_BROADCAST) {
330 struct kdbus_bloom_filter *bloom;
332 bloom = append_bloom(&d, m->bus->bloom_size);
333 r = bus_message_setup_bloom(m, bloom);
339 append_fds(&d, m->fds, m->n_fds);
341 m->kdbus->size = (uint8_t*) d - (uint8_t*) m->kdbus;
342 assert(m->kdbus->size <= sz);
351 static void bus_message_set_sender_driver(sd_bus *bus, sd_bus_message *m) {
355 m->sender = m->creds.unique_name = (char*) "org.freedesktop.DBus";
356 m->creds.well_known_names_driver = true;
357 m->creds.mask |= (SD_BUS_CREDS_UNIQUE_NAME|SD_BUS_CREDS_WELL_KNOWN_NAMES) & bus->creds_mask;
360 static void unset_memfds(struct sd_bus_message *m) {
361 struct bus_body_part *part;
366 /* Make sure the memfds are not freed twice */
367 MESSAGE_FOREACH_PART(part, i, m)
368 if (part->memfd >= 0)
372 static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
373 sd_bus_message *m = NULL;
374 struct kdbus_item *d;
376 _cleanup_free_ int *fds = NULL;
377 struct bus_header *h = NULL;
378 size_t total, n_bytes = 0, idx = 0;
379 const char *destination = NULL, *seclabel = NULL;
384 assert(k->payload_type == KDBUS_PAYLOAD_DBUS);
386 KDBUS_ITEM_FOREACH(d, k, items) {
389 l = d->size - offsetof(struct kdbus_item, data);
393 case KDBUS_ITEM_PAYLOAD_OFF:
395 h = (struct bus_header *)((uint8_t *)k + d->vec.offset);
397 if (!bus_header_is_complete(h, d->vec.size))
401 n_bytes += d->vec.size;
404 case KDBUS_ITEM_PAYLOAD_MEMFD:
408 n_bytes += d->memfd.size;
411 case KDBUS_ITEM_FDS: {
416 f = realloc(fds, sizeof(int) * (n_fds + j));
421 memcpy(fds + n_fds, d->fds, sizeof(int) * j);
426 case KDBUS_ITEM_SECLABEL:
435 r = bus_header_message_size(h, &total);
439 if (n_bytes != total)
442 /* on kdbus we only speak native endian gvariant, never dbus1
443 * marshalling or reverse endian */
444 if (h->version != 2 ||
445 h->endian != BUS_NATIVE_ENDIAN)
448 r = bus_message_from_header(bus, h, sizeof(struct bus_header), fds, n_fds, NULL, seclabel, 0, &m);
452 /* The well-known names list is different from the other
453 credentials. If we asked for it, but nothing is there, this
454 means that the list of well-known names is simply empty, not
455 that we lack any data */
457 m->creds.mask |= (SD_BUS_CREDS_UNIQUE_NAME|SD_BUS_CREDS_WELL_KNOWN_NAMES) & bus->creds_mask;
459 KDBUS_ITEM_FOREACH(d, k, items) {
462 l = d->size - offsetof(struct kdbus_item, data);
466 case KDBUS_ITEM_PAYLOAD_OFF: {
469 begin_body = BUS_MESSAGE_BODY_BEGIN(m);
471 if (idx + d->vec.size > begin_body) {
472 struct bus_body_part *part;
474 /* Contains body material */
476 part = message_append_part(m);
482 /* A -1 offset is NUL padding. */
483 part->is_zero = d->vec.offset == ~0ULL;
485 if (idx >= begin_body) {
487 part->data = (uint8_t *)k + d->vec.offset;
488 part->size = d->vec.size;
491 part->data = (uint8_t *)k + d->vec.offset + (begin_body - idx);
492 part->size = d->vec.size - (begin_body - idx);
502 case KDBUS_ITEM_PAYLOAD_MEMFD: {
503 struct bus_body_part *part;
505 if (idx < BUS_MESSAGE_BODY_BEGIN(m)) {
510 part = message_append_part(m);
516 part->memfd = d->memfd.fd;
517 part->size = d->memfd.size;
520 idx += d->memfd.size;
524 case KDBUS_ITEM_PIDS:
526 /* The PID starttime/TID might be missing,
527 * when the data is faked by some data bus
528 * proxy and it lacks that information about
529 * the real client since SO_PEERCRED is used
532 if (d->pids.pid > 0) {
533 m->creds.pid = (pid_t) d->pids.pid;
534 m->creds.mask |= SD_BUS_CREDS_PID & bus->creds_mask;
537 if (d->pids.starttime > 0) {
538 m->creds.pid_starttime = d->pids.starttime / NSEC_PER_USEC;
539 m->creds.mask |= SD_BUS_CREDS_PID_STARTTIME & bus->creds_mask;
542 if (d->pids.tid > 0) {
543 m->creds.tid = (pid_t) d->pids.tid;
544 m->creds.mask |= SD_BUS_CREDS_TID & bus->creds_mask;
549 case KDBUS_ITEM_CREDS:
551 /* EUID/SUID/FSUID/EGID/SGID/FSGID might be missing too (see above). */
553 if ((uid_t) d->creds.uid != (uid_t) -1) {
554 m->creds.uid = (uid_t) d->creds.uid;
555 m->creds.mask |= SD_BUS_CREDS_UID & bus->creds_mask;
558 if ((uid_t) d->creds.euid != (uid_t) -1) {
559 m->creds.euid = (uid_t) d->creds.euid;
560 m->creds.mask |= SD_BUS_CREDS_EUID & bus->creds_mask;
563 if ((uid_t) d->creds.suid != (uid_t) -1) {
564 m->creds.suid = (uid_t) d->creds.suid;
565 m->creds.mask |= SD_BUS_CREDS_SUID & bus->creds_mask;
568 if ((uid_t) d->creds.fsuid != (uid_t) -1) {
569 m->creds.fsuid = (uid_t) d->creds.fsuid;
570 m->creds.mask |= SD_BUS_CREDS_FSUID & bus->creds_mask;
573 if ((gid_t) d->creds.gid != (gid_t) -1) {
574 m->creds.gid = (gid_t) d->creds.gid;
575 m->creds.mask |= SD_BUS_CREDS_GID & bus->creds_mask;
578 if ((gid_t) d->creds.egid != (gid_t) -1) {
579 m->creds.egid = (gid_t) d->creds.egid;
580 m->creds.mask |= SD_BUS_CREDS_EGID & bus->creds_mask;
583 if ((gid_t) d->creds.sgid != (gid_t) -1) {
584 m->creds.sgid = (gid_t) d->creds.sgid;
585 m->creds.mask |= SD_BUS_CREDS_SGID & bus->creds_mask;
588 if ((gid_t) d->creds.fsgid != (gid_t) -1) {
589 m->creds.fsgid = (gid_t) d->creds.fsgid;
590 m->creds.mask |= SD_BUS_CREDS_FSGID & bus->creds_mask;
595 case KDBUS_ITEM_TIMESTAMP:
597 if (bus->attach_flags & KDBUS_ATTACH_TIMESTAMP) {
598 m->realtime = d->timestamp.realtime_ns / NSEC_PER_USEC;
599 m->monotonic = d->timestamp.monotonic_ns / NSEC_PER_USEC;
600 m->seqnum = d->timestamp.seqnum;
605 case KDBUS_ITEM_PID_COMM:
606 m->creds.comm = d->str;
607 m->creds.mask |= SD_BUS_CREDS_COMM & bus->creds_mask;
610 case KDBUS_ITEM_TID_COMM:
611 m->creds.tid_comm = d->str;
612 m->creds.mask |= SD_BUS_CREDS_TID_COMM & bus->creds_mask;
616 m->creds.exe = d->str;
617 m->creds.mask |= SD_BUS_CREDS_EXE & bus->creds_mask;
620 case KDBUS_ITEM_CMDLINE:
621 m->creds.cmdline = d->str;
622 m->creds.cmdline_size = l;
623 m->creds.mask |= SD_BUS_CREDS_CMDLINE & bus->creds_mask;
626 case KDBUS_ITEM_CGROUP:
627 m->creds.cgroup = d->str;
628 m->creds.mask |= (SD_BUS_CREDS_CGROUP|SD_BUS_CREDS_UNIT|SD_BUS_CREDS_USER_UNIT|SD_BUS_CREDS_SLICE|SD_BUS_CREDS_SESSION|SD_BUS_CREDS_OWNER_UID) & bus->creds_mask;
630 r = bus_get_root_path(bus);
634 m->creds.cgroup_root = bus->cgroup_root;
638 case KDBUS_ITEM_AUDIT:
639 if ((uint32_t) d->audit.sessionid != (uint32_t) -1) {
640 m->creds.audit_session_id = (uint32_t) d->audit.sessionid;
641 m->creds.mask |= SD_BUS_CREDS_AUDIT_SESSION_ID & bus->creds_mask;
644 if ((uid_t) d->audit.loginuid != (uid_t) -1) {
645 m->creds.audit_login_uid = (uid_t) d->audit.loginuid;
646 m->creds.mask |= SD_BUS_CREDS_AUDIT_LOGIN_UID & bus->creds_mask;
650 case KDBUS_ITEM_CAPS:
651 m->creds.capability = (uint8_t *) d->caps.caps;
652 m->creds.capability_size = d->size - offsetof(struct kdbus_item, caps.caps);
653 m->creds.mask |= (SD_BUS_CREDS_EFFECTIVE_CAPS|SD_BUS_CREDS_PERMITTED_CAPS|SD_BUS_CREDS_INHERITABLE_CAPS|SD_BUS_CREDS_BOUNDING_CAPS) & bus->creds_mask;
656 case KDBUS_ITEM_DST_NAME:
657 if (!service_name_is_valid(d->str)) {
662 destination = d->str;
665 case KDBUS_ITEM_OWNED_NAME:
666 if (!service_name_is_valid(d->name.name)) {
671 if (bus->creds_mask & SD_BUS_CREDS_WELL_KNOWN_NAMES) {
675 /* We just extend the array here, but
676 * do not allocate the strings inside
677 * of it, instead we just point to our
678 * buffer directly. */
679 n = strv_length(m->creds.well_known_names);
680 wkn = realloc(m->creds.well_known_names, (n + 2) * sizeof(char*));
686 wkn[n] = d->name.name;
688 m->creds.well_known_names = wkn;
690 m->creds.mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES;
694 case KDBUS_ITEM_CONN_DESCRIPTION:
695 m->creds.description = d->str;
696 m->creds.mask |= SD_BUS_CREDS_DESCRIPTION & bus->creds_mask;
699 case KDBUS_ITEM_AUXGROUPS:
701 if (bus->creds_mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS) {
702 assert_cc(sizeof(gid_t) == sizeof(uint32_t));
704 m->creds.n_supplementary_gids = (d->size - offsetof(struct kdbus_item, data32)) / sizeof(uint32_t);
705 m->creds.supplementary_gids = (gid_t*) d->data32;
706 m->creds.mask |= SD_BUS_CREDS_SUPPLEMENTARY_GIDS;
712 case KDBUS_ITEM_SECLABEL:
716 log_debug("Got unknown field from kernel %llu", d->type);
720 r = bus_message_parse_fields(m);
724 /* Refuse messages if kdbus and dbus1 cookie doesn't match up */
725 if ((uint64_t) m->header->serial != k->cookie) {
730 /* Refuse messages where the reply flag doesn't match up */
731 if (!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) != !!(k->flags & KDBUS_MSG_FLAGS_EXPECT_REPLY)) {
736 /* Refuse reply messages where the reply cookie doesn't match up */
737 if ((m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) && m->reply_cookie != k->cookie_reply) {
742 /* Refuse messages where the autostart flag doesn't match up */
743 if (!(m->header->flags & BUS_MESSAGE_NO_AUTO_START) != !(k->flags & KDBUS_MSG_FLAGS_NO_AUTO_START)) {
748 /* Override information from the user header with data from the kernel */
749 if (k->src_id == KDBUS_SRC_ID_KERNEL)
750 bus_message_set_sender_driver(bus, m);
752 snprintf(m->sender_buffer, sizeof(m->sender_buffer), ":1.%llu", (unsigned long long) k->src_id);
753 m->sender = m->creds.unique_name = m->sender_buffer;
757 m->destination = destination;
758 else if (k->dst_id == KDBUS_DST_ID_BROADCAST)
759 m->destination = NULL;
760 else if (k->dst_id == KDBUS_DST_ID_NAME)
761 m->destination = bus->unique_name; /* fill in unique name if the well-known name is missing */
763 snprintf(m->destination_buffer, sizeof(m->destination_buffer), ":1.%llu", (unsigned long long) k->dst_id);
764 m->destination = m->destination_buffer;
767 /* We take possession of the kmsg struct now */
769 m->release_kdbus = true;
773 bus->rqueue[bus->rqueue_size++] = m;
779 sd_bus_message_unref(m);
784 int bus_kernel_take_fd(sd_bus *b) {
785 struct kdbus_cmd_hello *hello;
786 struct kdbus_item *item;
787 _cleanup_free_ char *g = NULL;
789 size_t l = 0, m = 0, sz;
799 if (b->description) {
800 g = bus_label_escape(b->description);
808 /* If no name is explicitly set, we'll include a hint
809 * indicating the library implementation, a hint which
810 * kind of bus this is and the thread name */
812 assert_se(prctl(PR_GET_NAME, (unsigned long) pr) >= 0);
815 name = b->is_system ? "sd-system" :
816 b->is_user ? "sd-user" : "sd";
818 _cleanup_free_ char *e = NULL;
820 e = bus_label_escape(pr);
824 g = strappend(b->is_system ? "sd-system-" :
825 b->is_user ? "sd-user-" : "sd-",
833 b->description = bus_label_unescape(name);
840 sz = ALIGN8(offsetof(struct kdbus_cmd_hello, items)) +
841 ALIGN8(offsetof(struct kdbus_item, str) + m + 1);
843 if (b->fake_creds_valid)
844 sz += ALIGN8(offsetof(struct kdbus_item, creds) + sizeof(struct kdbus_creds));
846 if (b->fake_pids_valid)
847 sz += ALIGN8(offsetof(struct kdbus_item, pids) + sizeof(struct kdbus_pids));
850 l = strlen(b->fake_label);
851 sz += ALIGN8(offsetof(struct kdbus_item, str) + l + 1);
854 hello = alloca0_align(sz, 8);
856 hello->flags = b->hello_flags;
857 hello->attach_flags_send = _KDBUS_ATTACH_ANY;
858 hello->attach_flags_recv = b->attach_flags;
859 hello->pool_size = KDBUS_POOL_SIZE;
863 item->size = offsetof(struct kdbus_item, str) + m + 1;
864 item->type = KDBUS_ITEM_CONN_DESCRIPTION;
865 memcpy(item->str, name, m + 1);
866 item = KDBUS_ITEM_NEXT(item);
868 if (b->fake_creds_valid) {
869 item->size = offsetof(struct kdbus_item, creds) + sizeof(struct kdbus_creds);
870 item->type = KDBUS_ITEM_CREDS;
871 item->creds = b->fake_creds;
873 item = KDBUS_ITEM_NEXT(item);
876 if (b->fake_pids_valid) {
877 item->size = offsetof(struct kdbus_item, pids) + sizeof(struct kdbus_pids);
878 item->type = KDBUS_ITEM_PIDS;
879 item->pids = b->fake_pids;
881 item = KDBUS_ITEM_NEXT(item);
885 item->size = offsetof(struct kdbus_item, str) + l + 1;
886 item->type = KDBUS_ITEM_SECLABEL;
887 memcpy(item->str, b->fake_label, l+1);
890 r = ioctl(b->input_fd, KDBUS_CMD_HELLO, hello);
894 if (!b->kdbus_buffer) {
895 b->kdbus_buffer = mmap(NULL, KDBUS_POOL_SIZE, PROT_READ, MAP_SHARED, b->input_fd, 0);
896 if (b->kdbus_buffer == MAP_FAILED) {
897 b->kdbus_buffer = NULL;
902 /* The higher 32bit of the bus_flags fields are considered
903 * 'incompatible flags'. Refuse them all for now. */
904 if (hello->bus_flags > 0xFFFFFFFFULL)
907 if (!bloom_validate_parameters((size_t) hello->bloom.size, (unsigned) hello->bloom.n_hash))
910 b->bloom_size = (size_t) hello->bloom.size;
911 b->bloom_n_hash = (unsigned) hello->bloom.n_hash;
913 if (asprintf(&b->unique_name, ":1.%llu", (unsigned long long) hello->id) < 0)
916 b->unique_id = hello->id;
919 b->bus_client = true;
920 b->can_fds = !!(hello->flags & KDBUS_HELLO_ACCEPT_FD);
921 b->message_version = 2;
922 b->message_endian = BUS_NATIVE_ENDIAN;
924 /* the kernel told us the UUID of the underlying bus */
925 memcpy(b->server_id.bytes, hello->id128, sizeof(b->server_id.bytes));
927 return bus_start_running(b);
930 int bus_kernel_connect(sd_bus *b) {
932 assert(b->input_fd < 0);
933 assert(b->output_fd < 0);
939 b->input_fd = open(b->kernel, O_RDWR|O_NOCTTY|O_CLOEXEC);
943 b->output_fd = b->input_fd;
945 return bus_kernel_take_fd(b);
948 static void close_kdbus_msg(sd_bus *bus, struct kdbus_msg *k) {
949 struct kdbus_cmd_free cmd = {};
950 struct kdbus_item *d;
955 cmd.offset = (uint8_t *)k - (uint8_t *)bus->kdbus_buffer;
957 KDBUS_ITEM_FOREACH(d, k, items) {
959 if (d->type == KDBUS_ITEM_FDS)
960 close_many(d->fds, (d->size - offsetof(struct kdbus_item, fds)) / sizeof(int));
961 else if (d->type == KDBUS_ITEM_PAYLOAD_MEMFD)
962 safe_close(d->memfd.fd);
965 (void) ioctl(bus->input_fd, KDBUS_CMD_FREE, &cmd);
968 int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call) {
973 assert(bus->state == BUS_RUNNING);
975 /* If we can't deliver, we want room for the error message */
976 r = bus_rqueue_make_room(bus);
980 r = bus_message_setup_kmsg(bus, m);
984 /* If this is a synchronous method call, then let's tell the
985 * kernel, so that it can pass CPU time/scheduling to the
986 * destination for the time, if it wants to. If we
987 * synchronously wait for the result anyway, we won't need CPU
990 m->kdbus->flags |= KDBUS_MSG_FLAGS_EXPECT_REPLY|KDBUS_MSG_FLAGS_SYNC_REPLY;
992 r = ioctl(bus->output_fd, KDBUS_CMD_MSG_SEND, m->kdbus);
994 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
995 sd_bus_message *reply;
997 if (errno == EAGAIN || errno == EINTR)
999 else if (errno == ENXIO || errno == ESRCH) {
1001 /* ENXIO: unique name not known
1002 * ESRCH: well-known name not known */
1004 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL)
1005 sd_bus_error_setf(&error, SD_BUS_ERROR_SERVICE_UNKNOWN, "Destination %s not known", m->destination);
1007 log_debug("Could not deliver message to %s as destination is not known. Ignoring.", m->destination);
1011 } else if (errno == EADDRNOTAVAIL) {
1013 /* EADDRNOTAVAIL: activation is possible, but turned off in request flags */
1015 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL)
1016 sd_bus_error_setf(&error, SD_BUS_ERROR_SERVICE_UNKNOWN, "Activation of %s not requested", m->destination);
1018 log_debug("Could not deliver message to %s as destination is not activated. Ignoring.", m->destination);
1024 r = bus_message_new_synthetic_error(
1026 BUS_MESSAGE_COOKIE(m),
1033 r = bus_seal_synthetic_message(bus, reply);
1037 bus->rqueue[bus->rqueue_size++] = reply;
1039 } else if (hint_sync_call) {
1040 struct kdbus_msg *k;
1042 k = (struct kdbus_msg *)((uint8_t *)bus->kdbus_buffer + m->kdbus->offset_reply);
1045 if (k->payload_type == KDBUS_PAYLOAD_DBUS) {
1047 r = bus_kernel_make_message(bus, k);
1049 close_kdbus_msg(bus, k);
1051 /* Anybody can send us invalid messages, let's just drop them. */
1052 if (r == -EBADMSG || r == -EPROTOTYPE)
1053 log_debug("Ignoring invalid message: %s", strerror(-r));
1058 log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k->payload_type);
1059 close_kdbus_msg(bus, k);
1066 static int push_name_owner_changed(sd_bus *bus, const char *name, const char *old_owner, const char *new_owner) {
1067 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
1072 r = sd_bus_message_new_signal(
1075 "/org/freedesktop/DBus",
1076 "org.freedesktop.DBus",
1077 "NameOwnerChanged");
1081 r = sd_bus_message_append(m, "sss", name, old_owner, new_owner);
1085 bus_message_set_sender_driver(bus, m);
1087 r = bus_seal_synthetic_message(bus, m);
1091 bus->rqueue[bus->rqueue_size++] = m;
1097 static int translate_name_change(sd_bus *bus, struct kdbus_msg *k, struct kdbus_item *d) {
1098 char new_owner[UNIQUE_NAME_MAX], old_owner[UNIQUE_NAME_MAX];
1104 if (d->type == KDBUS_ITEM_NAME_ADD || (d->name_change.old_id.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR)))
1107 sprintf(old_owner, ":1.%llu", (unsigned long long) d->name_change.old_id.id);
1109 if (d->type == KDBUS_ITEM_NAME_REMOVE || (d->name_change.new_id.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR))) {
1111 if (isempty(old_owner))
1116 sprintf(new_owner, ":1.%llu", (unsigned long long) d->name_change.new_id.id);
1118 return push_name_owner_changed(bus, d->name_change.name, old_owner, new_owner);
1121 static int translate_id_change(sd_bus *bus, struct kdbus_msg *k, struct kdbus_item *d) {
1122 char owner[UNIQUE_NAME_MAX];
1128 sprintf(owner, ":1.%llu", d->id_change.id);
1130 return push_name_owner_changed(
1132 d->type == KDBUS_ITEM_ID_ADD ? NULL : owner,
1133 d->type == KDBUS_ITEM_ID_ADD ? owner : NULL);
1136 static int translate_reply(sd_bus *bus, struct kdbus_msg *k, struct kdbus_item *d) {
1137 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
1144 r = bus_message_new_synthetic_error(
1147 d->type == KDBUS_ITEM_REPLY_TIMEOUT ?
1148 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out") :
1149 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call peer died"),
1154 bus_message_set_sender_driver(bus, m);
1156 r = bus_seal_synthetic_message(bus, m);
1160 bus->rqueue[bus->rqueue_size++] = m;
1166 static int bus_kernel_translate_message(sd_bus *bus, struct kdbus_msg *k) {
1167 struct kdbus_item *d, *found = NULL;
1169 static int (* const translate[])(sd_bus *bus, struct kdbus_msg *k, struct kdbus_item *d) = {
1170 [KDBUS_ITEM_NAME_ADD - _KDBUS_ITEM_KERNEL_BASE] = translate_name_change,
1171 [KDBUS_ITEM_NAME_REMOVE - _KDBUS_ITEM_KERNEL_BASE] = translate_name_change,
1172 [KDBUS_ITEM_NAME_CHANGE - _KDBUS_ITEM_KERNEL_BASE] = translate_name_change,
1174 [KDBUS_ITEM_ID_ADD - _KDBUS_ITEM_KERNEL_BASE] = translate_id_change,
1175 [KDBUS_ITEM_ID_REMOVE - _KDBUS_ITEM_KERNEL_BASE] = translate_id_change,
1177 [KDBUS_ITEM_REPLY_TIMEOUT - _KDBUS_ITEM_KERNEL_BASE] = translate_reply,
1178 [KDBUS_ITEM_REPLY_DEAD - _KDBUS_ITEM_KERNEL_BASE] = translate_reply,
1183 assert(k->payload_type == KDBUS_PAYLOAD_KERNEL);
1185 KDBUS_ITEM_FOREACH(d, k, items) {
1186 if (d->type >= _KDBUS_ITEM_KERNEL_BASE && d->type < _KDBUS_ITEM_KERNEL_BASE + ELEMENTSOF(translate)) {
1191 log_debug("Got unknown field from kernel %llu", d->type);
1195 log_debug("Didn't find a kernel message to translate.");
1199 return translate[found->type - _KDBUS_ITEM_KERNEL_BASE](bus, k, found);
1202 int bus_kernel_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1203 struct kdbus_cmd_recv recv = {};
1204 struct kdbus_msg *k;
1209 r = bus_rqueue_make_room(bus);
1213 if (hint_priority) {
1214 recv.flags |= KDBUS_RECV_USE_PRIORITY;
1215 recv.priority = priority;
1218 r = ioctl(bus->input_fd, KDBUS_CMD_MSG_RECV, &recv);
1220 if (errno == EAGAIN)
1223 if (errno == EOVERFLOW) {
1224 log_debug("%s: kdbus reports %" PRIu64 " dropped broadcast messages, ignoring.", strna(bus->description), (uint64_t) recv.dropped_msgs);
1231 k = (struct kdbus_msg *)((uint8_t *)bus->kdbus_buffer + recv.offset);
1232 if (k->payload_type == KDBUS_PAYLOAD_DBUS) {
1233 r = bus_kernel_make_message(bus, k);
1235 /* Anybody can send us invalid messages, let's just drop them. */
1236 if (r == -EBADMSG || r == -EPROTOTYPE) {
1237 log_debug("Ignoring invalid message: %s", strerror(-r));
1241 } else if (k->payload_type == KDBUS_PAYLOAD_KERNEL)
1242 r = bus_kernel_translate_message(bus, k);
1244 log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k->payload_type);
1249 close_kdbus_msg(bus, k);
1251 return r < 0 ? r : 1;
1254 int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *mapped, size_t *allocated) {
1255 struct memfd_cache *c;
1262 if (!bus || !bus->is_kernel)
1265 assert_se(pthread_mutex_lock(&bus->memfd_cache_mutex) >= 0);
1267 if (bus->n_memfd_cache <= 0) {
1270 assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1272 r = memfd_new(bus->description);
1282 c = &bus->memfd_cache[--bus->n_memfd_cache];
1285 assert(c->mapped == 0 || c->address);
1287 *address = c->address;
1288 *mapped = c->mapped;
1289 *allocated = c->allocated;
1292 assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1297 static void close_and_munmap(int fd, void *address, size_t size) {
1299 assert_se(munmap(address, PAGE_ALIGN(size)) >= 0);
1304 void bus_kernel_push_memfd(sd_bus *bus, int fd, void *address, size_t mapped, size_t allocated) {
1305 struct memfd_cache *c;
1306 uint64_t max_mapped = PAGE_ALIGN(MEMFD_CACHE_ITEM_SIZE_MAX);
1309 assert(mapped == 0 || address);
1311 if (!bus || !bus->is_kernel) {
1312 close_and_munmap(fd, address, mapped);
1316 assert_se(pthread_mutex_lock(&bus->memfd_cache_mutex) >= 0);
1318 if (bus->n_memfd_cache >= ELEMENTSOF(bus->memfd_cache)) {
1319 assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1321 close_and_munmap(fd, address, mapped);
1325 c = &bus->memfd_cache[bus->n_memfd_cache++];
1327 c->address = address;
1329 /* If overly long, let's return a bit to the OS */
1330 if (mapped > max_mapped) {
1331 assert_se(memfd_set_size(fd, max_mapped) >= 0);
1332 assert_se(munmap((uint8_t*) address + max_mapped, PAGE_ALIGN(mapped - max_mapped)) >= 0);
1333 c->mapped = c->allocated = max_mapped;
1336 c->allocated = allocated;
1339 assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1342 void bus_kernel_flush_memfd(sd_bus *b) {
1347 for (i = 0; i < b->n_memfd_cache; i++)
1348 close_and_munmap(b->memfd_cache[i].fd, b->memfd_cache[i].address, b->memfd_cache[i].mapped);
1351 uint64_t request_name_flags_to_kdbus(uint64_t flags) {
1354 if (flags & SD_BUS_NAME_ALLOW_REPLACEMENT)
1355 f |= KDBUS_NAME_ALLOW_REPLACEMENT;
1357 if (flags & SD_BUS_NAME_REPLACE_EXISTING)
1358 f |= KDBUS_NAME_REPLACE_EXISTING;
1360 if (flags & SD_BUS_NAME_QUEUE)
1361 f |= KDBUS_NAME_QUEUE;
1366 uint64_t attach_flags_to_kdbus(uint64_t mask) {
1369 if (mask & (SD_BUS_CREDS_UID|SD_BUS_CREDS_EUID|SD_BUS_CREDS_SUID|SD_BUS_CREDS_FSUID|
1370 SD_BUS_CREDS_GID|SD_BUS_CREDS_EGID|SD_BUS_CREDS_SGID|SD_BUS_CREDS_FSGID))
1371 m |= KDBUS_ATTACH_CREDS;
1373 if (mask & (SD_BUS_CREDS_PID|SD_BUS_CREDS_PID_STARTTIME|SD_BUS_CREDS_TID))
1374 m |= KDBUS_ATTACH_PIDS;
1376 if (mask & SD_BUS_CREDS_COMM)
1377 m |= KDBUS_ATTACH_PID_COMM;
1379 if (mask & SD_BUS_CREDS_TID_COMM)
1380 m |= KDBUS_ATTACH_TID_COMM;
1382 if (mask & SD_BUS_CREDS_EXE)
1383 m |= KDBUS_ATTACH_EXE;
1385 if (mask & SD_BUS_CREDS_CMDLINE)
1386 m |= KDBUS_ATTACH_CMDLINE;
1388 if (mask & (SD_BUS_CREDS_CGROUP|SD_BUS_CREDS_UNIT|SD_BUS_CREDS_USER_UNIT|SD_BUS_CREDS_SLICE|SD_BUS_CREDS_SESSION|SD_BUS_CREDS_OWNER_UID))
1389 m |= KDBUS_ATTACH_CGROUP;
1391 if (mask & (SD_BUS_CREDS_EFFECTIVE_CAPS|SD_BUS_CREDS_PERMITTED_CAPS|SD_BUS_CREDS_INHERITABLE_CAPS|SD_BUS_CREDS_BOUNDING_CAPS))
1392 m |= KDBUS_ATTACH_CAPS;
1394 if (mask & SD_BUS_CREDS_SELINUX_CONTEXT)
1395 m |= KDBUS_ATTACH_SECLABEL;
1397 if (mask & (SD_BUS_CREDS_AUDIT_SESSION_ID|SD_BUS_CREDS_AUDIT_LOGIN_UID))
1398 m |= KDBUS_ATTACH_AUDIT;
1400 if (mask & SD_BUS_CREDS_WELL_KNOWN_NAMES)
1401 m |= KDBUS_ATTACH_NAMES;
1403 if (mask & SD_BUS_CREDS_DESCRIPTION)
1404 m |= KDBUS_ATTACH_CONN_DESCRIPTION;
1406 if (mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS)
1407 m |= KDBUS_ATTACH_AUXGROUPS;
1412 int bus_kernel_create_bus(const char *name, bool world, char **s) {
1413 struct kdbus_cmd_make *make;
1414 struct kdbus_item *n;
1421 fd = open("/sys/fs/kdbus/control", O_RDWR|O_NOCTTY|O_CLOEXEC);
1426 make = alloca0_align(offsetof(struct kdbus_cmd_make, items) +
1427 ALIGN8(offsetof(struct kdbus_item, bloom_parameter) + sizeof(struct kdbus_bloom_parameter)) +
1428 ALIGN8(offsetof(struct kdbus_item, data64) + sizeof(uint64_t)) +
1429 ALIGN8(offsetof(struct kdbus_item, str) + DECIMAL_STR_MAX(uid_t) + 1 + l + 1),
1432 make->size = offsetof(struct kdbus_cmd_make, items);
1434 /* Set the bloom parameters */
1436 n->size = offsetof(struct kdbus_item, bloom_parameter) +
1437 sizeof(struct kdbus_bloom_parameter);
1438 n->type = KDBUS_ITEM_BLOOM_PARAMETER;
1439 n->bloom_parameter.size = DEFAULT_BLOOM_SIZE;
1440 n->bloom_parameter.n_hash = DEFAULT_BLOOM_N_HASH;
1442 assert_cc(DEFAULT_BLOOM_SIZE > 0);
1443 assert_cc(DEFAULT_BLOOM_N_HASH > 0);
1445 make->size += ALIGN8(n->size);
1447 /* The busses we create make no restrictions on what metadata
1448 * peers can read from incoming messages. */
1449 n = KDBUS_ITEM_NEXT(n);
1450 n->type = KDBUS_ITEM_ATTACH_FLAGS_RECV;
1451 n->size = offsetof(struct kdbus_item, data64) + sizeof(uint64_t);
1452 n->data64[0] = _KDBUS_ATTACH_ANY;
1453 make->size += ALIGN8(n->size);
1455 /* Set the a good name */
1456 n = KDBUS_ITEM_NEXT(n);
1457 sprintf(n->str, UID_FMT "-%s", getuid(), name);
1458 n->size = offsetof(struct kdbus_item, str) + strlen(n->str) + 1;
1459 n->type = KDBUS_ITEM_MAKE_NAME;
1460 make->size += ALIGN8(n->size);
1462 make->flags = world ? KDBUS_MAKE_ACCESS_WORLD : 0;
1464 if (ioctl(fd, KDBUS_CMD_BUS_MAKE, make) < 0) {
1472 p = strjoin("/sys/fs/kdbus/", n->str, "/bus", NULL);
1484 static int bus_kernel_translate_access(BusPolicyAccess access) {
1485 assert(access >= 0);
1486 assert(access < _BUS_POLICY_ACCESS_MAX);
1490 case BUS_POLICY_ACCESS_SEE:
1491 return KDBUS_POLICY_SEE;
1493 case BUS_POLICY_ACCESS_TALK:
1494 return KDBUS_POLICY_TALK;
1496 case BUS_POLICY_ACCESS_OWN:
1497 return KDBUS_POLICY_OWN;
1500 assert_not_reached("Unknown policy access");
1504 static int bus_kernel_translate_policy(const BusNamePolicy *policy, struct kdbus_item *item) {
1510 switch (policy->type) {
1512 case BUSNAME_POLICY_TYPE_USER: {
1513 const char *user = policy->name;
1516 r = get_user_creds(&user, &uid, NULL, NULL, NULL);
1520 item->policy_access.type = KDBUS_POLICY_ACCESS_USER;
1521 item->policy_access.id = uid;
1525 case BUSNAME_POLICY_TYPE_GROUP: {
1526 const char *group = policy->name;
1529 r = get_group_creds(&group, &gid);
1533 item->policy_access.type = KDBUS_POLICY_ACCESS_GROUP;
1534 item->policy_access.id = gid;
1539 assert_not_reached("Unknown policy type");
1542 item->policy_access.access = bus_kernel_translate_access(policy->access);
1547 int bus_kernel_open_bus_fd(const char *bus, char **path) {
1554 len = strlen("/sys/fs/kdbus/") + DECIMAL_STR_MAX(uid_t) + 1 + strlen(bus) + strlen("/bus") + 1;
1561 p = newa(char, len);
1563 sprintf(p, "/sys/fs/kdbus/" UID_FMT "-%s/bus", getuid(), bus);
1565 fd = open(p, O_RDWR|O_NOCTTY|O_CLOEXEC);
1579 int bus_kernel_create_endpoint(const char *bus_name, const char *ep_name, char **ep_path) {
1580 _cleanup_free_ char *path = NULL;
1581 struct kdbus_cmd_make *make;
1582 struct kdbus_item *n;
1586 fd = bus_kernel_open_bus_fd(bus_name, &path);
1590 make = alloca0_align(ALIGN8(offsetof(struct kdbus_cmd_make, items)) +
1591 ALIGN8(offsetof(struct kdbus_item, str) + DECIMAL_STR_MAX(uid_t) + 1 + strlen(ep_name) + 1),
1593 make->size = ALIGN8(offsetof(struct kdbus_cmd_make, items));
1594 make->flags = KDBUS_MAKE_ACCESS_WORLD;
1597 sprintf(n->str, UID_FMT "-%s", getuid(), ep_name);
1598 n->size = offsetof(struct kdbus_item, str) + strlen(n->str) + 1;
1599 n->type = KDBUS_ITEM_MAKE_NAME;
1600 make->size += ALIGN8(n->size);
1603 if (ioctl(fd, KDBUS_CMD_ENDPOINT_MAKE, make) < 0) {
1611 p = strjoin(dirname(path), "/", name, NULL);
1623 int bus_kernel_set_endpoint_policy(int fd, uid_t uid, BusEndpoint *ep) {
1625 struct kdbus_cmd_update *update;
1626 struct kdbus_item *n;
1627 BusEndpointPolicy *po;
1632 size = ALIGN8(offsetof(struct kdbus_cmd_update, items));
1634 HASHMAP_FOREACH(po, ep->policy_hash, i) {
1635 size += ALIGN8(offsetof(struct kdbus_item, str) + strlen(po->name) + 1);
1636 size += ALIGN8(offsetof(struct kdbus_item, policy_access) + sizeof(struct kdbus_policy_access));
1639 update = alloca0_align(size, 8);
1640 update->size = size;
1644 HASHMAP_FOREACH(po, ep->policy_hash, i) {
1645 n->type = KDBUS_ITEM_NAME;
1646 n->size = offsetof(struct kdbus_item, str) + strlen(po->name) + 1;
1647 strcpy(n->str, po->name);
1648 n = KDBUS_ITEM_NEXT(n);
1650 n->type = KDBUS_ITEM_POLICY_ACCESS;
1651 n->size = offsetof(struct kdbus_item, policy_access) + sizeof(struct kdbus_policy_access);
1653 n->policy_access.type = KDBUS_POLICY_ACCESS_USER;
1654 n->policy_access.access = bus_kernel_translate_access(po->access);
1655 n->policy_access.id = uid;
1657 n = KDBUS_ITEM_NEXT(n);
1660 r = ioctl(fd, KDBUS_CMD_ENDPOINT_UPDATE, update);
1667 int bus_kernel_make_starter(
1672 BusNamePolicy *policy,
1673 BusPolicyAccess world_policy) {
1675 struct kdbus_cmd_hello *hello;
1676 struct kdbus_item *n;
1677 size_t policy_cnt = 0;
1685 LIST_FOREACH(policy, po, policy)
1688 if (world_policy >= 0)
1691 size = offsetof(struct kdbus_cmd_hello, items) +
1692 ALIGN8(offsetof(struct kdbus_item, str) + strlen(name) + 1) +
1693 policy_cnt * ALIGN8(offsetof(struct kdbus_item, policy_access) + sizeof(struct kdbus_policy_access));
1695 hello = alloca0_align(size, 8);
1698 strcpy(n->str, name);
1699 n->size = offsetof(struct kdbus_item, str) + strlen(n->str) + 1;
1700 n->type = KDBUS_ITEM_NAME;
1701 n = KDBUS_ITEM_NEXT(n);
1703 LIST_FOREACH(policy, po, policy) {
1704 n->type = KDBUS_ITEM_POLICY_ACCESS;
1705 n->size = offsetof(struct kdbus_item, policy_access) + sizeof(struct kdbus_policy_access);
1707 r = bus_kernel_translate_policy(po, n);
1711 n = KDBUS_ITEM_NEXT(n);
1714 if (world_policy >= 0) {
1715 n->type = KDBUS_ITEM_POLICY_ACCESS;
1716 n->size = offsetof(struct kdbus_item, policy_access) + sizeof(struct kdbus_policy_access);
1717 n->policy_access.type = KDBUS_POLICY_ACCESS_WORLD;
1718 n->policy_access.access = bus_kernel_translate_access(world_policy);
1723 (activating ? KDBUS_HELLO_ACTIVATOR : KDBUS_HELLO_POLICY_HOLDER) |
1724 (accept_fd ? KDBUS_HELLO_ACCEPT_FD : 0);
1725 hello->pool_size = KDBUS_POOL_SIZE;
1726 hello->attach_flags_send = _KDBUS_ATTACH_ANY;
1727 hello->attach_flags_recv = _KDBUS_ATTACH_ANY;
1729 if (ioctl(fd, KDBUS_CMD_HELLO, hello) < 0)
1732 /* The higher 32bit of the bus_flags fields are considered
1733 * 'incompatible flags'. Refuse them all for now. */
1734 if (hello->bus_flags > 0xFFFFFFFFULL)
1737 if (!bloom_validate_parameters((size_t) hello->bloom.size, (unsigned) hello->bloom.n_hash))
1743 int bus_kernel_try_close(sd_bus *bus) {
1745 assert(bus->is_kernel);
1747 if (ioctl(bus->input_fd, KDBUS_CMD_BYEBYE) < 0)
1753 int bus_kernel_drop_one(int fd) {
1754 struct kdbus_cmd_recv recv = {
1755 .flags = KDBUS_RECV_DROP
1760 if (ioctl(fd, KDBUS_CMD_MSG_RECV, &recv) < 0)
1766 int bus_kernel_realize_attach_flags(sd_bus *bus) {
1767 struct kdbus_cmd_update *update;
1768 struct kdbus_item *n;
1771 assert(bus->is_kernel);
1773 update = alloca0_align(offsetof(struct kdbus_cmd_update, items) +
1774 ALIGN8(offsetof(struct kdbus_item, data64) + sizeof(uint64_t)),
1778 n->type = KDBUS_ITEM_ATTACH_FLAGS_RECV;
1779 n->size = offsetof(struct kdbus_item, data64) + sizeof(uint64_t);
1780 n->data64[0] = bus->attach_flags;
1783 offsetof(struct kdbus_cmd_update, items) +
1786 if (ioctl(bus->input_fd, KDBUS_CMD_CONN_UPDATE, update) < 0)