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>
29 #include <sys/prctl.h>
31 /* When we include libgen.h because we need dirname() we immediately
32 * undefine basename() since libgen.h defines it as a macro to the POSIX
33 * version which is really broken. We prefer GNU basename(). */
39 #include "memfd-util.h"
40 #include "capability.h"
42 #include "formats-util.h"
44 #include "bus-internal.h"
45 #include "bus-message.h"
46 #include "bus-kernel.h"
47 #include "bus-bloom.h"
48 #include "bus-label.h"
50 #define UNIQUE_NAME_MAX (3+DECIMAL_STR_MAX(uint64_t))
52 int bus_kernel_parse_unique_name(const char *s
, uint64_t *id
) {
58 if (!startswith(s
, ":1."))
61 r
= safe_atou64(s
+ 3, id
);
68 static void append_payload_vec(struct kdbus_item
**d
, const void *p
, size_t sz
) {
74 /* Note that p can be NULL, which encodes a region full of
75 * zeroes, which is useful to optimize certain padding
78 (*d
)->size
= offsetof(struct kdbus_item
, vec
) + sizeof(struct kdbus_vec
);
79 (*d
)->type
= KDBUS_ITEM_PAYLOAD_VEC
;
80 (*d
)->vec
.address
= PTR_TO_UINT64(p
);
83 *d
= (struct kdbus_item
*) ((uint8_t*) *d
+ (*d
)->size
);
86 static void append_payload_memfd(struct kdbus_item
**d
, int memfd
, size_t start
, size_t sz
) {
92 (*d
)->size
= offsetof(struct kdbus_item
, memfd
) + sizeof(struct kdbus_memfd
);
93 (*d
)->type
= KDBUS_ITEM_PAYLOAD_MEMFD
;
94 (*d
)->memfd
.fd
= memfd
;
95 (*d
)->memfd
.start
= start
;
96 (*d
)->memfd
.size
= sz
;
98 *d
= (struct kdbus_item
*) ((uint8_t*) *d
+ (*d
)->size
);
101 static void append_destination(struct kdbus_item
**d
, const char *s
, size_t length
) {
107 (*d
)->size
= offsetof(struct kdbus_item
, str
) + length
+ 1;
108 (*d
)->type
= KDBUS_ITEM_DST_NAME
;
109 memcpy((*d
)->str
, s
, length
+ 1);
111 *d
= (struct kdbus_item
*) ((uint8_t*) *d
+ (*d
)->size
);
114 static struct kdbus_bloom_filter
*append_bloom(struct kdbus_item
**d
, size_t length
) {
115 struct kdbus_item
*i
;
121 i
->size
= offsetof(struct kdbus_item
, bloom_filter
) +
122 offsetof(struct kdbus_bloom_filter
, data
) +
124 i
->type
= KDBUS_ITEM_BLOOM_FILTER
;
126 *d
= (struct kdbus_item
*) ((uint8_t*) i
+ i
->size
);
128 return &i
->bloom_filter
;
131 static void append_fds(struct kdbus_item
**d
, const int fds
[], unsigned n_fds
) {
137 (*d
)->size
= offsetof(struct kdbus_item
, fds
) + sizeof(int) * n_fds
;
138 (*d
)->type
= KDBUS_ITEM_FDS
;
139 memcpy((*d
)->fds
, fds
, sizeof(int) * n_fds
);
141 *d
= (struct kdbus_item
*) ((uint8_t*) *d
+ (*d
)->size
);
144 static void add_bloom_arg(void *data
, size_t size
, unsigned n_hash
, unsigned i
, const char *t
) {
145 char buf
[sizeof("arg")-1 + 2 + sizeof("-slash-prefix")];
153 e
= stpcpy(buf
, "arg");
155 *(e
++) = '0' + (char) i
;
157 *(e
++) = '0' + (char) (i
/ 10);
158 *(e
++) = '0' + (char) (i
% 10);
162 bloom_add_pair(data
, size
, n_hash
, buf
, t
);
164 strcpy(e
, "-dot-prefix");
165 bloom_add_prefixes(data
, size
, n_hash
, buf
, t
, '.');
166 strcpy(e
, "-slash-prefix");
167 bloom_add_prefixes(data
, size
, n_hash
, buf
, t
, '/');
170 static int bus_message_setup_bloom(sd_bus_message
*m
, struct kdbus_bloom_filter
*bloom
) {
179 memzero(data
, m
->bus
->bloom_size
);
180 bloom
->generation
= 0;
182 bloom_add_pair(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "message-type", bus_message_type_to_string(m
->header
->type
));
185 bloom_add_pair(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "interface", m
->interface
);
187 bloom_add_pair(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "member", m
->member
);
189 bloom_add_pair(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "path", m
->path
);
190 bloom_add_pair(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "path-slash-prefix", m
->path
);
191 bloom_add_prefixes(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "path-slash-prefix", m
->path
, '/');
194 r
= sd_bus_message_rewind(m
, true);
198 for (i
= 0; i
< 64; i
++) {
199 const char *t
, *contents
;
202 r
= sd_bus_message_peek_type(m
, &type
, &contents
);
206 if (IN_SET(type
, SD_BUS_TYPE_STRING
, SD_BUS_TYPE_OBJECT_PATH
, SD_BUS_TYPE_SIGNATURE
)) {
208 /* The bloom filter includes simple strings of any kind */
209 r
= sd_bus_message_read_basic(m
, type
, &t
);
213 add_bloom_arg(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, i
, t
);
216 if (type
== SD_BUS_TYPE_ARRAY
&& STR_IN_SET(contents
, "s", "o", "g")) {
218 /* As well as array of simple strings of any kinds */
219 r
= sd_bus_message_enter_container(m
, type
, contents
);
223 while ((r
= sd_bus_message_read_basic(m
, contents
[0], &t
)) > 0)
224 add_bloom_arg(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, i
, t
);
228 r
= sd_bus_message_exit_container(m
);
233 /* Stop adding to bloom filter as soon as we
234 * run into the first argument we cannot add
242 static int bus_message_setup_kmsg(sd_bus
*b
, sd_bus_message
*m
) {
243 struct bus_body_part
*part
;
244 struct kdbus_item
*d
;
245 const char *destination
;
256 /* We put this together only once, if this message is reused
257 * we reuse the earlier-built version */
261 destination
= m
->destination
?: m
->destination_ptr
;
264 r
= bus_kernel_parse_unique_name(destination
, &unique
);
272 sz
= offsetof(struct kdbus_msg
, items
);
274 /* Add in fixed header, fields header and payload */
275 sz
+= (1 + m
->n_body_parts
) * ALIGN8(offsetof(struct kdbus_item
, vec
) +
276 MAX(sizeof(struct kdbus_vec
),
277 sizeof(struct kdbus_memfd
)));
279 /* Add space for bloom filter */
280 sz
+= ALIGN8(offsetof(struct kdbus_item
, bloom_filter
) +
281 offsetof(struct kdbus_bloom_filter
, data
) +
284 /* Add in well-known destination header */
286 dl
= strlen(destination
);
287 sz
+= ALIGN8(offsetof(struct kdbus_item
, str
) + dl
+ 1);
290 /* Add space for unix fds */
292 sz
+= ALIGN8(offsetof(struct kdbus_item
, fds
) + sizeof(int)*m
->n_fds
);
294 m
->kdbus
= memalign(8, sz
);
300 m
->free_kdbus
= true;
301 memzero(m
->kdbus
, sz
);
304 ((m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
) ? 0 : KDBUS_MSG_EXPECT_REPLY
) |
305 ((m
->header
->flags
& BUS_MESSAGE_NO_AUTO_START
) ? KDBUS_MSG_NO_AUTO_START
: 0) |
306 ((m
->header
->type
== SD_BUS_MESSAGE_SIGNAL
) ? KDBUS_MSG_SIGNAL
: 0);
309 /* verify_destination_id will usually be 0, which makes the kernel driver only look
310 * at the provided well-known name. Otherwise, the kernel will make sure the provided
311 * destination id matches the owner of the provided weel-known-name, and fail if they
312 * differ. Currently, this is only needed for bus-proxyd. */
313 m
->kdbus
->dst_id
= m
->verify_destination_id
;
315 m
->kdbus
->dst_id
= destination
? unique
: KDBUS_DST_ID_BROADCAST
;
317 m
->kdbus
->payload_type
= KDBUS_PAYLOAD_DBUS
;
318 m
->kdbus
->cookie
= m
->header
->dbus2
.cookie
;
319 m
->kdbus
->priority
= m
->priority
;
321 if (m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
)
322 m
->kdbus
->cookie_reply
= m
->reply_cookie
;
326 assert_se(clock_gettime(CLOCK_MONOTONIC_COARSE
, &now
) == 0);
327 m
->kdbus
->timeout_ns
= now
.tv_sec
* NSEC_PER_SEC
+ now
.tv_nsec
+
328 m
->timeout
* NSEC_PER_USEC
;
334 append_destination(&d
, destination
, dl
);
336 append_payload_vec(&d
, m
->header
, BUS_MESSAGE_BODY_BEGIN(m
));
338 MESSAGE_FOREACH_PART(part
, i
, m
) {
340 /* If this is padding then simply send a
341 * vector with a NULL data pointer which the
342 * kernel will just pass through. This is the
343 * most efficient way to encode zeroes */
345 append_payload_vec(&d
, NULL
, part
->size
);
349 if (part
->memfd
>= 0 && part
->sealed
&& destination
) {
350 /* Try to send a memfd, if the part is
351 * sealed and this is not a broadcast. Since we can only */
353 append_payload_memfd(&d
, part
->memfd
, part
->memfd_offset
, part
->size
);
357 /* Otherwise, let's send a vector to the actual data.
358 * For that, we need to map it first. */
359 r
= bus_body_part_map(part
);
363 append_payload_vec(&d
, part
->data
, part
->size
);
366 if (m
->header
->type
== SD_BUS_MESSAGE_SIGNAL
) {
367 struct kdbus_bloom_filter
*bloom
;
369 bloom
= append_bloom(&d
, m
->bus
->bloom_size
);
370 r
= bus_message_setup_bloom(m
, bloom
);
376 append_fds(&d
, m
->fds
, m
->n_fds
);
378 m
->kdbus
->size
= (uint8_t*) d
- (uint8_t*) m
->kdbus
;
379 assert(m
->kdbus
->size
<= sz
);
388 static void unset_memfds(struct sd_bus_message
*m
) {
389 struct bus_body_part
*part
;
394 /* Make sure the memfds are not freed twice */
395 MESSAGE_FOREACH_PART(part
, i
, m
)
396 if (part
->memfd
>= 0)
400 static void message_set_timestamp(sd_bus
*bus
, sd_bus_message
*m
, const struct kdbus_timestamp
*ts
) {
407 if (!(bus
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
))
410 m
->realtime
= ts
->realtime_ns
/ NSEC_PER_USEC
;
411 m
->monotonic
= ts
->monotonic_ns
/ NSEC_PER_USEC
;
412 m
->seqnum
= ts
->seqnum
;
415 static int bus_kernel_make_message(sd_bus
*bus
, struct kdbus_msg
*k
) {
416 sd_bus_message
*m
= NULL
;
417 struct kdbus_item
*d
;
419 _cleanup_free_
int *fds
= NULL
;
420 struct bus_header
*header
= NULL
;
422 size_t header_size
= 0, footer_size
= 0;
423 size_t n_bytes
= 0, idx
= 0;
424 const char *destination
= NULL
, *seclabel
= NULL
;
425 bool last_was_memfd
= false;
430 assert(k
->payload_type
== KDBUS_PAYLOAD_DBUS
);
432 KDBUS_ITEM_FOREACH(d
, k
, items
) {
435 l
= d
->size
- offsetof(struct kdbus_item
, data
);
439 case KDBUS_ITEM_PAYLOAD_OFF
:
441 header
= (struct bus_header
*)((uint8_t*) k
+ d
->vec
.offset
);
442 header_size
= d
->vec
.size
;
445 footer
= (uint8_t*) k
+ d
->vec
.offset
;
446 footer_size
= d
->vec
.size
;
448 n_bytes
+= d
->vec
.size
;
449 last_was_memfd
= false;
452 case KDBUS_ITEM_PAYLOAD_MEMFD
:
453 if (!header
) /* memfd cannot be first part */
456 n_bytes
+= d
->memfd
.size
;
457 last_was_memfd
= true;
460 case KDBUS_ITEM_FDS
: {
465 f
= realloc(fds
, sizeof(int) * (n_fds
+ j
));
470 memcpy(fds
+ n_fds
, d
->fds
, sizeof(int) * j
);
475 case KDBUS_ITEM_SECLABEL
:
481 if (last_was_memfd
) /* memfd cannot be last part */
487 if (header_size
< sizeof(struct bus_header
))
490 /* on kdbus we only speak native endian gvariant, never dbus1
491 * marshalling or reverse endian */
492 if (header
->version
!= 2 ||
493 header
->endian
!= BUS_NATIVE_ENDIAN
)
496 r
= bus_message_from_header(
506 /* The well-known names list is different from the other
507 credentials. If we asked for it, but nothing is there, this
508 means that the list of well-known names is simply empty, not
509 that we lack any data */
511 m
->creds
.mask
|= (SD_BUS_CREDS_UNIQUE_NAME
|SD_BUS_CREDS_WELL_KNOWN_NAMES
) & bus
->creds_mask
;
513 KDBUS_ITEM_FOREACH(d
, k
, items
) {
516 l
= d
->size
- offsetof(struct kdbus_item
, data
);
520 case KDBUS_ITEM_PAYLOAD_OFF
: {
523 begin_body
= BUS_MESSAGE_BODY_BEGIN(m
);
525 if (idx
+ d
->vec
.size
> begin_body
) {
526 struct bus_body_part
*part
;
528 /* Contains body material */
530 part
= message_append_part(m
);
536 /* A -1 offset is NUL padding. */
537 part
->is_zero
= d
->vec
.offset
== ~0ULL;
539 if (idx
>= begin_body
) {
541 part
->data
= (uint8_t* )k
+ d
->vec
.offset
;
542 part
->size
= d
->vec
.size
;
545 part
->data
= (uint8_t*) k
+ d
->vec
.offset
+ (begin_body
- idx
);
546 part
->size
= d
->vec
.size
- (begin_body
- idx
);
556 case KDBUS_ITEM_PAYLOAD_MEMFD
: {
557 struct bus_body_part
*part
;
559 if (idx
< BUS_MESSAGE_BODY_BEGIN(m
)) {
564 part
= message_append_part(m
);
570 part
->memfd
= d
->memfd
.fd
;
571 part
->memfd_offset
= d
->memfd
.start
;
572 part
->size
= d
->memfd
.size
;
575 idx
+= d
->memfd
.size
;
579 case KDBUS_ITEM_PIDS
:
581 /* The PID/TID might be missing, when the data
582 * is faked by a bus proxy and it lacks that
583 * information about the real client (since
584 * SO_PEERCRED is used for that). Also kernel
585 * namespacing might make some of this data
586 * unavailable when untranslatable. */
588 if (d
->pids
.pid
> 0) {
589 m
->creds
.pid
= (pid_t
) d
->pids
.pid
;
590 m
->creds
.mask
|= SD_BUS_CREDS_PID
& bus
->creds_mask
;
593 if (d
->pids
.tid
> 0) {
594 m
->creds
.tid
= (pid_t
) d
->pids
.tid
;
595 m
->creds
.mask
|= SD_BUS_CREDS_TID
& bus
->creds_mask
;
598 if (d
->pids
.ppid
> 0) {
599 m
->creds
.ppid
= (pid_t
) d
->pids
.ppid
;
600 m
->creds
.mask
|= SD_BUS_CREDS_PPID
& bus
->creds_mask
;
601 } else if (d
->pids
.pid
== 1) {
603 m
->creds
.mask
|= SD_BUS_CREDS_PPID
& bus
->creds_mask
;
608 case KDBUS_ITEM_CREDS
:
610 /* EUID/SUID/FSUID/EGID/SGID/FSGID might be
611 * missing too (see above). */
613 if ((uid_t
) d
->creds
.uid
!= UID_INVALID
) {
614 m
->creds
.uid
= (uid_t
) d
->creds
.uid
;
615 m
->creds
.mask
|= SD_BUS_CREDS_UID
& bus
->creds_mask
;
618 if ((uid_t
) d
->creds
.euid
!= UID_INVALID
) {
619 m
->creds
.euid
= (uid_t
) d
->creds
.euid
;
620 m
->creds
.mask
|= SD_BUS_CREDS_EUID
& bus
->creds_mask
;
623 if ((uid_t
) d
->creds
.suid
!= UID_INVALID
) {
624 m
->creds
.suid
= (uid_t
) d
->creds
.suid
;
625 m
->creds
.mask
|= SD_BUS_CREDS_SUID
& bus
->creds_mask
;
628 if ((uid_t
) d
->creds
.fsuid
!= UID_INVALID
) {
629 m
->creds
.fsuid
= (uid_t
) d
->creds
.fsuid
;
630 m
->creds
.mask
|= SD_BUS_CREDS_FSUID
& bus
->creds_mask
;
633 if ((gid_t
) d
->creds
.gid
!= GID_INVALID
) {
634 m
->creds
.gid
= (gid_t
) d
->creds
.gid
;
635 m
->creds
.mask
|= SD_BUS_CREDS_GID
& bus
->creds_mask
;
638 if ((gid_t
) d
->creds
.egid
!= GID_INVALID
) {
639 m
->creds
.egid
= (gid_t
) d
->creds
.egid
;
640 m
->creds
.mask
|= SD_BUS_CREDS_EGID
& bus
->creds_mask
;
643 if ((gid_t
) d
->creds
.sgid
!= GID_INVALID
) {
644 m
->creds
.sgid
= (gid_t
) d
->creds
.sgid
;
645 m
->creds
.mask
|= SD_BUS_CREDS_SGID
& bus
->creds_mask
;
648 if ((gid_t
) d
->creds
.fsgid
!= GID_INVALID
) {
649 m
->creds
.fsgid
= (gid_t
) d
->creds
.fsgid
;
650 m
->creds
.mask
|= SD_BUS_CREDS_FSGID
& bus
->creds_mask
;
655 case KDBUS_ITEM_TIMESTAMP
:
656 message_set_timestamp(bus
, m
, &d
->timestamp
);
659 case KDBUS_ITEM_PID_COMM
:
660 m
->creds
.comm
= d
->str
;
661 m
->creds
.mask
|= SD_BUS_CREDS_COMM
& bus
->creds_mask
;
664 case KDBUS_ITEM_TID_COMM
:
665 m
->creds
.tid_comm
= d
->str
;
666 m
->creds
.mask
|= SD_BUS_CREDS_TID_COMM
& bus
->creds_mask
;
670 m
->creds
.exe
= d
->str
;
671 m
->creds
.mask
|= SD_BUS_CREDS_EXE
& bus
->creds_mask
;
674 case KDBUS_ITEM_CMDLINE
:
675 m
->creds
.cmdline
= d
->str
;
676 m
->creds
.cmdline_size
= l
;
677 m
->creds
.mask
|= SD_BUS_CREDS_CMDLINE
& bus
->creds_mask
;
680 case KDBUS_ITEM_CGROUP
:
681 m
->creds
.cgroup
= d
->str
;
682 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
;
684 r
= bus_get_root_path(bus
);
688 m
->creds
.cgroup_root
= bus
->cgroup_root
;
691 case KDBUS_ITEM_AUDIT
:
692 m
->creds
.audit_session_id
= (uint32_t) d
->audit
.sessionid
;
693 m
->creds
.mask
|= SD_BUS_CREDS_AUDIT_SESSION_ID
& bus
->creds_mask
;
695 m
->creds
.audit_login_uid
= (uid_t
) d
->audit
.loginuid
;
696 m
->creds
.mask
|= SD_BUS_CREDS_AUDIT_LOGIN_UID
& bus
->creds_mask
;
699 case KDBUS_ITEM_CAPS
:
700 if (d
->caps
.last_cap
!= cap_last_cap() ||
701 d
->size
- offsetof(struct kdbus_item
, caps
.caps
) < DIV_ROUND_UP(d
->caps
.last_cap
, 32U) * 4 * 4) {
706 m
->creds
.capability
= d
->caps
.caps
;
707 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
;
710 case KDBUS_ITEM_DST_NAME
:
711 if (!service_name_is_valid(d
->str
)) {
716 destination
= d
->str
;
719 case KDBUS_ITEM_OWNED_NAME
:
720 if (!service_name_is_valid(d
->name
.name
)) {
725 if (bus
->creds_mask
& SD_BUS_CREDS_WELL_KNOWN_NAMES
) {
729 /* We just extend the array here, but
730 * do not allocate the strings inside
731 * of it, instead we just point to our
732 * buffer directly. */
733 n
= strv_length(m
->creds
.well_known_names
);
734 wkn
= realloc(m
->creds
.well_known_names
, (n
+ 2) * sizeof(char*));
740 wkn
[n
] = d
->name
.name
;
742 m
->creds
.well_known_names
= wkn
;
744 m
->creds
.mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
;
748 case KDBUS_ITEM_CONN_DESCRIPTION
:
749 m
->creds
.description
= d
->str
;
750 m
->creds
.mask
|= SD_BUS_CREDS_DESCRIPTION
& bus
->creds_mask
;
753 case KDBUS_ITEM_AUXGROUPS
:
755 if (bus
->creds_mask
& SD_BUS_CREDS_SUPPLEMENTARY_GIDS
) {
759 n
= (d
->size
- offsetof(struct kdbus_item
, data64
)) / sizeof(uint64_t);
766 for (i
= 0; i
< n
; i
++)
769 m
->creds
.supplementary_gids
= g
;
770 m
->creds
.n_supplementary_gids
= n
;
771 m
->creds
.mask
|= SD_BUS_CREDS_SUPPLEMENTARY_GIDS
;
777 case KDBUS_ITEM_SECLABEL
:
778 case KDBUS_ITEM_BLOOM_FILTER
:
782 log_debug("Got unknown field from kernel %llu", d
->type
);
786 /* If we requested the list of well-known names to be appended
787 * and the sender had none no item for it will be
788 * attached. However, this does *not* mean that the kernel
789 * didn't want to provide this information to us. Hence, let's
790 * explicitly mark this information as available if it was
792 m
->creds
.mask
|= bus
->creds_mask
& SD_BUS_CREDS_WELL_KNOWN_NAMES
;
794 r
= bus_message_parse_fields(m
);
798 /* Refuse messages if kdbus and dbus1 cookie doesn't match up */
799 if ((uint64_t) m
->header
->dbus2
.cookie
!= k
->cookie
) {
804 /* Refuse messages where the reply flag doesn't match up */
805 if (!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
) != !!(k
->flags
& KDBUS_MSG_EXPECT_REPLY
)) {
810 /* Refuse reply messages where the reply cookie doesn't match up */
811 if ((m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
) && m
->reply_cookie
!= k
->cookie_reply
) {
816 /* Refuse messages where the autostart flag doesn't match up */
817 if (!(m
->header
->flags
& BUS_MESSAGE_NO_AUTO_START
) != !(k
->flags
& KDBUS_MSG_NO_AUTO_START
)) {
822 /* Override information from the user header with data from the kernel */
823 if (k
->src_id
== KDBUS_SRC_ID_KERNEL
)
824 bus_message_set_sender_driver(bus
, m
);
826 snprintf(m
->sender_buffer
, sizeof(m
->sender_buffer
), ":1.%llu", (unsigned long long) k
->src_id
);
827 m
->sender
= m
->creds
.unique_name
= m
->sender_buffer
;
831 m
->destination
= destination
;
832 else if (k
->dst_id
== KDBUS_DST_ID_BROADCAST
)
833 m
->destination
= NULL
;
834 else if (k
->dst_id
== KDBUS_DST_ID_NAME
)
835 m
->destination
= bus
->unique_name
; /* fill in unique name if the well-known name is missing */
837 snprintf(m
->destination_buffer
, sizeof(m
->destination_buffer
), ":1.%llu", (unsigned long long) k
->dst_id
);
838 m
->destination
= m
->destination_buffer
;
841 /* We take possession of the kmsg struct now */
843 m
->release_kdbus
= true;
847 bus
->rqueue
[bus
->rqueue_size
++] = m
;
853 sd_bus_message_unref(m
);
858 int bus_kernel_take_fd(sd_bus
*b
) {
859 struct kdbus_bloom_parameter
*bloom
= NULL
;
860 struct kdbus_item
*items
, *item
;
861 struct kdbus_cmd_hello
*hello
;
862 _cleanup_free_
char *g
= NULL
;
864 size_t l
= 0, m
= 0, sz
;
874 if (b
->description
) {
875 g
= bus_label_escape(b
->description
);
883 /* If no name is explicitly set, we'll include a hint
884 * indicating the library implementation, a hint which
885 * kind of bus this is and the thread name */
887 assert_se(prctl(PR_GET_NAME
, (unsigned long) pr
) >= 0);
890 name
= b
->is_system
? "sd-system" :
891 b
->is_user
? "sd-user" : "sd";
893 _cleanup_free_
char *e
= NULL
;
895 e
= bus_label_escape(pr
);
899 g
= strappend(b
->is_system
? "sd-system-" :
900 b
->is_user
? "sd-user-" : "sd-",
908 b
->description
= bus_label_unescape(name
);
915 sz
= ALIGN8(offsetof(struct kdbus_cmd_hello
, items
)) +
916 ALIGN8(offsetof(struct kdbus_item
, str
) + m
+ 1);
918 if (b
->fake_creds_valid
)
919 sz
+= ALIGN8(offsetof(struct kdbus_item
, creds
) + sizeof(struct kdbus_creds
));
921 if (b
->fake_pids_valid
)
922 sz
+= ALIGN8(offsetof(struct kdbus_item
, pids
) + sizeof(struct kdbus_pids
));
925 l
= strlen(b
->fake_label
);
926 sz
+= ALIGN8(offsetof(struct kdbus_item
, str
) + l
+ 1);
929 hello
= alloca0_align(sz
, 8);
931 hello
->flags
= b
->hello_flags
;
932 hello
->attach_flags_send
= _KDBUS_ATTACH_ANY
;
933 hello
->attach_flags_recv
= b
->attach_flags
;
934 hello
->pool_size
= KDBUS_POOL_SIZE
;
938 item
->size
= offsetof(struct kdbus_item
, str
) + m
+ 1;
939 item
->type
= KDBUS_ITEM_CONN_DESCRIPTION
;
940 memcpy(item
->str
, name
, m
+ 1);
941 item
= KDBUS_ITEM_NEXT(item
);
943 if (b
->fake_creds_valid
) {
944 item
->size
= offsetof(struct kdbus_item
, creds
) + sizeof(struct kdbus_creds
);
945 item
->type
= KDBUS_ITEM_CREDS
;
946 item
->creds
= b
->fake_creds
;
948 item
= KDBUS_ITEM_NEXT(item
);
951 if (b
->fake_pids_valid
) {
952 item
->size
= offsetof(struct kdbus_item
, pids
) + sizeof(struct kdbus_pids
);
953 item
->type
= KDBUS_ITEM_PIDS
;
954 item
->pids
= b
->fake_pids
;
956 item
= KDBUS_ITEM_NEXT(item
);
960 item
->size
= offsetof(struct kdbus_item
, str
) + l
+ 1;
961 item
->type
= KDBUS_ITEM_SECLABEL
;
962 memcpy(item
->str
, b
->fake_label
, l
+1);
965 r
= ioctl(b
->input_fd
, KDBUS_CMD_HELLO
, hello
);
968 /* If the ioctl is not supported we assume that the
969 * API version changed in a major incompatible way,
970 * let's indicate an API incompatibility in this
972 return -ESOCKTNOSUPPORT
;
977 if (!b
->kdbus_buffer
) {
978 b
->kdbus_buffer
= mmap(NULL
, KDBUS_POOL_SIZE
, PROT_READ
, MAP_SHARED
, b
->input_fd
, 0);
979 if (b
->kdbus_buffer
== MAP_FAILED
) {
980 b
->kdbus_buffer
= NULL
;
986 /* The higher 32bit of the bus_flags fields are considered
987 * 'incompatible flags'. Refuse them all for now. */
988 if (hello
->bus_flags
> 0xFFFFFFFFULL
) {
989 r
= -ESOCKTNOSUPPORT
;
993 /* extract bloom parameters from items */
994 items
= (void*)((uint8_t*)b
->kdbus_buffer
+ hello
->offset
);
995 KDBUS_FOREACH(item
, items
, hello
->items_size
) {
996 switch (item
->type
) {
997 case KDBUS_ITEM_BLOOM_PARAMETER
:
998 bloom
= &item
->bloom_parameter
;
1003 if (!bloom
|| !bloom_validate_parameters((size_t) bloom
->size
, (unsigned) bloom
->n_hash
)) {
1008 b
->bloom_size
= (size_t) bloom
->size
;
1009 b
->bloom_n_hash
= (unsigned) bloom
->n_hash
;
1011 if (asprintf(&b
->unique_name
, ":1.%llu", (unsigned long long) hello
->id
) < 0) {
1016 b
->unique_id
= hello
->id
;
1018 b
->is_kernel
= true;
1019 b
->bus_client
= true;
1020 b
->can_fds
= !!(hello
->flags
& KDBUS_HELLO_ACCEPT_FD
);
1021 b
->message_version
= 2;
1022 b
->message_endian
= BUS_NATIVE_ENDIAN
;
1024 /* the kernel told us the UUID of the underlying bus */
1025 memcpy(b
->server_id
.bytes
, hello
->id128
, sizeof(b
->server_id
.bytes
));
1027 /* free returned items */
1028 (void) bus_kernel_cmd_free(b
, hello
->offset
);
1029 return bus_start_running(b
);
1032 (void) bus_kernel_cmd_free(b
, hello
->offset
);
1036 int bus_kernel_connect(sd_bus
*b
) {
1038 assert(b
->input_fd
< 0);
1039 assert(b
->output_fd
< 0);
1045 b
->input_fd
= open(b
->kernel
, O_RDWR
|O_NOCTTY
|O_CLOEXEC
);
1046 if (b
->input_fd
< 0)
1049 b
->output_fd
= b
->input_fd
;
1051 return bus_kernel_take_fd(b
);
1054 int bus_kernel_cmd_free(sd_bus
*bus
, uint64_t offset
) {
1055 struct kdbus_cmd_free cmd
= {
1056 .size
= sizeof(cmd
),
1062 assert(bus
->is_kernel
);
1064 r
= ioctl(bus
->input_fd
, KDBUS_CMD_FREE
, &cmd
);
1071 static void close_kdbus_msg(sd_bus
*bus
, struct kdbus_msg
*k
) {
1072 struct kdbus_item
*d
;
1077 KDBUS_ITEM_FOREACH(d
, k
, items
) {
1078 if (d
->type
== KDBUS_ITEM_FDS
)
1079 close_many(d
->fds
, (d
->size
- offsetof(struct kdbus_item
, fds
)) / sizeof(int));
1080 else if (d
->type
== KDBUS_ITEM_PAYLOAD_MEMFD
)
1081 safe_close(d
->memfd
.fd
);
1084 bus_kernel_cmd_free(bus
, (uint8_t*) k
- (uint8_t*) bus
->kdbus_buffer
);
1087 int bus_kernel_write_message(sd_bus
*bus
, sd_bus_message
*m
, bool hint_sync_call
) {
1088 struct kdbus_cmd_send cmd
= { };
1093 assert(bus
->state
== BUS_RUNNING
);
1095 /* If we can't deliver, we want room for the error message */
1096 r
= bus_rqueue_make_room(bus
);
1100 r
= bus_message_setup_kmsg(bus
, m
);
1104 cmd
.size
= sizeof(cmd
);
1105 cmd
.msg_address
= (uintptr_t)m
->kdbus
;
1107 /* If this is a synchronous method call, then let's tell the
1108 * kernel, so that it can pass CPU time/scheduling to the
1109 * destination for the time, if it wants to. If we
1110 * synchronously wait for the result anyway, we won't need CPU
1112 if (hint_sync_call
) {
1113 m
->kdbus
->flags
|= KDBUS_MSG_EXPECT_REPLY
;
1114 cmd
.flags
|= KDBUS_SEND_SYNC_REPLY
;
1117 r
= ioctl(bus
->output_fd
, KDBUS_CMD_SEND
, &cmd
);
1119 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
1120 sd_bus_message
*reply
;
1122 if (errno
== EAGAIN
|| errno
== EINTR
)
1124 else if (errno
== ENXIO
|| errno
== ESRCH
) {
1126 /* ENXIO: unique name not known
1127 * ESRCH: well-known name not known */
1129 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
)
1130 sd_bus_error_setf(&error
, SD_BUS_ERROR_SERVICE_UNKNOWN
, "Destination %s not known", m
->destination
);
1132 log_debug("Could not deliver message to %s as destination is not known. Ignoring.", m
->destination
);
1136 } else if (errno
== EADDRNOTAVAIL
) {
1138 /* EADDRNOTAVAIL: activation is possible, but turned off in request flags */
1140 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
)
1141 sd_bus_error_setf(&error
, SD_BUS_ERROR_SERVICE_UNKNOWN
, "Activation of %s not requested", m
->destination
);
1143 log_debug("Could not deliver message to %s as destination is not activated. Ignoring.", m
->destination
);
1149 r
= bus_message_new_synthetic_error(
1151 BUS_MESSAGE_COOKIE(m
),
1158 r
= bus_seal_synthetic_message(bus
, reply
);
1162 bus
->rqueue
[bus
->rqueue_size
++] = reply
;
1164 } else if (hint_sync_call
) {
1165 struct kdbus_msg
*k
;
1167 k
= (struct kdbus_msg
*)((uint8_t *)bus
->kdbus_buffer
+ cmd
.reply
.offset
);
1170 if (k
->payload_type
== KDBUS_PAYLOAD_DBUS
) {
1172 r
= bus_kernel_make_message(bus
, k
);
1174 close_kdbus_msg(bus
, k
);
1176 /* Anybody can send us invalid messages, let's just drop them. */
1177 if (r
== -EBADMSG
|| r
== -EPROTOTYPE
)
1178 log_debug_errno(r
, "Ignoring invalid synchronous reply: %m");
1183 log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k
->payload_type
);
1184 close_kdbus_msg(bus
, k
);
1191 static int push_name_owner_changed(
1194 const char *old_owner
,
1195 const char *new_owner
,
1196 const struct kdbus_timestamp
*ts
) {
1198 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
1203 r
= sd_bus_message_new_signal(
1206 "/org/freedesktop/DBus",
1207 "org.freedesktop.DBus",
1208 "NameOwnerChanged");
1212 r
= sd_bus_message_append(m
, "sss", name
, old_owner
, new_owner
);
1216 bus_message_set_sender_driver(bus
, m
);
1217 message_set_timestamp(bus
, m
, ts
);
1219 r
= bus_seal_synthetic_message(bus
, m
);
1223 bus
->rqueue
[bus
->rqueue_size
++] = m
;
1229 static int translate_name_change(
1231 const struct kdbus_msg
*k
,
1232 const struct kdbus_item
*d
,
1233 const struct kdbus_timestamp
*ts
) {
1235 char new_owner
[UNIQUE_NAME_MAX
], old_owner
[UNIQUE_NAME_MAX
];
1241 if (d
->type
== KDBUS_ITEM_NAME_ADD
|| (d
->name_change
.old_id
.flags
& (KDBUS_NAME_IN_QUEUE
|KDBUS_NAME_ACTIVATOR
)))
1244 sprintf(old_owner
, ":1.%llu", (unsigned long long) d
->name_change
.old_id
.id
);
1246 if (d
->type
== KDBUS_ITEM_NAME_REMOVE
|| (d
->name_change
.new_id
.flags
& (KDBUS_NAME_IN_QUEUE
|KDBUS_NAME_ACTIVATOR
))) {
1248 if (isempty(old_owner
))
1253 sprintf(new_owner
, ":1.%llu", (unsigned long long) d
->name_change
.new_id
.id
);
1255 return push_name_owner_changed(bus
, d
->name_change
.name
, old_owner
, new_owner
, ts
);
1258 static int translate_id_change(
1260 const struct kdbus_msg
*k
,
1261 const struct kdbus_item
*d
,
1262 const struct kdbus_timestamp
*ts
) {
1264 char owner
[UNIQUE_NAME_MAX
];
1270 sprintf(owner
, ":1.%llu", d
->id_change
.id
);
1272 return push_name_owner_changed(
1274 d
->type
== KDBUS_ITEM_ID_ADD
? NULL
: owner
,
1275 d
->type
== KDBUS_ITEM_ID_ADD
? owner
: NULL
,
1279 static int translate_reply(
1281 const struct kdbus_msg
*k
,
1282 const struct kdbus_item
*d
,
1283 const struct kdbus_timestamp
*ts
) {
1285 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
1292 r
= bus_message_new_synthetic_error(
1295 d
->type
== KDBUS_ITEM_REPLY_TIMEOUT
?
1296 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call timed out") :
1297 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call peer died"),
1302 message_set_timestamp(bus
, m
, ts
);
1304 r
= bus_seal_synthetic_message(bus
, m
);
1308 bus
->rqueue
[bus
->rqueue_size
++] = m
;
1314 static int bus_kernel_translate_message(sd_bus
*bus
, struct kdbus_msg
*k
) {
1315 static int (* const translate
[])(sd_bus
*bus
, const struct kdbus_msg
*k
, const struct kdbus_item
*d
, const struct kdbus_timestamp
*ts
) = {
1316 [KDBUS_ITEM_NAME_ADD
- _KDBUS_ITEM_KERNEL_BASE
] = translate_name_change
,
1317 [KDBUS_ITEM_NAME_REMOVE
- _KDBUS_ITEM_KERNEL_BASE
] = translate_name_change
,
1318 [KDBUS_ITEM_NAME_CHANGE
- _KDBUS_ITEM_KERNEL_BASE
] = translate_name_change
,
1320 [KDBUS_ITEM_ID_ADD
- _KDBUS_ITEM_KERNEL_BASE
] = translate_id_change
,
1321 [KDBUS_ITEM_ID_REMOVE
- _KDBUS_ITEM_KERNEL_BASE
] = translate_id_change
,
1323 [KDBUS_ITEM_REPLY_TIMEOUT
- _KDBUS_ITEM_KERNEL_BASE
] = translate_reply
,
1324 [KDBUS_ITEM_REPLY_DEAD
- _KDBUS_ITEM_KERNEL_BASE
] = translate_reply
,
1327 struct kdbus_item
*d
, *found
= NULL
;
1328 struct kdbus_timestamp
*ts
= NULL
;
1332 assert(k
->payload_type
== KDBUS_PAYLOAD_KERNEL
);
1334 KDBUS_ITEM_FOREACH(d
, k
, items
) {
1335 if (d
->type
== KDBUS_ITEM_TIMESTAMP
)
1337 else if (d
->type
>= _KDBUS_ITEM_KERNEL_BASE
&& d
->type
< _KDBUS_ITEM_KERNEL_BASE
+ ELEMENTSOF(translate
)) {
1342 log_debug("Got unknown field from kernel %llu", d
->type
);
1346 log_debug("Didn't find a kernel message to translate.");
1350 return translate
[found
->type
- _KDBUS_ITEM_KERNEL_BASE
](bus
, k
, found
, ts
);
1353 int bus_kernel_read_message(sd_bus
*bus
, bool hint_priority
, int64_t priority
) {
1354 struct kdbus_cmd_recv recv
= { .size
= sizeof(recv
) };
1355 struct kdbus_msg
*k
;
1360 r
= bus_rqueue_make_room(bus
);
1364 if (hint_priority
) {
1365 recv
.flags
|= KDBUS_RECV_USE_PRIORITY
;
1366 recv
.priority
= priority
;
1369 r
= ioctl(bus
->input_fd
, KDBUS_CMD_RECV
, &recv
);
1370 if (recv
.return_flags
& KDBUS_RECV_RETURN_DROPPED_MSGS
)
1371 log_debug("%s: kdbus reports %" PRIu64
" dropped broadcast messages, ignoring.", strna(bus
->description
), (uint64_t) recv
.dropped_msgs
);
1373 if (errno
== EAGAIN
)
1379 k
= (struct kdbus_msg
*)((uint8_t *)bus
->kdbus_buffer
+ recv
.msg
.offset
);
1380 if (k
->payload_type
== KDBUS_PAYLOAD_DBUS
) {
1381 r
= bus_kernel_make_message(bus
, k
);
1383 /* Anybody can send us invalid messages, let's just drop them. */
1384 if (r
== -EBADMSG
|| r
== -EPROTOTYPE
) {
1385 log_debug_errno(r
, "Ignoring invalid message: %m");
1390 close_kdbus_msg(bus
, k
);
1391 } else if (k
->payload_type
== KDBUS_PAYLOAD_KERNEL
) {
1392 r
= bus_kernel_translate_message(bus
, k
);
1393 close_kdbus_msg(bus
, k
);
1395 log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k
->payload_type
);
1397 close_kdbus_msg(bus
, k
);
1400 return r
< 0 ? r
: 1;
1403 int bus_kernel_pop_memfd(sd_bus
*bus
, void **address
, size_t *mapped
, size_t *allocated
) {
1404 struct memfd_cache
*c
;
1411 if (!bus
|| !bus
->is_kernel
)
1414 assert_se(pthread_mutex_lock(&bus
->memfd_cache_mutex
) >= 0);
1416 if (bus
->n_memfd_cache
<= 0) {
1419 assert_se(pthread_mutex_unlock(&bus
->memfd_cache_mutex
) >= 0);
1421 r
= memfd_new(bus
->description
);
1431 c
= &bus
->memfd_cache
[--bus
->n_memfd_cache
];
1434 assert(c
->mapped
== 0 || c
->address
);
1436 *address
= c
->address
;
1437 *mapped
= c
->mapped
;
1438 *allocated
= c
->allocated
;
1441 assert_se(pthread_mutex_unlock(&bus
->memfd_cache_mutex
) >= 0);
1446 static void close_and_munmap(int fd
, void *address
, size_t size
) {
1448 assert_se(munmap(address
, PAGE_ALIGN(size
)) >= 0);
1453 void bus_kernel_push_memfd(sd_bus
*bus
, int fd
, void *address
, size_t mapped
, size_t allocated
) {
1454 struct memfd_cache
*c
;
1455 uint64_t max_mapped
= PAGE_ALIGN(MEMFD_CACHE_ITEM_SIZE_MAX
);
1458 assert(mapped
== 0 || address
);
1460 if (!bus
|| !bus
->is_kernel
) {
1461 close_and_munmap(fd
, address
, mapped
);
1465 assert_se(pthread_mutex_lock(&bus
->memfd_cache_mutex
) >= 0);
1467 if (bus
->n_memfd_cache
>= ELEMENTSOF(bus
->memfd_cache
)) {
1468 assert_se(pthread_mutex_unlock(&bus
->memfd_cache_mutex
) >= 0);
1470 close_and_munmap(fd
, address
, mapped
);
1474 c
= &bus
->memfd_cache
[bus
->n_memfd_cache
++];
1476 c
->address
= address
;
1478 /* If overly long, let's return a bit to the OS */
1479 if (mapped
> max_mapped
) {
1480 assert_se(memfd_set_size(fd
, max_mapped
) >= 0);
1481 assert_se(munmap((uint8_t*) address
+ max_mapped
, PAGE_ALIGN(mapped
- max_mapped
)) >= 0);
1482 c
->mapped
= c
->allocated
= max_mapped
;
1485 c
->allocated
= allocated
;
1488 assert_se(pthread_mutex_unlock(&bus
->memfd_cache_mutex
) >= 0);
1491 void bus_kernel_flush_memfd(sd_bus
*b
) {
1496 for (i
= 0; i
< b
->n_memfd_cache
; i
++)
1497 close_and_munmap(b
->memfd_cache
[i
].fd
, b
->memfd_cache
[i
].address
, b
->memfd_cache
[i
].mapped
);
1500 uint64_t request_name_flags_to_kdbus(uint64_t flags
) {
1503 if (flags
& SD_BUS_NAME_ALLOW_REPLACEMENT
)
1504 f
|= KDBUS_NAME_ALLOW_REPLACEMENT
;
1506 if (flags
& SD_BUS_NAME_REPLACE_EXISTING
)
1507 f
|= KDBUS_NAME_REPLACE_EXISTING
;
1509 if (flags
& SD_BUS_NAME_QUEUE
)
1510 f
|= KDBUS_NAME_QUEUE
;
1515 uint64_t attach_flags_to_kdbus(uint64_t mask
) {
1518 if (mask
& (SD_BUS_CREDS_UID
|SD_BUS_CREDS_EUID
|SD_BUS_CREDS_SUID
|SD_BUS_CREDS_FSUID
|
1519 SD_BUS_CREDS_GID
|SD_BUS_CREDS_EGID
|SD_BUS_CREDS_SGID
|SD_BUS_CREDS_FSGID
))
1520 m
|= KDBUS_ATTACH_CREDS
;
1522 if (mask
& (SD_BUS_CREDS_PID
|SD_BUS_CREDS_TID
|SD_BUS_CREDS_PPID
))
1523 m
|= KDBUS_ATTACH_PIDS
;
1525 if (mask
& SD_BUS_CREDS_COMM
)
1526 m
|= KDBUS_ATTACH_PID_COMM
;
1528 if (mask
& SD_BUS_CREDS_TID_COMM
)
1529 m
|= KDBUS_ATTACH_TID_COMM
;
1531 if (mask
& SD_BUS_CREDS_EXE
)
1532 m
|= KDBUS_ATTACH_EXE
;
1534 if (mask
& SD_BUS_CREDS_CMDLINE
)
1535 m
|= KDBUS_ATTACH_CMDLINE
;
1537 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
))
1538 m
|= KDBUS_ATTACH_CGROUP
;
1540 if (mask
& (SD_BUS_CREDS_EFFECTIVE_CAPS
|SD_BUS_CREDS_PERMITTED_CAPS
|SD_BUS_CREDS_INHERITABLE_CAPS
|SD_BUS_CREDS_BOUNDING_CAPS
))
1541 m
|= KDBUS_ATTACH_CAPS
;
1543 if (mask
& SD_BUS_CREDS_SELINUX_CONTEXT
)
1544 m
|= KDBUS_ATTACH_SECLABEL
;
1546 if (mask
& (SD_BUS_CREDS_AUDIT_SESSION_ID
|SD_BUS_CREDS_AUDIT_LOGIN_UID
))
1547 m
|= KDBUS_ATTACH_AUDIT
;
1549 if (mask
& SD_BUS_CREDS_WELL_KNOWN_NAMES
)
1550 m
|= KDBUS_ATTACH_NAMES
;
1552 if (mask
& SD_BUS_CREDS_DESCRIPTION
)
1553 m
|= KDBUS_ATTACH_CONN_DESCRIPTION
;
1555 if (mask
& SD_BUS_CREDS_SUPPLEMENTARY_GIDS
)
1556 m
|= KDBUS_ATTACH_AUXGROUPS
;
1561 int bus_kernel_create_bus(const char *name
, bool world
, char **s
) {
1562 struct kdbus_cmd
*make
;
1563 struct kdbus_item
*n
;
1570 fd
= open("/sys/fs/kdbus/control", O_RDWR
|O_NOCTTY
|O_CLOEXEC
);
1575 make
= alloca0_align(offsetof(struct kdbus_cmd
, items
) +
1576 ALIGN8(offsetof(struct kdbus_item
, bloom_parameter
) + sizeof(struct kdbus_bloom_parameter
)) +
1577 ALIGN8(offsetof(struct kdbus_item
, data64
) + sizeof(uint64_t)) +
1578 ALIGN8(offsetof(struct kdbus_item
, str
) + DECIMAL_STR_MAX(uid_t
) + 1 + l
+ 1),
1581 make
->size
= offsetof(struct kdbus_cmd
, items
);
1583 /* Set the bloom parameters */
1585 n
->size
= offsetof(struct kdbus_item
, bloom_parameter
) +
1586 sizeof(struct kdbus_bloom_parameter
);
1587 n
->type
= KDBUS_ITEM_BLOOM_PARAMETER
;
1588 n
->bloom_parameter
.size
= DEFAULT_BLOOM_SIZE
;
1589 n
->bloom_parameter
.n_hash
= DEFAULT_BLOOM_N_HASH
;
1591 assert_cc(DEFAULT_BLOOM_SIZE
> 0);
1592 assert_cc(DEFAULT_BLOOM_N_HASH
> 0);
1594 make
->size
+= ALIGN8(n
->size
);
1596 /* Provide all metadata via bus-owner queries */
1597 n
= KDBUS_ITEM_NEXT(n
);
1598 n
->type
= KDBUS_ITEM_ATTACH_FLAGS_SEND
;
1599 n
->size
= offsetof(struct kdbus_item
, data64
) + sizeof(uint64_t);
1600 n
->data64
[0] = _KDBUS_ATTACH_ANY
;
1601 make
->size
+= ALIGN8(n
->size
);
1603 /* Set the a good name */
1604 n
= KDBUS_ITEM_NEXT(n
);
1605 sprintf(n
->str
, UID_FMT
"-%s", getuid(), name
);
1606 n
->size
= offsetof(struct kdbus_item
, str
) + strlen(n
->str
) + 1;
1607 n
->type
= KDBUS_ITEM_MAKE_NAME
;
1608 make
->size
+= ALIGN8(n
->size
);
1610 make
->flags
= world
? KDBUS_MAKE_ACCESS_WORLD
: 0;
1612 if (ioctl(fd
, KDBUS_CMD_BUS_MAKE
, make
) < 0) {
1615 /* Major API change? then the ioctls got shuffled around. */
1616 if (errno
== ENOTTY
)
1617 return -ESOCKTNOSUPPORT
;
1625 p
= strjoin("/sys/fs/kdbus/", n
->str
, "/bus", NULL
);
1637 int bus_kernel_open_bus_fd(const char *bus
, char **path
) {
1644 len
= strlen("/sys/fs/kdbus/") + DECIMAL_STR_MAX(uid_t
) + 1 + strlen(bus
) + strlen("/bus") + 1;
1651 p
= newa(char, len
);
1653 sprintf(p
, "/sys/fs/kdbus/" UID_FMT
"-%s/bus", getuid(), bus
);
1655 fd
= open(p
, O_RDWR
|O_NOCTTY
|O_CLOEXEC
);
1669 int bus_kernel_create_endpoint(const char *bus_name
, const char *ep_name
, char **ep_path
) {
1670 _cleanup_free_
char *path
= NULL
;
1671 struct kdbus_cmd
*make
;
1672 struct kdbus_item
*n
;
1676 fd
= bus_kernel_open_bus_fd(bus_name
, &path
);
1680 make
= alloca0_align(ALIGN8(offsetof(struct kdbus_cmd
, items
)) +
1681 ALIGN8(offsetof(struct kdbus_item
, str
) + DECIMAL_STR_MAX(uid_t
) + 1 + strlen(ep_name
) + 1),
1683 make
->size
= ALIGN8(offsetof(struct kdbus_cmd
, items
));
1684 make
->flags
= KDBUS_MAKE_ACCESS_WORLD
;
1687 sprintf(n
->str
, UID_FMT
"-%s", getuid(), ep_name
);
1688 n
->size
= offsetof(struct kdbus_item
, str
) + strlen(n
->str
) + 1;
1689 n
->type
= KDBUS_ITEM_MAKE_NAME
;
1690 make
->size
+= ALIGN8(n
->size
);
1693 if (ioctl(fd
, KDBUS_CMD_ENDPOINT_MAKE
, make
) < 0) {
1701 p
= strjoin(dirname(path
), "/", name
, NULL
);
1713 int bus_kernel_try_close(sd_bus
*bus
) {
1714 struct kdbus_cmd byebye
= { .size
= sizeof(byebye
) };
1717 assert(bus
->is_kernel
);
1719 if (ioctl(bus
->input_fd
, KDBUS_CMD_BYEBYE
, &byebye
) < 0)
1725 int bus_kernel_drop_one(int fd
) {
1726 struct kdbus_cmd_recv recv
= {
1727 .size
= sizeof(recv
),
1728 .flags
= KDBUS_RECV_DROP
,
1733 if (ioctl(fd
, KDBUS_CMD_RECV
, &recv
) < 0)
1739 int bus_kernel_realize_attach_flags(sd_bus
*bus
) {
1740 struct kdbus_cmd
*update
;
1741 struct kdbus_item
*n
;
1744 assert(bus
->is_kernel
);
1746 update
= alloca0_align(offsetof(struct kdbus_cmd
, items
) +
1747 ALIGN8(offsetof(struct kdbus_item
, data64
) + sizeof(uint64_t)),
1751 n
->type
= KDBUS_ITEM_ATTACH_FLAGS_RECV
;
1752 n
->size
= offsetof(struct kdbus_item
, data64
) + sizeof(uint64_t);
1753 n
->data64
[0] = bus
->attach_flags
;
1756 offsetof(struct kdbus_cmd
, items
) +
1759 if (ioctl(bus
->input_fd
, KDBUS_CMD_UPDATE
, update
) < 0)
1765 int bus_kernel_get_bus_name(sd_bus
*bus
, char **name
) {
1766 struct kdbus_cmd_info cmd
= {
1767 .size
= sizeof(struct kdbus_cmd_info
),
1769 struct kdbus_info
*info
;
1770 struct kdbus_item
*item
;
1776 assert(bus
->is_kernel
);
1778 r
= ioctl(bus
->input_fd
, KDBUS_CMD_BUS_CREATOR_INFO
, &cmd
);
1782 info
= (struct kdbus_info
*) ((uint8_t*) bus
->kdbus_buffer
+ cmd
.offset
);
1784 KDBUS_ITEM_FOREACH(item
, info
, items
)
1785 if (item
->type
== KDBUS_ITEM_MAKE_NAME
) {
1786 r
= free_and_strdup(&n
, item
->str
);
1790 bus_kernel_cmd_free(bus
, cmd
.offset
);