sd-bus: when we get ENOTTY on the HELLO ioctl assume incompatible API version
authorLennart Poettering <lennart@poettering.net>
Wed, 29 Apr 2015 23:24:48 +0000 (01:24 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 29 Apr 2015 23:24:48 +0000 (01:24 +0200)
As perparation for future incompatible kdbus kernel API changes.

src/core/bus-policy.c
src/libsystemd/sd-bus/bus-kernel.c

index 064eee1..a6a8fcd 100644 (file)
@@ -150,8 +150,11 @@ int bus_kernel_make_starter(
         hello->attach_flags_send = _KDBUS_ATTACH_ANY;
         hello->attach_flags_recv = _KDBUS_ATTACH_ANY;
 
-        if (ioctl(fd, KDBUS_CMD_HELLO, hello) < 0)
+        if (ioctl(fd, KDBUS_CMD_HELLO, hello) < 0) {
+                if (errno == ENOTTY) /* Major API change */
+                        return -ESOCKTNOSUPPORT;
                 return -errno;
+        }
 
         /* not interested in any output values */
         cmd_free.offset = hello->offset;
@@ -160,7 +163,7 @@ int bus_kernel_make_starter(
         /* The higher 32bit of the bus_flags fields are considered
          * 'incompatible flags'. Refuse them all for now. */
         if (hello->bus_flags > 0xFFFFFFFFULL)
-                return -EOPNOTSUPP;
+                return -ESOCKTNOSUPPORT;
 
         return fd;
 }
index 556b5eb..8e3b643 100644 (file)
@@ -962,8 +962,16 @@ int bus_kernel_take_fd(sd_bus *b) {
         }
 
         r = ioctl(b->input_fd, KDBUS_CMD_HELLO, hello);
-        if (r < 0)
+        if (r < 0) {
+                if (errno == ENOTTY)
+                        /* If the ioctl is not supported we assume that the
+                         * API version changed in a major incompatible way,
+                         * let's indicate an API incompatibility in this
+                         * case. */
+                        return -ESOCKTNOSUPPORT;
+
                 return -errno;
+        }
 
         if (!b->kdbus_buffer) {
                 b->kdbus_buffer = mmap(NULL, KDBUS_POOL_SIZE, PROT_READ, MAP_SHARED, b->input_fd, 0);
@@ -977,7 +985,7 @@ int bus_kernel_take_fd(sd_bus *b) {
         /* The higher 32bit of the bus_flags fields are considered
          * 'incompatible flags'. Refuse them all for now. */
         if (hello->bus_flags > 0xFFFFFFFFULL) {
-                r = -EOPNOTSUPP;
+                r = -ESOCKTNOSUPPORT;
                 goto fail;
         }
 
@@ -1611,6 +1619,11 @@ int bus_kernel_create_bus(const char *name, bool world, char **s) {
 
         if (ioctl(fd, KDBUS_CMD_BUS_MAKE, make) < 0) {
                 safe_close(fd);
+
+                /* Major API change? then the ioctls got shuffled around. */
+                if (errno == ENOTTY)
+                        return -ESOCKTNOSUPPORT;
+
                 return -errno;
         }