chiark / gitweb /
bus: properly return an error code when release_name fails abnormally
[elogind.git] / src / bus-driverd / bus-driverd.c
index bf448cd9ebcc11bb978dd0677cb9f41d678394af..ccb1fb3710136951f9fc3bf4d3efa156026cc1a2 100644 (file)
@@ -185,7 +185,6 @@ static int driver_get_id(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_
 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;
 
@@ -334,8 +333,7 @@ static int driver_request_name(sd_bus *bus, sd_bus_message *m, void *userdata, s
 
         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);
@@ -349,10 +347,19 @@ static int driver_request_name(sd_bus *bus, sd_bus_message *m, void *userdata, s
         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) {