X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-bus%2Fbus-kernel.c;h=68d0f48bd0047c423df0c9d97a48c4cf85f42aa1;hb=3df7a7e610eece1362d0ab148f3d92b2c98277a1;hp=0f38b660a5368ba802c35b92cf5940abf8dca635;hpb=f7e2bd5a8070ba86cba6bcbf7d1c9a8173d846d4;p=elogind.git diff --git a/src/libsystemd-bus/bus-kernel.c b/src/libsystemd-bus/bus-kernel.c index 0f38b660a..68d0f48bd 100644 --- a/src/libsystemd-bus/bus-kernel.c +++ b/src/libsystemd-bus/bus-kernel.c @@ -321,7 +321,9 @@ int bus_kernel_take_fd(sd_bus *b) { int r; assert(b); - assert_return(!b->is_server, -EINVAL); + + if (b->is_server) + return -EINVAL; b->use_memfd = 1; @@ -361,6 +363,7 @@ int bus_kernel_take_fd(sd_bus *b) { b->bus_client = true; b->can_fds = !!(hello.conn_flags & KDBUS_HELLO_ACCEPT_FD); b->message_version = 2; + b->message_endian = BUS_NATIVE_ENDIAN; /* the kernel told us the UUID of the underlying bus */ memcpy(b->server_id.bytes, hello.id128, sizeof(b->server_id.bytes)); @@ -373,7 +376,9 @@ int bus_kernel_connect(sd_bus *b) { assert(b->input_fd < 0); assert(b->output_fd < 0); assert(b->kernel); - assert_return(!b->is_server, -EINVAL); + + if (b->is_server) + return -EINVAL; b->input_fd = open(b->kernel, O_RDWR|O_NOCTTY|O_CLOEXEC); if (b->input_fd < 0) @@ -414,8 +419,10 @@ int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m) { if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) sd_bus_error_setf(&error, SD_BUS_ERROR_SERVICE_UNKNOWN, "Destination %s not known", m->destination); - else + else { + log_debug("Could not deliver message to %s as destination is not known. Ignoring.", m->destination); return 0; + } } else if (errno == EADDRNOTAVAIL) { @@ -423,8 +430,10 @@ int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m) { if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) sd_bus_error_setf(&error, SD_BUS_ERROR_SERVICE_UNKNOWN, "Activation of %s not requested", m->destination); - else + else { + log_debug("Could not deliver message to %s as destination is not activated. Ignoring.", m->destination); return 0; + } } else return -errno; @@ -506,17 +515,18 @@ static int translate_name_change(sd_bus *bus, struct kdbus_msg *k, struct kdbus_ assert(k); assert(d); - if (d->name_change.flags != 0) - return 0; - - if (d->type == KDBUS_ITEM_NAME_ADD) + if (d->type == KDBUS_ITEM_NAME_ADD || (d->name_change.old_flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_STARTER))) old_owner[0] = 0; else sprintf(old_owner, ":1.%llu", (unsigned long long) d->name_change.old_id); - if (d->type == KDBUS_ITEM_NAME_REMOVE) + if (d->type == KDBUS_ITEM_NAME_REMOVE || (d->name_change.new_flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_STARTER))) { + + if (isempty(old_owner)) + return 0; + new_owner[0] = 0; - else + } else sprintf(new_owner, ":1.%llu", (unsigned long long) d->name_change.new_id); return push_name_owner_changed(bus, d->name_change.name, old_owner, new_owner); @@ -893,7 +903,7 @@ int bus_kernel_read_message(sd_bus *bus) { /* Anybody can send us invalid messages, let's just drop them. */ if (r == -EBADMSG || r == -EPROTOTYPE) { - log_error("Ignoring invalid message: %s", strerror(-r)); + log_debug("Ignoring invalid message: %s", strerror(-r)); r = 0; } @@ -914,7 +924,9 @@ int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *size) { assert(address); assert(size); - assert_return(bus && bus->is_kernel, -ENOTSUP); + + if (!bus || !bus->is_kernel) + return -ENOTSUP; assert_se(pthread_mutex_lock(&bus->memfd_cache_mutex) >= 0); @@ -1009,7 +1021,7 @@ int kdbus_translate_request_name_flags(uint64_t flags, uint64_t *kdbus_flags) { if (flags & SD_BUS_NAME_REPLACE_EXISTING) f |= KDBUS_NAME_REPLACE_EXISTING; - if (!(flags & SD_BUS_NAME_DO_NOT_QUEUE)) + if (flags & SD_BUS_NAME_QUEUE) f |= KDBUS_NAME_QUEUE; *kdbus_flags = f; @@ -1205,3 +1217,19 @@ int bus_kernel_create_namespace(const char *name, char **s) { return fd; } + +int bus_kernel_monitor(sd_bus *bus) { + struct kdbus_cmd_monitor cmd_monitor; + int r; + + assert(bus); + + cmd_monitor.id = 0; + cmd_monitor.flags = KDBUS_MONITOR_ENABLE; + + r = ioctl(bus->input_fd, KDBUS_CMD_MONITOR, &cmd_monitor); + if (r < 0) + return -errno; + + return 1; +}