X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-bus%2Fbus-kernel.c;h=77ad5ca506869ea8db5ea0b965636bed4cc931b9;hb=ca7b42c81652c342288a3e0a10abd885c66ac5b2;hp=78a6c1062a65665a69c6ce83e18764ed6640804c;hpb=5972fe953ec56c77936a1e612ca87d8a0e6c0c64;p=elogind.git diff --git a/src/libsystemd/sd-bus/bus-kernel.c b/src/libsystemd/sd-bus/bus-kernel.c index 78a6c1062..77ad5ca50 100644 --- a/src/libsystemd/sd-bus/bus-kernel.c +++ b/src/libsystemd/sd-bus/bus-kernel.c @@ -260,6 +260,7 @@ static int bus_message_setup_kmsg(sd_bus *b, sd_bus_message *m) { m->destination ? unique : KDBUS_DST_ID_BROADCAST; m->kdbus->payload_type = KDBUS_PAYLOAD_DBUS; m->kdbus->cookie = m->header->serial; + m->kdbus->priority = m->priority; if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) m->kdbus->cookie_reply = m->reply_cookie; @@ -500,9 +501,13 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) { break; case KDBUS_ITEM_TIMESTAMP: - m->realtime = d->timestamp.realtime_ns / NSEC_PER_USEC; - m->monotonic = d->timestamp.monotonic_ns / NSEC_PER_USEC; - m->seqnum = d->timestamp.seqnum; + + if (bus->attach_flags & KDBUS_ATTACH_TIMESTAMP) { + m->realtime = d->timestamp.realtime_ns / NSEC_PER_USEC; + m->monotonic = d->timestamp.monotonic_ns / NSEC_PER_USEC; + m->seqnum = d->timestamp.seqnum; + } + break; case KDBUS_ITEM_PID_COMM: @@ -568,6 +573,11 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) { goto fail; break; + case KDBUS_ITEM_CONN_NAME: + m->creds.conn_name = d->str; + m->creds.mask |= SD_BUS_CREDS_CONNECTION_NAME & bus->creds_mask; + break; + case KDBUS_ITEM_FDS: case KDBUS_ITEM_SECLABEL: break; @@ -1085,21 +1095,40 @@ int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *mapped, size_t *al assert_se(pthread_mutex_lock(&bus->memfd_cache_mutex) >= 0); if (bus->n_memfd_cache <= 0) { - struct kdbus_cmd_memfd_make cmd = { - .size = sizeof(struct kdbus_cmd_memfd_make), - }; + _cleanup_free_ char *g = NULL; + struct kdbus_cmd_memfd_make *cmd; + struct kdbus_item *item; + size_t l, sz; int r; assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0); - r = ioctl(bus->input_fd, KDBUS_CMD_MEMFD_NEW, &cmd); + assert(bus->connection_name); + + g = sd_bus_label_escape(bus->connection_name); + if (!g) + return -ENOMEM; + + l = strlen(g); + sz = ALIGN8(offsetof(struct kdbus_cmd_memfd_make, items)) + + ALIGN8(offsetof(struct kdbus_item, str)) + + l + 1; + cmd = alloca0(sz); + cmd->size = sz; + + item = cmd->items; + item->size = ALIGN8(offsetof(struct kdbus_item, str)) + l + 1; + item->type = KDBUS_ITEM_MEMFD_NAME; + memcpy(item->str, g, l + 1); + + r = ioctl(bus->input_fd, KDBUS_CMD_MEMFD_NEW, cmd); if (r < 0) return -errno; *address = NULL; *mapped = 0; *allocated = 0; - return cmd.fd; + return cmd->fd; } c = &bus->memfd_cache[--bus->n_memfd_cache]; @@ -1221,6 +1250,9 @@ int kdbus_translate_attach_flags(uint64_t mask, uint64_t *kdbus_mask) { if (mask & SD_BUS_CREDS_WELL_KNOWN_NAMES) m |= KDBUS_ATTACH_NAMES; + if (mask & SD_BUS_CREDS_CONNECTION_NAME) + m |= KDBUS_ATTACH_CONN_NAME; + *kdbus_mask = m; return 0; }