bus-kernel.c revision b5dae4c7f77f7c87b91e0afb60a31c690dda4a1f
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen This file is part of systemd.
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen Copyright 2013 Lennart Poettering
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen systemd is free software; you can redistribute it and/or modify it
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen under the terms of the GNU Lesser General Public License as published by
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen the Free Software Foundation; either version 2.1 of the License, or
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen (at your option) any later version.
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen systemd is distributed in the hope that it will be useful, but
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen WITHOUT ANY WARRANTY; without even the implied warranty of
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen Lesser General Public License for more details.
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen You should have received a copy of the GNU Lesser General Public License
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen along with systemd; If not, see <http://www.gnu.org/licenses/>.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#define UNIQUE_NAME_MAX (3+DECIMAL_STR_MAX(uint64_t))
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekint bus_kernel_parse_unique_name(const char *s, uint64_t *id) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic void append_payload_vec(struct kdbus_item **d, const void *p, size_t sz) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Note that p can be NULL, which encodes a region full of
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * zeroes, which is useful to optimize certain padding
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (*d)->size = offsetof(struct kdbus_item, vec) + sizeof(struct kdbus_vec);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (*d)->type = KDBUS_ITEM_PAYLOAD_VEC;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (*d)->vec.address = PTR_TO_UINT64(p);
12b42c76672a66c2d4ea7212c14f8f1b5a62b78dTom Gundersen *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
b938cb902c3b5bca807a94b277672c64d6767886Jan Engelhardtstatic void append_payload_memfd(struct kdbus_item **d, int memfd, size_t sz) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (*d)->size = offsetof(struct kdbus_item, memfd) + sizeof(struct kdbus_memfd);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (*d)->type = KDBUS_ITEM_PAYLOAD_MEMFD;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic void append_destination(struct kdbus_item **d, const char *s, size_t length) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (*d)->size = offsetof(struct kdbus_item, str) + length + 1;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (*d)->type = KDBUS_ITEM_DST_NAME;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek memcpy((*d)->str, s, length + 1);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic struct kdbus_bloom_filter *append_bloom(struct kdbus_item **d, size_t length) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek i->size = offsetof(struct kdbus_item, bloom_filter) +
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek offsetof(struct kdbus_bloom_filter, data) +
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek *d = (struct kdbus_item *) ((uint8_t*) i + i->size);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic void append_fds(struct kdbus_item **d, const int fds[], unsigned n_fds) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (*d)->size = offsetof(struct kdbus_item, fds) + sizeof(int) * n_fds;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek memcpy((*d)->fds, fds, sizeof(int) * n_fds);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
5256e00e8b9015dd1a976d647fc71dc7efbd8cf8Tom Gundersenstatic int bus_message_setup_bloom(sd_bus_message *m, struct kdbus_bloom_filter *bloom) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek memzero(data, m->bus->bloom_size);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, "message-type", bus_message_type_to_string(m->header->type));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, "interface", m->interface);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, "member", m->member);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, "path", m->path);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, "path-slash-prefix", m->path);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek bloom_add_prefixes(data, m->bus->bloom_size, m->bus->bloom_n_hash, "path-slash-prefix", m->path, '/');
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = sd_bus_message_rewind(m, true);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (i = 0; i < 64; i++) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek char buf[sizeof("arg")-1 + 2 + sizeof("-slash-prefix")];
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = sd_bus_message_peek_type(m, &type, NULL);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (type != SD_BUS_TYPE_STRING &&
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek type != SD_BUS_TYPE_OBJECT_PATH &&
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = sd_bus_message_read_basic(m, type, &t);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek *(e++) = '0' + (char) i;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, buf, t);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek bloom_add_prefixes(data, m->bus->bloom_size, m->bus->bloom_n_hash, buf, t, '.');
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek bloom_add_prefixes(data, m->bus->bloom_size, m->bus->bloom_n_hash, buf, t, '/');
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int bus_message_setup_kmsg(sd_bus *b, sd_bus_message *m) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* We put this together only once, if this message is reused
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * we reuse the earlier-built version */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek destination = m->destination ?: m->destination_ptr;
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering r = bus_kernel_parse_unique_name(destination, &unique);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek sz = offsetof(struct kdbus_msg, items);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek assert_cc(ALIGN8(offsetof(struct kdbus_item, vec) + sizeof(struct kdbus_vec)) ==
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ALIGN8(offsetof(struct kdbus_item, memfd) + sizeof(struct kdbus_memfd)));
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering /* Add in fixed header, fields header and payload */
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering ALIGN8(offsetof(struct kdbus_item, vec) + sizeof(struct kdbus_vec));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Add space for bloom filter */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek sz += ALIGN8(offsetof(struct kdbus_item, bloom_filter) +
d0d6a4cd70477970812bff0a37e70f66208d7c14Tom Gundersen /* Add in well-known destination header */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek sz += ALIGN8(offsetof(struct kdbus_item, str) + dl + 1);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Add space for unix fds */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek sz += ALIGN8(offsetof(struct kdbus_item, fds) + sizeof(int)*m->n_fds);
113bfde15f9393fa8bc22cbd839c0bc64e733ee2Tom Gundersen ((m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) ? 0 : KDBUS_MSG_FLAGS_EXPECT_REPLY) |
113bfde15f9393fa8bc22cbd839c0bc64e733ee2Tom Gundersen ((m->header->flags & BUS_MESSAGE_NO_AUTO_START) ? KDBUS_MSG_FLAGS_NO_AUTO_START : 0);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* verify_destination_id will usually be 0, which makes the kernel driver only look
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * at the provided well-known name. Otherwise, the kernel will make sure the provided
b938cb902c3b5bca807a94b277672c64d6767886Jan Engelhardt * destination id matches the owner of the provided weel-known-name, and fail if they
b938cb902c3b5bca807a94b277672c64d6767886Jan Engelhardt * differ. Currently, this is only needed for bus-proxyd. */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->kdbus->dst_id = m->verify_destination_id;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->kdbus->dst_id = destination ? unique : KDBUS_DST_ID_BROADCAST;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->kdbus->payload_type = KDBUS_PAYLOAD_DBUS;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->kdbus->cookie = (uint64_t) m->header->serial;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->kdbus->priority = m->priority;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) {
dd2b607b7d1ce355e93f9f71cd256ec20b8ae9c4Thomas Hindoe Paaboel Andersen assert_se(clock_gettime(CLOCK_MONOTONIC_COARSE, &now) == 0);
0d4ad91dd4fc831c31a9775b0eadf97fea6cd7f6Alin Rauta m->kdbus->timeout_ns = now.tv_sec * NSEC_PER_SEC + now.tv_nsec +
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek append_destination(&d, destination, dl);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek append_payload_vec(&d, m->header, BUS_MESSAGE_BODY_BEGIN(m));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek MESSAGE_FOREACH_PART(part, i, m) {
3ba3a79df4ae094d1008c04a9af8d1ff970124c4Zbigniew Jędrzejewski-Szmek /* If this is padding then simply send a
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * vector with a NULL data pointer which the
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * kernel will just pass through. This is the
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * most efficient way to encode zeroes */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek append_payload_vec(&d, NULL, part->size);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (part->memfd >= 0 && part->sealed && destination) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Try to send a memfd, if the part is
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * sealed and this is not a broadcast. Since we can only */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek append_payload_memfd(&d, part->memfd, part->size);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Otherwise, let's send a vector to the actual data.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * For that, we need to map it first. */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek append_payload_vec(&d, part->data, part->size);
3ba3a79df4ae094d1008c04a9af8d1ff970124c4Zbigniew Jędrzejewski-Szmek if (m->kdbus->dst_id == KDBUS_DST_ID_BROADCAST) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek struct kdbus_bloom_filter *bloom;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek bloom = append_bloom(&d, m->bus->bloom_size);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = bus_message_setup_bloom(m, bloom);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek append_fds(&d, m->fds, m->n_fds);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->kdbus->size = (uint8_t*) d - (uint8_t*) m->kdbus;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic void unset_memfds(struct sd_bus_message *m) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Make sure the memfds are not freed twice */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek MESSAGE_FOREACH_PART(part, i, m)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
4046d8361c55c80ab8577aea52523b9e6eab0d0cLennart Poettering const char *destination = NULL, *seclabel = NULL;
505c5f6de1a5c0afb238a46db94fe3571902cc9dBenedikt Morbach l = d->size - offsetof(struct kdbus_item, data);
b938cb902c3b5bca807a94b277672c64d6767886Jan Engelhardt h = (struct bus_header *)((uint8_t *)k + d->vec.offset);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (!bus_header_is_complete(h, d->vec.size))
1f0d9695125bf8e66d0e53e37d454755a84899bbLennart Poettering j = l / sizeof(int);
ebf9808112d7ed049f461e3ae8aad82b2d65f901Zbigniew Jędrzejewski-Szmek memcpy(fds + n_fds, d->fds, sizeof(int) * j);
a86cba89bebb4f5fd35841a6251c0baa321dc9a5Susant Sahani /* on kdbus we only speak native endian gvariant, never dbus1
a86cba89bebb4f5fd35841a6251c0baa321dc9a5Susant Sahani * marshalling or reverse endian */
a86cba89bebb4f5fd35841a6251c0baa321dc9a5Susant Sahani r = bus_message_from_header(bus, h, sizeof(struct bus_header), fds, n_fds, NULL, seclabel, 0, &m);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* The well-known names list is different from the other
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek credentials. If we asked for it, but nothing is there, this
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek means that the list of well-known names is simply empty, not
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek that we lack any data */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.mask |= (SD_BUS_CREDS_UNIQUE_NAME|SD_BUS_CREDS_WELL_KNOWN_NAMES) & bus->creds_mask;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek KDBUS_ITEM_FOREACH(d, k, items) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek l = d->size - offsetof(struct kdbus_item, data);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek begin_body = BUS_MESSAGE_BODY_BEGIN(m);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (idx + d->vec.size > begin_body) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Contains body material */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* A -1 offset is NUL padding. */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek part->is_zero = d->vec.offset == ~0ULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek part->data = (uint8_t *)k + d->vec.offset;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek part->data = (uint8_t *)k + d->vec.offset + (begin_body - idx);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek part->size = d->vec.size - (begin_body - idx);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek case KDBUS_ITEM_PAYLOAD_MEMFD: {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (idx < BUS_MESSAGE_BODY_BEGIN(m)) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* The PID starttime/TID might be missing,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * when the data is faked by some data bus
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * proxy and it lacks that information about
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * the real client since SO_PEERCRED is used
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.pid = (pid_t) d->pids.pid;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.mask |= SD_BUS_CREDS_PID & bus->creds_mask;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.pid_starttime = d->pids.starttime / NSEC_PER_USEC;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.mask |= SD_BUS_CREDS_PID_STARTTIME & bus->creds_mask;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.tid = (pid_t) d->pids.tid;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.mask |= SD_BUS_CREDS_TID & bus->creds_mask;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* EUID/SUID/FSUID/EGID/SGID/FSGID might be missing too (see above). */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if ((uid_t) d->creds.uid != (uid_t) -1) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.mask |= SD_BUS_CREDS_UID & bus->creds_mask;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if ((uid_t) d->creds.euid != (uid_t) -1) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.euid = (uid_t) d->creds.euid;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.mask |= SD_BUS_CREDS_EUID & bus->creds_mask;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if ((uid_t) d->creds.suid != (uid_t) -1) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.suid = (uid_t) d->creds.suid;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.mask |= SD_BUS_CREDS_SUID & bus->creds_mask;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if ((uid_t) d->creds.fsuid != (uid_t) -1) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.mask |= SD_BUS_CREDS_FSUID & bus->creds_mask;
a8eaaee72a2f06e0fb64fb71de3b71ecba31dafbJan Engelhardt m->creds.mask |= SD_BUS_CREDS_GID & bus->creds_mask;
0d07e595cc22379ec7388406c2f4f2a74eea9083Jens Kuske m->creds.mask |= SD_BUS_CREDS_EGID & bus->creds_mask;
0d07e595cc22379ec7388406c2f4f2a74eea9083Jens Kuske m->creds.mask |= SD_BUS_CREDS_SGID & bus->creds_mask;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if ((gid_t) d->creds.fsgid != (gid_t) -1) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.fsgid = (gid_t) d->creds.fsgid;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.mask |= SD_BUS_CREDS_FSGID & bus->creds_mask;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (bus->attach_flags & KDBUS_ATTACH_TIMESTAMP) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->realtime = d->timestamp.realtime_ns / NSEC_PER_USEC;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->monotonic = d->timestamp.monotonic_ns / NSEC_PER_USEC;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->seqnum = d->timestamp.seqnum;
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering m->creds.mask |= SD_BUS_CREDS_COMM & bus->creds_mask;
301f4073fe1c2757e602aef24cee9ccf5f81a3a3Michael Marineau m->creds.mask |= SD_BUS_CREDS_TID_COMM & bus->creds_mask;
301f4073fe1c2757e602aef24cee9ccf5f81a3a3Michael Marineau m->creds.mask |= SD_BUS_CREDS_EXE & bus->creds_mask;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.mask |= SD_BUS_CREDS_CMDLINE & bus->creds_mask;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek 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;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.cgroup_root = bus->cgroup_root;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if ((uint32_t) d->audit.sessionid != (uint32_t) -1) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.audit_session_id = (uint32_t) d->audit.sessionid;
1adc5d0bcd17fc8a8cd22fcd03174bfd75306dcdSusant Sahani m->creds.mask |= SD_BUS_CREDS_AUDIT_SESSION_ID & bus->creds_mask;
d59be2cf702dd29d0bb228013cef801f2e9dd22fZbigniew Jędrzejewski-Szmek if ((uid_t) d->audit.loginuid != (uid_t) -1) {
d59be2cf702dd29d0bb228013cef801f2e9dd22fZbigniew Jędrzejewski-Szmek m->creds.audit_login_uid = (uid_t) d->audit.loginuid;
1adc5d0bcd17fc8a8cd22fcd03174bfd75306dcdSusant Sahani m->creds.mask |= SD_BUS_CREDS_AUDIT_LOGIN_UID & bus->creds_mask;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.capability = (uint8_t *) d->caps.caps;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.capability_size = d->size - offsetof(struct kdbus_item, caps.caps);
e88d8021ba34be32ef5ace32e7243da798b0d1c5Zbigniew Jędrzejewski-Szmek 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;
e88d8021ba34be32ef5ace32e7243da798b0d1c5Zbigniew Jędrzejewski-Szmek if (!service_name_is_valid(d->str)) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (!service_name_is_valid(d->name.name)) {
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering if (bus->creds_mask & SD_BUS_CREDS_WELL_KNOWN_NAMES) {
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering r = strv_extend(&m->creds.well_known_names, d->name.name);
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering m->creds.mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek case KDBUS_ITEM_CONN_DESCRIPTION:
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.mask |= SD_BUS_CREDS_DESCRIPTION & bus->creds_mask;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (bus->creds_mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS) {
3e43b2cd97bd82efe6a09e8b9b2e6b5f33f578a0Jan Janssen n = (d->size - offsetof(struct kdbus_item, data64)) / sizeof(uint64_t);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (i = 0; i < n; i++)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.supplementary_gids = u;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.n_supplementary_gids = n;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->creds.mask |= SD_BUS_CREDS_SUPPLEMENTARY_GIDS;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_debug("Got unknown field from kernel %llu", d->type);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = bus_message_parse_fields(m);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Override information from the user header with data from the kernel */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->sender = m->creds.unique_name = (char*) "org.freedesktop.DBus";
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek snprintf(m->sender_buffer, sizeof(m->sender_buffer), ":1.%llu", (unsigned long long) k->src_id);
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering m->sender = m->creds.unique_name = m->sender_buffer;
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering else if (k->dst_id == KDBUS_DST_ID_BROADCAST)
9b3a67c55b7df6642a0389306c513b17c211f280Tom Gundersen m->destination = bus->unique_name; /* fill in unique name if the well-known name is missing */
9b3a67c55b7df6642a0389306c513b17c211f280Tom Gundersen snprintf(m->destination_buffer, sizeof(m->destination_buffer), ":1.%llu", (unsigned long long) k->dst_id);
9b3a67c55b7df6642a0389306c513b17c211f280Tom Gundersen /* We take possession of the kmsg struct now */
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering /* If no name is explicitly set, we'll include a hint
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering * indicating the library implementation, a hint which
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering * kind of bus this is and the thread name */
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering assert_se(prctl(PR_GET_NAME, (unsigned long) pr) >= 0);
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering g = strappend(b->is_system ? "sd-system-" :
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering b->description = bus_label_unescape(name);
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering sz = ALIGN8(offsetof(struct kdbus_cmd_hello, items)) +
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering ALIGN8(offsetof(struct kdbus_item, str) + m + 1);
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering sz += ALIGN8(offsetof(struct kdbus_item, creds) + sizeof(struct kdbus_creds));
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering sz += ALIGN8(offsetof(struct kdbus_item, pids) + sizeof(struct kdbus_pids));
ad9437836f5d94b44d40ee702a0455a637c30322Lennart Poettering sz += ALIGN8(offsetof(struct kdbus_item, str) + l + 1);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek hello->attach_flags_send = _KDBUS_ATTACH_ANY;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek hello->attach_flags_recv = b->attach_flags;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek hello->pool_size = KDBUS_POOL_SIZE;
165c41a99ab6002ef3ba6bd1f9361abf32c077f2Susant Sahani item->size = offsetof(struct kdbus_item, str) + m + 1;
072f9e4af4cf465aca6e263f4dfd6e07786786d2Zbigniew Jędrzejewski-Szmek item->type = KDBUS_ITEM_CONN_DESCRIPTION;
165c41a99ab6002ef3ba6bd1f9361abf32c077f2Susant Sahani item->size = offsetof(struct kdbus_item, creds) + sizeof(struct kdbus_creds);
165c41a99ab6002ef3ba6bd1f9361abf32c077f2Susant Sahani item->size = offsetof(struct kdbus_item, pids) + sizeof(struct kdbus_pids);
165c41a99ab6002ef3ba6bd1f9361abf32c077f2Susant Sahani item->size = offsetof(struct kdbus_item, str) + l + 1;
a8eaaee72a2f06e0fb64fb71de3b71ecba31dafbJan Engelhardt r = ioctl(b->input_fd, KDBUS_CMD_HELLO, hello);
23da66bb402cc6d9bca2eb34e090ccc24dfbf3f5Zbigniew Jędrzejewski-Szmek b->kdbus_buffer = mmap(NULL, KDBUS_POOL_SIZE, PROT_READ, MAP_SHARED, b->input_fd, 0);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* The higher 32bit of the bus_flags fields are considered
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * 'incompatible flags'. Refuse them all for now. */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (hello->bus_flags > 0xFFFFFFFFULL)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (!bloom_validate_parameters((size_t) hello->bloom.size, (unsigned) hello->bloom.n_hash))
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek b->bloom_size = (size_t) hello->bloom.size;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek b->bloom_n_hash = (unsigned) hello->bloom.n_hash;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (asprintf(&b->unique_name, ":1.%llu", (unsigned long long) hello->id) < 0)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek b->can_fds = !!(hello->flags & KDBUS_HELLO_ACCEPT_FD);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek b->message_endian = BUS_NATIVE_ENDIAN;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* the kernel told us the UUID of the underlying bus */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek memcpy(b->server_id.bytes, hello->id128, sizeof(b->server_id.bytes));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekint bus_kernel_connect(sd_bus *b) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek b->input_fd = open(b->kernel, O_RDWR|O_NOCTTY|O_CLOEXEC);
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersenstatic void close_kdbus_msg(sd_bus *bus, struct kdbus_msg *k) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek cmd.offset = (uint8_t *)k - (uint8_t *)bus->kdbus_buffer;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek close_many(d->fds, (d->size - offsetof(struct kdbus_item, fds)) / sizeof(int));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (void) ioctl(bus->input_fd, KDBUS_CMD_FREE, &cmd);
f47c5c47d1a7bcfa1842ff7cc52b1f7fc1d86bcfpomaint bus_kernel_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call) {
6c1695be47b2830c79e128e4d05d760eb862184eLennart Poettering /* If we can't deliver, we want room for the error message */
f47c5c47d1a7bcfa1842ff7cc52b1f7fc1d86bcfpoma if (r < 0)
6c1695be47b2830c79e128e4d05d760eb862184eLennart Poettering /* If this is a synchronous method call, then let's tell the
0a8a0fad010018be0f46d1c2e077ade0eb27c7dbTom Gundersen * kernel, so that it can pass CPU time/scheduling to the
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * destination for the time, if it wants to. If we
0a8a0fad010018be0f46d1c2e077ade0eb27c7dbTom Gundersen * synchronously wait for the result anyway, we won't need CPU
0a8a0fad010018be0f46d1c2e077ade0eb27c7dbTom Gundersen m->kdbus->flags |= KDBUS_MSG_FLAGS_EXPECT_REPLY|KDBUS_MSG_FLAGS_SYNC_REPLY;
0a8a0fad010018be0f46d1c2e077ade0eb27c7dbTom Gundersen r = ioctl(bus->output_fd, KDBUS_CMD_MSG_SEND, m->kdbus);
6c1695be47b2830c79e128e4d05d760eb862184eLennart Poettering _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* ENXIO: unique name not known
0a8a0fad010018be0f46d1c2e077ade0eb27c7dbTom Gundersen * ESRCH: well-known name not known */
6c1695be47b2830c79e128e4d05d760eb862184eLennart Poettering if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL)
0a8a0fad010018be0f46d1c2e077ade0eb27c7dbTom Gundersen sd_bus_error_setf(&error, SD_BUS_ERROR_SERVICE_UNKNOWN, "Destination %s not known", m->destination);
0a8a0fad010018be0f46d1c2e077ade0eb27c7dbTom Gundersen log_debug("Could not deliver message to %s as destination is not known. Ignoring.", m->destination);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek } else if (errno == EADDRNOTAVAIL) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* EADDRNOTAVAIL: activation is possible, but turned off in request flags */
0a8a0fad010018be0f46d1c2e077ade0eb27c7dbTom Gundersen if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek sd_bus_error_setf(&error, SD_BUS_ERROR_SERVICE_UNKNOWN, "Activation of %s not requested", m->destination);
0a8a0fad010018be0f46d1c2e077ade0eb27c7dbTom Gundersen log_debug("Could not deliver message to %s as destination is not activated. Ignoring.", m->destination);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek bus->rqueue[bus->rqueue_size++] = reply;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek k = (struct kdbus_msg *)((uint8_t *)bus->kdbus_buffer + m->kdbus->offset_reply);
log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k->payload_type);
static int push_name_owner_changed(sd_bus *bus, const char *name, const char *old_owner, const char *new_owner) {
bus,
"/org/freedesktop/DBus",
m = NULL;
assert(k);
assert(d);
if (d->type == KDBUS_ITEM_NAME_ADD || (d->name_change.old_id.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR)))
old_owner[0] = 0;
if (d->type == KDBUS_ITEM_NAME_REMOVE || (d->name_change.new_id.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR))) {
new_owner[0] = 0;
assert(k);
assert(d);
return push_name_owner_changed(
assert(k);
assert(d);
bus,
k->cookie_reply,
m = NULL;
assert(k);
if (d->type >= _KDBUS_ITEM_KERNEL_BASE && d->type < _KDBUS_ITEM_KERNEL_BASE + ELEMENTSOF(translate)) {
if (found)
return -EBADMSG;
found = d;
if (!found) {
struct kdbus_msg *k;
if (hint_priority) {
log_debug("%s: kdbus reports %" PRIu64 " dropped broadcast messages, ignoring.", strna(bus->description), (uint64_t) recv.dropped_msgs);
return -errno;
log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k->payload_type);
struct memfd_cache *c;
int fd;
return -ENOTSUP;
*mapped = 0;
*allocated = 0;
return fd;
if (size > 0)
struct memfd_cache *c;
assert(b);
for (i = 0; i < b->n_memfd_cache; i++)
uint64_t f = 0;
f |= KDBUS_NAME_QUEUE;
uint64_t m = 0;
m |= KDBUS_ATTACH_CREDS;
m |= KDBUS_ATTACH_PIDS;
m |= KDBUS_ATTACH_PID_COMM;
m |= KDBUS_ATTACH_TID_COMM;
m |= KDBUS_ATTACH_EXE;
m |= KDBUS_ATTACH_CMDLINE;
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))
m |= KDBUS_ATTACH_CGROUP;
if (mask & (SD_BUS_CREDS_EFFECTIVE_CAPS|SD_BUS_CREDS_PERMITTED_CAPS|SD_BUS_CREDS_INHERITABLE_CAPS|SD_BUS_CREDS_BOUNDING_CAPS))
m |= KDBUS_ATTACH_CAPS;
m |= KDBUS_ATTACH_SECLABEL;
m |= KDBUS_ATTACH_AUDIT;
m |= KDBUS_ATTACH_NAMES;
m |= KDBUS_ATTACH_AUXGROUPS;
struct kdbus_item *n;
int fd;
assert(s);
if (fd < 0)
return -errno;
sizeof(struct kdbus_bloom_parameter);
n = KDBUS_ITEM_NEXT(n);
return -errno;
return -ENOMEM;
return fd;
switch (access) {
case BUS_POLICY_ACCESS_SEE:
return KDBUS_POLICY_SEE;
case BUS_POLICY_ACCESS_TALK:
return KDBUS_POLICY_TALK;
case BUS_POLICY_ACCESS_OWN:
return KDBUS_POLICY_OWN;
case BUSNAME_POLICY_TYPE_USER: {
case BUSNAME_POLICY_TYPE_GROUP: {
int fd;
if (path) {
return -ENOMEM;
*path = p;
if (fd < 0)
return -errno;
return fd;
struct kdbus_item *n;
int fd;
if (fd < 0)
return fd;
return -errno;
if (ep_path) {
return -ENOMEM;
*ep_path = p;
return fd;
struct kdbus_item *n;
Iterator i;
n = KDBUS_ITEM_NEXT(n);
n = KDBUS_ITEM_NEXT(n);
return -errno;
int fd,
const char *name,
bool activating,
bool accept_fd,
struct kdbus_item *n;
policy_cnt++;
if (world_policy >= 0)
policy_cnt++;
policy_cnt * ALIGN8(offsetof(struct kdbus_item, policy_access) + sizeof(struct kdbus_policy_access));
n = KDBUS_ITEM_NEXT(n);
n = KDBUS_ITEM_NEXT(n);
if (world_policy >= 0) {
return -errno;
return -ENOTSUP;
return -ENOTSUP;
return fd;
return -errno;
return -errno;
struct kdbus_item *n;
return -errno;