X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-bus%2Fbus-error.c;h=5faa17384eefe875d76d1e8b8a586ec3ab0566fe;hb=b9bf7e2be93fe25e0e96e06ad436d43a1e589ed5;hp=0832022ee914508be1919044d276bd2945a230a0;hpb=de1c301ed165eb4d04a0c9d4babe97912b5233bb;p=elogind.git diff --git a/src/libsystemd-bus/bus-error.c b/src/libsystemd-bus/bus-error.c index 0832022ee..5faa17384 100644 --- a/src/libsystemd-bus/bus-error.c +++ b/src/libsystemd-bus/bus-error.c @@ -31,6 +31,13 @@ #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; @@ -51,7 +58,7 @@ int sd_bus_error_set(sd_bus_error *e, const char *name, const char *format, ...) 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 +86,49 @@ 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->need_free = false; } 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) { @@ -157,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); +}