return fd;
}
-static void bus_kernel_translate_policy(const BusNamePolicy *policy, struct kdbus_item *item)
-{
+static void bus_kernel_translate_policy(const BusNamePolicy *policy, struct kdbus_item *item) {
+
+ assert(policy);
+ assert(item);
+
switch (policy->type) {
+
case BUSNAME_POLICY_TYPE_USER:
item->policy_access.type = KDBUS_POLICY_ACCESS_USER;
item->policy_access.id = policy->uid;
}
switch (policy->access) {
+
case BUSNAME_POLICY_ACCESS_SEE:
item->policy_access.access = KDBUS_POLICY_SEE;
break;
}
}
-int bus_kernel_create_starter(const char *bus, const char *name, BusNamePolicy *policy) {
+int bus_kernel_create_starter(const char *bus, const char *name, bool activating, bool accept_fd, BusNamePolicy *policy) {
struct kdbus_cmd_hello *hello;
struct kdbus_item *n;
size_t policy_cnt = 0;
}
hello->size = size;
- hello->conn_flags = KDBUS_HELLO_ACTIVATOR|KDBUS_HELLO_ACCEPT_FD;
+ hello->conn_flags =
+ (activating ? KDBUS_HELLO_ACTIVATOR : KDBUS_HELLO_POLICY_HOLDER) |
+ (accept_fd ? KDBUS_HELLO_ACCEPT_FD : 0);
hello->pool_size = KDBUS_POOL_SIZE;
+ hello->attach_flags = _KDBUS_ATTACH_ALL;
if (ioctl(fd, KDBUS_CMD_HELLO, hello) < 0) {
safe_close(fd);