chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
sd-bus: rename "connection name" to "description" for the sd-bus API too
[elogind.git]
/
src
/
libsystemd
/
sd-bus
/
bus-kernel.c
diff --git
a/src/libsystemd/sd-bus/bus-kernel.c
b/src/libsystemd/sd-bus/bus-kernel.c
index c30491e687d93df414c4b0c5e98d3d1674b30289..11039b8e13bb6b6b433fd3f089944d85241d7870 100644
(file)
--- a/
src/libsystemd/sd-bus/bus-kernel.c
+++ b/
src/libsystemd/sd-bus/bus-kernel.c
@@
-31,6
+31,7
@@
#include "util.h"
#include "strv.h"
#include "util.h"
#include "strv.h"
+#include "memfd-util.h"
#include "bus-internal.h"
#include "bus-message.h"
#include "bus-internal.h"
#include "bus-message.h"
@@
-270,10
+271,15
@@
static int bus_message_setup_kmsg(sd_bus *b, sd_bus_message *m) {
m->kdbus->cookie = (uint64_t) m->header->serial;
m->kdbus->priority = m->priority;
m->kdbus->cookie = (uint64_t) m->header->serial;
m->kdbus->priority = m->priority;
- if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
+ if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
{
m->kdbus->cookie_reply = m->reply_cookie;
m->kdbus->cookie_reply = m->reply_cookie;
- else
- m->kdbus->timeout_ns = m->timeout * NSEC_PER_USEC;
+ } else {
+ struct timespec now;
+
+ assert_se(clock_gettime(CLOCK_MONOTONIC_COARSE, &now) == 0);
+ m->kdbus->timeout_ns = now.tv_sec * NSEC_PER_SEC + now.tv_nsec +
+ m->timeout * NSEC_PER_USEC;
+ }
d = m->kdbus->items;
d = m->kdbus->items;
@@
-332,6
+338,18
@@
fail:
return r;
}
return r;
}
+static void unset_memfds(struct sd_bus_message *m) {
+ struct bus_body_part *part;
+ unsigned i;
+
+ assert(m);
+
+ /* Make sure the memfds are not freed twice */
+ MESSAGE_FOREACH_PART(part, i, m)
+ if (part->memfd >= 0)
+ part->memfd = -1;
+}
+
static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
sd_bus_message *m = NULL;
struct kdbus_item *d;
static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
sd_bus_message *m = NULL;
struct kdbus_item *d;
@@
-558,8
+576,8
@@
static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
break;
case KDBUS_ITEM_CAPS:
break;
case KDBUS_ITEM_CAPS:
- m->creds.capability =
d->data
;
- m->creds.capability_size =
l
;
+ m->creds.capability =
(uint8_t *) d->caps.caps
;
+ m->creds.capability_size =
d->size - offsetof(struct kdbus_item, caps.caps)
;
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;
break;
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;
break;
@@
-570,7
+588,7
@@
static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
destination = d->str;
break;
destination = d->str;
break;
- case KDBUS_ITEM_NAME:
+ case KDBUS_ITEM_
OWNED_
NAME:
if (!service_name_is_valid(d->name.name))
return -EBADMSG;
if (!service_name_is_valid(d->name.name))
return -EBADMSG;
@@
-579,9
+597,9
@@
static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
goto fail;
break;
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;
+ case KDBUS_ITEM_CONN_
DESCRIPTION
:
+ m->creds.
description
= d->str;
+ m->creds.mask |= SD_BUS_CREDS_
DESCRIPTION
& bus->creds_mask;
break;
case KDBUS_ITEM_FDS:
break;
case KDBUS_ITEM_FDS:
@@
-627,17
+645,8
@@
static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
return 1;
fail:
return 1;
fail:
- if (m) {
- struct bus_body_part *part;
- unsigned i;
-
- /* Make sure the memfds are not freed twice */
- MESSAGE_FOREACH_PART(part, i, m)
- if (part->memfd >= 0)
- part->memfd = -1;
-
- sd_bus_message_unref(m);
- }
+ unset_memfds(m);
+ sd_bus_message_unref(m);
return r;
}
return r;
}
@@
-657,8
+666,8
@@
int bus_kernel_take_fd(sd_bus *b) {
b->use_memfd = 1;
b->use_memfd = 1;
- if (b->
connection_name
) {
- g = bus_label_escape(b->
connection_name
);
+ if (b->
description
) {
+ g = bus_label_escape(b->
description
);
if (!g)
return -ENOMEM;
if (!g)
return -ENOMEM;
@@
-691,8
+700,8
@@
int bus_kernel_take_fd(sd_bus *b) {
name = g;
}
name = g;
}
- b->
connection_name
= bus_label_unescape(name);
- if (!b->
connection_name
)
+ b->
description
= bus_label_unescape(name);
+ if (!b->
description
)
return -ENOMEM;
}
return -ENOMEM;
}
@@
-711,14
+720,14
@@
int bus_kernel_take_fd(sd_bus *b) {
hello = alloca0_align(sz, 8);
hello->size = sz;
hello = alloca0_align(sz, 8);
hello->size = sz;
- hello->
conn_
flags = b->hello_flags;
+ hello->flags = b->hello_flags;
hello->attach_flags = b->attach_flags;
hello->pool_size = KDBUS_POOL_SIZE;
item = hello->items;
item->size = offsetof(struct kdbus_item, str) + m + 1;
hello->attach_flags = b->attach_flags;
hello->pool_size = KDBUS_POOL_SIZE;
item = hello->items;
item->size = offsetof(struct kdbus_item, str) + m + 1;
- item->type = KDBUS_ITEM_CONN_
NAME
;
+ item->type = KDBUS_ITEM_CONN_
DESCRIPTION
;
memcpy(item->str, name, m + 1);
item = KDBUS_ITEM_NEXT(item);
memcpy(item->str, name, m + 1);
item = KDBUS_ITEM_NEXT(item);
@@
-748,10
+757,9
@@
int bus_kernel_take_fd(sd_bus *b) {
}
}
}
}
- /* The higher 32bit of
both
flags fields are considered
+ /* The higher 32bit of
the bus_
flags fields are considered
* 'incompatible flags'. Refuse them all for now. */
* 'incompatible flags'. Refuse them all for now. */
- if (hello->bus_flags > 0xFFFFFFFFULL ||
- hello->conn_flags > 0xFFFFFFFFULL)
+ if (hello->bus_flags > 0xFFFFFFFFULL)
return -ENOTSUP;
if (!bloom_validate_parameters((size_t) hello->bloom.size, (unsigned) hello->bloom.n_hash))
return -ENOTSUP;
if (!bloom_validate_parameters((size_t) hello->bloom.size, (unsigned) hello->bloom.n_hash))
@@
-767,7
+775,7
@@
int bus_kernel_take_fd(sd_bus *b) {
b->is_kernel = true;
b->bus_client = true;
b->is_kernel = true;
b->bus_client = true;
- b->can_fds = !!(hello->
conn_
flags & KDBUS_HELLO_ACCEPT_FD);
+ b->can_fds = !!(hello->flags & KDBUS_HELLO_ACCEPT_FD);
b->message_version = 2;
b->message_endian = BUS_NATIVE_ENDIAN;
b->message_version = 2;
b->message_endian = BUS_NATIVE_ENDIAN;
@@
-796,14
+804,14
@@
int bus_kernel_connect(sd_bus *b) {
}
static void close_kdbus_msg(sd_bus *bus, struct kdbus_msg *k) {
}
static void close_kdbus_msg(sd_bus *bus, struct kdbus_msg *k) {
-
uint64_t off _alignas_(8)
;
+
struct kdbus_cmd_free cmd
;
struct kdbus_item *d;
assert(bus);
assert(k);
struct kdbus_item *d;
assert(bus);
assert(k);
-
off = (uint8_t *)k - (uint8_t *)bus->kdbus_buffer
;
-
ioctl(bus->input_fd, KDBUS_CMD_FREE, &off)
;
+
cmd.flags = 0
;
+
cmd.offset = (uint8_t *)k - (uint8_t *)bus->kdbus_buffer
;
KDBUS_ITEM_FOREACH(d, k, items) {
KDBUS_ITEM_FOREACH(d, k, items) {
@@
-812,6
+820,8
@@
static void close_kdbus_msg(sd_bus *bus, struct kdbus_msg *k) {
else if (d->type == KDBUS_ITEM_PAYLOAD_MEMFD)
safe_close(d->memfd.fd);
}
else if (d->type == KDBUS_ITEM_PAYLOAD_MEMFD)
safe_close(d->memfd.fd);
}
+
+ (void) ioctl(bus->input_fd, KDBUS_CMD_FREE, &cmd);
}
int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call) {
}
int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call) {
@@
-950,19
+960,19
@@
static int translate_name_change(sd_bus *bus, struct kdbus_msg *k, struct kdbus_
assert(k);
assert(d);
assert(k);
assert(d);
- if (d->type == KDBUS_ITEM_NAME_ADD || (d->name_change.old.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR)))
+ if (d->type == KDBUS_ITEM_NAME_ADD || (d->name_change.old
_id
.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR)))
old_owner[0] = 0;
else
old_owner[0] = 0;
else
- sprintf(old_owner, ":1.%llu", (unsigned long long) d->name_change.old.id);
+ sprintf(old_owner, ":1.%llu", (unsigned long long) d->name_change.old
_id
.id);
- if (d->type == KDBUS_ITEM_NAME_REMOVE || (d->name_change.new.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR))) {
+ if (d->type == KDBUS_ITEM_NAME_REMOVE || (d->name_change.new
_id
.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR))) {
if (isempty(old_owner))
return 0;
new_owner[0] = 0;
} else
if (isempty(old_owner))
return 0;
new_owner[0] = 0;
} else
- sprintf(new_owner, ":1.%llu", (unsigned long long) d->name_change.new.id);
+ sprintf(new_owner, ":1.%llu", (unsigned long long) d->name_change.new
_id
.id);
return push_name_owner_changed(bus, d->name_change.name, old_owner, new_owner);
}
return push_name_owner_changed(bus, d->name_change.name, old_owner, new_owner);
}
@@
-1109,20
+1119,13
@@
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) {
assert_se(pthread_mutex_lock(&bus->memfd_cache_mutex) >= 0);
if (bus->n_memfd_cache <= 0) {
- _cleanup_free_ char *g = NULL;
int r;
assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
int r;
assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
- assert(bus->connection_name);
-
- g = bus_label_escape(bus->connection_name);
- if (!g)
- return -ENOMEM;
-
- r = memfd_create(g, MFD_ALLOW_SEALING);
+ r = memfd_new(bus->description);
if (r < 0)
if (r < 0)
- return
-errno
;
+ return
r
;
*address = NULL;
*mapped = 0;
*address = NULL;
*mapped = 0;
@@
-1179,7
+1182,7
@@
void bus_kernel_push_memfd(sd_bus *bus, int fd, void *address, size_t mapped, si
/* If overly long, let's return a bit to the OS */
if (mapped > max_mapped) {
/* If overly long, let's return a bit to the OS */
if (mapped > max_mapped) {
- assert_se(
ftruncat
e(fd, max_mapped) >= 0);
+ assert_se(
memfd_set_siz
e(fd, max_mapped) >= 0);
assert_se(munmap((uint8_t*) address + max_mapped, PAGE_ALIGN(mapped - max_mapped)) >= 0);
c->mapped = c->allocated = max_mapped;
} else {
assert_se(munmap((uint8_t*) address + max_mapped, PAGE_ALIGN(mapped - max_mapped)) >= 0);
c->mapped = c->allocated = max_mapped;
} else {
@@
-1225,8
+1228,11
@@
int kdbus_translate_attach_flags(uint64_t mask, uint64_t *kdbus_mask) {
if (mask & (SD_BUS_CREDS_UID|SD_BUS_CREDS_GID|SD_BUS_CREDS_PID|SD_BUS_CREDS_PID_STARTTIME|SD_BUS_CREDS_TID))
m |= KDBUS_ATTACH_CREDS;
if (mask & (SD_BUS_CREDS_UID|SD_BUS_CREDS_GID|SD_BUS_CREDS_PID|SD_BUS_CREDS_PID_STARTTIME|SD_BUS_CREDS_TID))
m |= KDBUS_ATTACH_CREDS;
- if (mask & (SD_BUS_CREDS_COMM|SD_BUS_CREDS_TID_COMM))
- m |= KDBUS_ATTACH_COMM;
+ if (mask & SD_BUS_CREDS_COMM)
+ m |= KDBUS_ATTACH_PID_COMM;
+
+ if (mask & SD_BUS_CREDS_TID_COMM)
+ m |= KDBUS_ATTACH_TID_COMM;
if (mask & SD_BUS_CREDS_EXE)
m |= KDBUS_ATTACH_EXE;
if (mask & SD_BUS_CREDS_EXE)
m |= KDBUS_ATTACH_EXE;
@@
-1249,8
+1255,8
@@
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_WELL_KNOWN_NAMES)
m |= KDBUS_ATTACH_NAMES;
- if (mask & SD_BUS_CREDS_
CONNECTION_NAME
)
- m |= KDBUS_ATTACH_CONN_
NAME
;
+ if (mask & SD_BUS_CREDS_
DESCRIPTION
)
+ m |= KDBUS_ATTACH_CONN_
DESCRIPTION
;
*kdbus_mask = m;
return 0;
*kdbus_mask = m;
return 0;
@@
-1302,13
+1308,6
@@
int bus_kernel_create_bus(const char *name, bool world, char **s) {
return -errno;
}
return -errno;
}
- /* The higher 32bit of the flags field are considered
- * 'incompatible flags'. Refuse them all for now. */
- if (make->flags > 0xFFFFFFFFULL) {
- safe_close(fd);
- return -ENOTSUP;
- }
-
if (s) {
char *p;
if (s) {
char *p;
@@
-1411,7
+1410,7
@@
int bus_kernel_open_bus_fd(const char *bus, char **path) {
}
int bus_kernel_create_endpoint(const char *bus_name, const char *ep_name, char **ep_path) {
}
int bus_kernel_create_endpoint(const char *bus_name, const char *ep_name, char **ep_path) {
- _cleanup_free_ char *path;
+ _cleanup_free_ char *path
= NULL
;
struct kdbus_cmd_make *make;
struct kdbus_item *n;
size_t size;
struct kdbus_cmd_make *make;
struct kdbus_item *n;
size_t size;
@@
-1434,24
+1433,21
@@
int bus_kernel_create_endpoint(const char *bus_name, const char *ep_name, char *
n->size = offsetof(struct kdbus_item, str) + strlen(ep_name) + 1;
strcpy(n->str, ep_name);
n->size = offsetof(struct kdbus_item, str) + strlen(ep_name) + 1;
strcpy(n->str, ep_name);
- if (ioctl(fd, KDBUS_CMD_E
P
_MAKE, make) < 0) {
+ if (ioctl(fd, KDBUS_CMD_E
NDPOINT
_MAKE, make) < 0) {
safe_close(fd);
return -errno;
}
safe_close(fd);
return -errno;
}
- /* The higher 32bit of the flags field are considered
- * 'incompatible flags'. Refuse them all for now. */
- if (make->flags > 0xFFFFFFFFULL) {
- safe_close(fd);
- return -ENOTSUP;
- }
-
if (ep_path) {
if (ep_path) {
- int r = asprintf(ep_path, "%s/%s", dirname(path), ep_name);
- if (r == -1 || !*ep_path) {
+ char *p;
+
+ p = strjoin(dirname(path), "/", ep_name, NULL);
+ if (!p) {
safe_close(fd);
return -ENOMEM;
}
safe_close(fd);
return -ENOMEM;
}
+
+ *ep_path = p;
}
return fd;
}
return fd;
@@
-1494,7
+1490,7
@@
int bus_kernel_set_endpoint_policy(int fd, uid_t uid, BusEndpoint *ep) {
n = KDBUS_ITEM_NEXT(n);
}
n = KDBUS_ITEM_NEXT(n);
}
- r = ioctl(fd, KDBUS_CMD_E
P
_UPDATE, update);
+ r = ioctl(fd, KDBUS_CMD_E
NDPOINT
_UPDATE, update);
if (r < 0)
return -errno;
if (r < 0)
return -errno;
@@
-1556,7
+1552,7
@@
int bus_kernel_make_starter(
}
hello->size = size;
}
hello->size = size;
- hello->
conn_
flags =
+ hello->flags =
(activating ? KDBUS_HELLO_ACTIVATOR : KDBUS_HELLO_POLICY_HOLDER) |
(accept_fd ? KDBUS_HELLO_ACCEPT_FD : 0);
hello->pool_size = KDBUS_POOL_SIZE;
(activating ? KDBUS_HELLO_ACTIVATOR : KDBUS_HELLO_POLICY_HOLDER) |
(accept_fd ? KDBUS_HELLO_ACCEPT_FD : 0);
hello->pool_size = KDBUS_POOL_SIZE;
@@
-1565,10
+1561,9
@@
int bus_kernel_make_starter(
if (ioctl(fd, KDBUS_CMD_HELLO, hello) < 0)
return -errno;
if (ioctl(fd, KDBUS_CMD_HELLO, hello) < 0)
return -errno;
- /* The higher 32bit of
both
flags fields are considered
+ /* The higher 32bit of
the bus_
flags fields are considered
* 'incompatible flags'. Refuse them all for now. */
* 'incompatible flags'. Refuse them all for now. */
- if (hello->bus_flags > 0xFFFFFFFFULL ||
- hello->conn_flags > 0xFFFFFFFFULL)
+ if (hello->bus_flags > 0xFFFFFFFFULL)
return -ENOTSUP;
if (!bloom_validate_parameters((size_t) hello->bloom.size, (unsigned) hello->bloom.n_hash))
return -ENOTSUP;
if (!bloom_validate_parameters((size_t) hello->bloom.size, (unsigned) hello->bloom.n_hash))