assert(p);
assert(sz > 0);
+ *d = ALIGN8_PTR(*d);
+
(*d)->size = offsetof(struct kdbus_msg_data, vec) + sizeof(struct kdbus_vec);
(*d)->type = KDBUS_MSG_PAYLOAD_VEC;
(*d)->vec.address = (uint64_t) p;
(*d)->vec.size = sz;
- *d = (struct kdbus_msg_data*) ((uint8_t*) *d + ALIGN8((*d)->size));
+ *d = (struct kdbus_msg_data*) ((uint8_t*) *d + (*d)->size);
}
static void append_destination(struct kdbus_msg_data **d, const char *s, size_t length) {
assert(d);
- assert(d);
+ assert(s);
- (*d)->size = offsetof(struct kdbus_msg_data, data) + length + 1;
+ *d = ALIGN8_PTR(*d);
+
+ (*d)->size = offsetof(struct kdbus_msg_data, str) + length + 1;
(*d)->type = KDBUS_MSG_DST_NAME;
- memcpy((*d)->data, s, length + 1);
+ memcpy((*d)->str, s, length + 1);
+
+ *d = (struct kdbus_msg_data*) ((uint8_t*) *d + (*d)->size);
+}
+
+static void append_bloom(struct kdbus_msg_data **d, const void *p, size_t length) {
+ assert(d);
+ assert(p);
+
+ *d = ALIGN8_PTR(*d);
+
+ (*d)->size = offsetof(struct kdbus_msg_data, data) + length;
+ (*d)->type = KDBUS_MSG_BLOOM;
+ memcpy((*d)->data, p, length);
- *d = (struct kdbus_msg_data*) ((uint8_t*) *d + ALIGN8((*d)->size));
+ *d = (struct kdbus_msg_data*) ((uint8_t*) *d + (*d)->size);
}
static int bus_message_setup_kmsg(sd_bus_message *m) {
/* Add in fixed header, fields header, fields header padding and payload */
sz += 4 * ALIGN8(offsetof(struct kdbus_msg_data, vec) + sizeof(struct kdbus_vec));
+ sz += ALIGN8(offsetof(struct kdbus_msg_data, data) + 5);
+
/* Add in well-known destination header */
if (well_known) {
dl = strlen(m->destination);
if (!m->kdbus)
return -ENOMEM;
+ memset(m->kdbus, 0, sz);
+
m->kdbus->flags =
((m->header->flags & SD_BUS_MESSAGE_NO_REPLY_EXPECTED) ? 0 : KDBUS_MSG_FLAGS_EXPECT_REPLY) |
((m->header->flags & SD_BUS_MESSAGE_NO_AUTO_START) ? KDBUS_MSG_FLAGS_NO_AUTO_START : 0);
m->kdbus->dst_id =
well_known ? 0 :
- m->destination ? unique : (uint64_t) -1;
+ m->destination ? unique : KDBUS_DST_ID_BROADCAST;
m->kdbus->payload_type = KDBUS_PAYLOAD_DBUS1;
m->kdbus->cookie = m->header->serial;
if (m->body)
append_payload_vec(&d, m->body, m->header->body_size);
+ if (m->kdbus->dst_id == KDBUS_DST_ID_BROADCAST)
+ append_bloom(&d, "bloom", 5);
+
m->kdbus->size = (uint8_t*) d - (uint8_t*) m->kdbus;
assert(m->kdbus->size <= sz);
if (r < 0)
return errno == EAGAIN ? 0 : -errno;
- return 0;
+ return 1;
}
static void close_kdbus_msg(struct kdbus_msg *k) {
size_t total, n_bytes = 0, idx = 0;
struct kdbus_creds *creds = NULL;
uint64_t nsec = 0;
+ const char *destination = NULL;
int r;
assert(bus);
creds = &d->creds;
else if (d->type == KDBUS_MSG_TIMESTAMP)
nsec = d->ts_ns;
+ else if (d->type == KDBUS_MSG_DST_NAME)
+ destination = d->str;
}
if (!h)
return r;
}
+ if (k->src_id == KDBUS_SRC_ID_KERNEL)
+ m->sender = "org.freedesktop.DBus";
+ else {
+ snprintf(m->sender_buffer, sizeof(m->sender_buffer), ":1.%llu", (unsigned long long) k->src_id);
+ m->sender = m->sender_buffer;
+ }
+
+ if (!m->destination) {
+ if (destination)
+ m->destination = destination;
+ else if (k->dst_id != KDBUS_DST_ID_WELL_KNOWN_NAME &&
+ k->dst_id != KDBUS_DST_ID_BROADCAST) {
+ snprintf(m->destination_buffer, sizeof(m->destination_buffer), ":1.%llu", (unsigned long long) k->dst_id);
+ m->destination = m->destination_buffer;
+ }
+ }
+
/* We take possession of the kmsg struct now */
m->kdbus = k;
m->free_kdbus = true;
else
close_kdbus_msg(k);
- return r;
+ return r < 0 ? r : 1;
}
int bus_kernel_create(const char *name, char **s) {
fname = alloca(offsetof(struct kdbus_cmd_fname, name) + DECIMAL_STR_MAX(uid_t) + 1 + l + 1);
sprintf(fname->name, "%lu-%s", (unsigned long) getuid(), name);
fname->size = offsetof(struct kdbus_cmd_fname, name) + strlen(fname->name) + 1;
- fname->kernel_flags = KDBUS_CMD_FNAME_ACCESS_WORLD | KDBUS_CMD_FNAME_POLICY_NONE;
+ fname->kernel_flags = KDBUS_CMD_FNAME_ACCESS_WORLD | KDBUS_CMD_FNAME_POLICY_OPEN;
fname->user_flags = 0;
p = strjoin("/dev/kdbus/", fname->name, "/bus", NULL);