static int driver_get_name_owner(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) {
_cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
- _cleanup_free_ char *owner = NULL;
char *arg0;
int r;
size = sizeof(*cmd_name) + strlen(name) + 1;
- cmd_name = alloca(size);
- memset(cmd_name, 0, size);
+ cmd_name = alloca0(size);
strcpy(cmd_name->name, name);
cmd_name->size = size;
kdbus_translate_request_name_flags(flags, (uint64_t *) &cmd_name->conn_flags);
cmd_name->id = id;
r = ioctl(sd_bus_get_fd(bus), KDBUS_CMD_NAME_ACQUIRE, cmd_name);
- if (r < 0)
- return r;
+ if (r < 0) {
+ if (errno == EEXIST)
+ return sd_bus_reply_method_return(m, "u", BUS_NAME_EXISTS);
+ else if (errno == EALREADY)
+ return sd_bus_reply_method_return(m, "u", BUS_NAME_ALREADY_OWNER);
+
+ return -errno;
+ }
+
+ if (cmd_name->flags & KDBUS_NAME_IN_QUEUE)
+ return sd_bus_reply_method_return(m, "u", BUS_NAME_IN_QUEUE);
- return sd_bus_reply_method_return(m, "u", 0);
+ return sd_bus_reply_method_return(m, "u", BUS_NAME_PRIMARY_OWNER);
}
static int driver_start_service_by_name(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) {