chiark / gitweb /
Fix write-only use of a few variables
[elogind.git] / src / libsystemd-bus / bus-error.c
index 0832022ee914508be1919044d276bd2945a230a0..28fe15467fb2e440007cc953ff8c11f0d4471841 100644 (file)
 #include "sd-bus.h"
 #include "bus-error.h"
 
+bool bus_error_is_dirty(sd_bus_error *e) {
+        if (!e)
+                return 0;
+
+        return e->name || e->message || e->need_free;
+}
+
 void sd_bus_error_free(sd_bus_error *e) {
         if (!e)
                 return;
@@ -44,14 +51,41 @@ void sd_bus_error_free(sd_bus_error *e) {
         e->need_free = false;
 }
 
-int sd_bus_error_set(sd_bus_error *e, const char *name, const char *format, ...) {
+int sd_bus_error_set(sd_bus_error *e, const char *name, const char *message) {
+        char *n, *m = NULL;
+
+        if (!e)
+                return 0;
+        if (bus_error_is_dirty(e))
+                return -EINVAL;
+        if (!name)
+                return -EINVAL;
+
+        n = strdup(name);
+        if (!n)
+                return -ENOMEM;
+
+        if (message) {
+                m = strdup(message);
+                if (!m)
+                        return -ENOMEM;
+        }
+
+        e->name = n;
+        e->message = m;
+        e->need_free = true;
+
+        return 0;
+}
+
+int sd_bus_error_setf(sd_bus_error *e, const char *name, const char *format, ...) {
         char *n, *m = NULL;
         va_list ap;
         int r;
 
         if (!e)
                 return 0;
-        if (sd_bus_error_is_set(e))
+        if (bus_error_is_dirty(e))
                 return -EINVAL;
         if (!name)
                 return -EINVAL;
@@ -79,52 +113,47 @@ int sd_bus_error_set(sd_bus_error *e, const char *name, const char *format, ...)
 }
 
 int sd_bus_error_copy(sd_bus_error *dest, const sd_bus_error *e) {
+        char *x, *y = NULL;
+
         if (!dest)
                 return 0;
-        if (sd_bus_error_is_set(dest))
+        if (bus_error_is_dirty(dest))
                 return -EINVAL;
         if (!sd_bus_error_is_set(e))
                 return 0;
 
-        if (e->need_free) {
-                char *x, *y = NULL;
+        x = strdup(e->name);
+        if (!x)
+                return -ENOMEM;
 
-                x = strdup(e->name);
-                if (!x)
+        if (e->message) {
+                y = strdup(e->message);
+                if (!y) {
+                        free(x);
                         return -ENOMEM;
-
-                if (e->message) {
-                        y = strdup(e->message);
-                        if (!y) {
-                                free(x);
-                                return -ENOMEM;
-                        }
                 }
+        }
 
-                dest->name = x;
-                dest->message = y;
-                dest->need_free = true;
-        } else
-                *dest = *e;
-
+        dest->name = x;
+        dest->message = y;
+        dest->need_free = true;
         return 0;
 }
 
 void sd_bus_error_set_const(sd_bus_error *e, const char *name, const char *message) {
         if (!e)
                 return;
-        if (sd_bus_error_is_set(e))
+        if (bus_error_is_dirty(e))
                 return;
 
-        e->name = name;
-        e->message = message;
+        *e = SD_BUS_ERROR_MAKE(name, message);
 }
 
 int sd_bus_error_is_set(const sd_bus_error *e) {
         if (!e)
                 return 0;
 
-        return e->name || e->message || e->need_free;
+        return !!e->name;
 }
 
 int sd_bus_error_has_name(const sd_bus_error *e, const char *name) {
@@ -138,6 +167,9 @@ int bus_error_to_errno(const sd_bus_error* e) {
 
         /* Better replce this with a gperf table */
 
+        if (!e)
+                return -EIO;
+
         if (!e->name)
                 return -EIO;
 
@@ -148,6 +180,30 @@ int bus_error_to_errno(const sd_bus_error* e) {
             streq(e->name, "org.freedesktop.DBus.Error.AccessDenied"))
                 return -EPERM;
 
+        if (streq(e->name, "org.freedesktop.DBus.Error.InvalidArgs"))
+                return -EINVAL;
+
+        if (streq(e->name, "org.freedesktop.DBus.Error.UnixProcessIdUnknown"))
+                return -ESRCH;
+
+        if (streq(e->name, "org.freedesktop.DBus.Error.FileNotFound"))
+                return -ENOENT;
+
+        if (streq(e->name, "org.freedesktop.DBus.Error.FileExists"))
+                return -EEXIST;
+
+        if (streq(e->name, "org.freedesktop.DBus.Error.Timeout"))
+                return -ETIMEDOUT;
+
+        if (streq(e->name, "org.freedesktop.DBus.Error.IOError"))
+                return -EIO;
+
+        if (streq(e->name, "org.freedesktop.DBus.Error.Disconnected"))
+                return -ECONNRESET;
+
+        if (streq(e->name, "org.freedesktop.DBus.Error.NotSupported"))
+                return -ENOTSUP;
+
         return -EIO;
 }
 
@@ -155,12 +211,60 @@ int bus_error_from_errno(sd_bus_error *e, int error) {
         if (!e)
                 return error;
 
-        if (error == -ENOMEM)
-                sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.NoMemory", strerror(-error));
-        else if (error == -EPERM || error == EACCES)
-                sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.AccessDenied", strerror(-error));
-        else
-                sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.Failed", "Operation failed");
+        switch (error) {
+
+        case -ENOMEM:
+                sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.NoMemory", "Out of memory");
+                break;
+
+        case -EPERM:
+        case -EACCES:
+                sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.AccessDenied", "Access denied");
+                break;
+
+        case -EINVAL:
+                sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.InvalidArgs", "Invalid argument");
+                break;
+
+        case -ESRCH:
+                sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.UnixProcessIdUnknown", "No such process");
+                break;
+
+        case -ENOENT:
+                sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.FileNotFound", "File not found");
+                break;
+
+        case -EEXIST:
+                sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.FileExists", "File exists");
+                break;
+
+        case -ETIMEDOUT:
+        case -ETIME:
+                sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.Timeout", "Timed out");
+                break;
 
+        case -EIO:
+                sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.IOError", "Input/output error");
+                break;
+
+        case -ENETRESET:
+        case -ECONNABORTED:
+        case -ECONNRESET:
+                sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.Disconnected", "Disconnected");
+                break;
+
+        case -ENOTSUP:
+                sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.NotSupported", "Not supported");
+                break;
+        }
+
+        sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.Failed", "Operation failed");
         return error;
 }
+
+const char *bus_error_message(const sd_bus_error *e, int error) {
+        if (e && e->message)
+                return e->message;
+
+        return strerror(error);
+}