chiark / gitweb /
bus: convert a bus error with NULL name into an errno of 0 in sd_bus_error_get_errno()
[elogind.git] / src / libsystemd-bus / bus-error.c
index 2d1e80dc0609e952687d5d9e55bf6a059acdca89..c2e41fb01676de2e7e79c7b4b9276af042a0e4f5 100644 (file)
@@ -38,6 +38,7 @@
 static int bus_error_name_to_errno(const char *name) {
         const char *p;
         int r;
+        const name_error_mapping *m;
 
         if (!name)
                 return EINVAL;
@@ -51,81 +52,9 @@ static int bus_error_name_to_errno(const char *name) {
                 return r;
         }
 
-        /* Better replace this with a gperf table */
-
-        if (streq(name, SD_BUS_ERROR_NO_MEMORY))
-                return ENOMEM;
-
-        if (streq(name, SD_BUS_ERROR_SERVICE_UNKNOWN))
-                return EHOSTUNREACH;
-
-        if (streq(name, SD_BUS_ERROR_NAME_HAS_NO_OWNER))
-                return ENXIO;
-
-        if (streq(name, SD_BUS_ERROR_NO_REPLY) ||
-            streq(name, SD_BUS_ERROR_TIMEOUT) ||
-            streq(name, "org.freedesktop.DBus.Error.TimedOut"))
-                return ETIMEDOUT;
-
-        if (streq(name, SD_BUS_ERROR_IO_ERROR))
-                return EIO;
-
-        if (streq(name, SD_BUS_ERROR_BAD_ADDRESS))
-                return EADDRNOTAVAIL;
-
-        if (streq(name, SD_BUS_ERROR_NOT_SUPPORTED))
-                return ENOTSUP;
-
-        if (streq(name, SD_BUS_ERROR_LIMITS_EXCEEDED))
-                return ENOBUFS;
-
-        if (streq(name, SD_BUS_ERROR_ACCESS_DENIED) ||
-            streq(name, SD_BUS_ERROR_AUTH_FAILED))
-                return EACCES;
-
-        if (streq(name, SD_BUS_ERROR_NO_SERVER))
-                return EHOSTDOWN;
-
-        if (streq(name, SD_BUS_ERROR_NO_NETWORK))
-                return ENONET;
-
-        if (streq(name, SD_BUS_ERROR_ADDRESS_IN_USE))
-                return EADDRINUSE;
-
-        if (streq(name, SD_BUS_ERROR_DISCONNECTED))
-                return ECONNRESET;
-
-        if (streq(name, SD_BUS_ERROR_INVALID_ARGS) ||
-            streq(name, SD_BUS_ERROR_INVALID_SIGNATURE) ||
-            streq(name, "org.freedesktop.DBus.Error.MatchRuleInvalid") ||
-            streq(name, "org.freedesktop.DBus.Error.InvalidFileContent"))
-                return EINVAL;
-
-        if (streq(name, SD_BUS_ERROR_FILE_NOT_FOUND) ||
-            streq(name, "org.freedesktop.DBus.Error.MatchRuleNotFound"))
-                return ENOENT;
-
-        if (streq(name, SD_BUS_ERROR_FILE_EXISTS))
-                return EEXIST;
-
-        if (streq(name, SD_BUS_ERROR_UNKNOWN_METHOD) ||
-            streq(name, SD_BUS_ERROR_UNKNOWN_OBJECT) ||
-            streq(name, SD_BUS_ERROR_UNKNOWN_INTERFACE) ||
-            streq(name, SD_BUS_ERROR_UNKNOWN_PROPERTY))
-                return EBADR;
-
-        if (streq(name, SD_BUS_ERROR_PROPERTY_READ_ONLY))
-                return EROFS;
-
-        if (streq(name, SD_BUS_ERROR_UNIX_PROCESS_ID_UNKNOWN) ||
-            streq(name, "org.freedesktop.DBus.Error.SELinuxSecurityContextUnknown"))
-                return ESRCH;
-
-        if (streq(name, SD_BUS_ERROR_INCONSISTENT_MESSAGE))
-                return EBADMSG;
-
-        if (streq(name, "org.freedesktop.DBus.Error.ObjectPathInUse"))
-                return EBUSY;
+        m = bus_error_mapping_lookup(name, strlen(name));
+        if (m)
+                return m->code;
 
         return EIO;
 }
@@ -250,7 +179,6 @@ finish:
         return -bus_error_name_to_errno(name);
 }
 
-_printf_(3,0)
 int bus_error_setfv(sd_bus_error *e, const char *name, const char *format, va_list ap) {
 
         if (!name)
@@ -357,6 +285,9 @@ _public_ int sd_bus_error_get_errno(const sd_bus_error* e) {
         if (!e)
                 return 0;
 
+        if (!e->name)
+                return 0;
+
         return bus_error_name_to_errno(e->name);
 }
 
@@ -464,7 +395,6 @@ _public_ int sd_bus_error_set_errno(sd_bus_error *e, int error) {
         return -error;
 }
 
-_printf_(3,0)
 int bus_error_set_errnofv(sd_bus_error *e, int error, const char *format, va_list ap) {
         int r;