chiark / gitweb /
bus: parse uid/gid/pid/tid meta data from kdbus messages
[elogind.git] / src / libsystemd-bus / bus-error.c
index 015fae70adebb8212582463ad3a0bdb5d03ce540..5faa17384eefe875d76d1e8b8a586ec3ab0566fe 100644 (file)
@@ -86,6 +86,8 @@ 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 (bus_error_is_dirty(dest))
@@ -93,27 +95,21 @@ int sd_bus_error_copy(sd_bus_error *dest, const sd_bus_error *e) {
         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;
 }
 
@@ -165,10 +161,17 @@ int bus_error_from_errno(sd_bus_error *e, int error) {
 
         if (error == -ENOMEM)
                 sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.NoMemory", strerror(-error));
-        else if (error == -EPERM || error == EACCES)
+        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");
 
         return error;
 }
+
+const char *bus_error_message(const sd_bus_error *e, int error) {
+        if (e && e->message)
+                return e->message;
+
+        return strerror(error);
+}