X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-bus%2Fbus-error.c;h=47f90c26f8f466ed8c486025bf9609c6598c93c7;hb=fed1e721fd0c81e60c77120539f34e16c2585634;hp=abdfd73204f79f6eacd769f771aaa4bd38d2fd5a;hpb=04c553e322680b6fcdf5b271e84b0b4b0ad8d5f9;p=elogind.git diff --git a/src/libsystemd/sd-bus/bus-error.c b/src/libsystemd/sd-bus/bus-error.c index abdfd7320..47f90c26f 100644 --- a/src/libsystemd/sd-bus/bus-error.c +++ b/src/libsystemd/sd-bus/bus-error.c @@ -35,10 +35,60 @@ #define BUS_ERROR_OOM SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_MEMORY, "Out of memory") #define BUS_ERROR_FAILED SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_FAILED, "Operation failed") +SD_BUS_ERROR_MAPPING(sd_bus_standard) = { + {"org.freedesktop.DBus.Error.Failed", EACCES}, + {"org.freedesktop.DBus.Error.NoMemory", ENOMEM}, + {"org.freedesktop.DBus.Error.ServiceUnknown", EHOSTUNREACH}, + {"org.freedesktop.DBus.Error.NameHasNoOwner", ENXIO}, + {"org.freedesktop.DBus.Error.NoReply", ETIMEDOUT}, + {"org.freedesktop.DBus.Error.IOError", EIO}, + {"org.freedesktop.DBus.Error.BadAddress", EADDRNOTAVAIL}, + {"org.freedesktop.DBus.Error.NotSupported", ENOTSUP}, + {"org.freedesktop.DBus.Error.LimitsExceeded", ENOBUFS}, + {"org.freedesktop.DBus.Error.AccessDenied", EACCES}, + {"org.freedesktop.DBus.Error.AuthFailed", EACCES}, + {"org.freedesktop.DBus.Error.InteractiveAuthorizationRequired", EACCES}, + {"org.freedesktop.DBus.Error.NoServer", EHOSTDOWN}, + {"org.freedesktop.DBus.Error.Timeout", ETIMEDOUT}, + {"org.freedesktop.DBus.Error.NoNetwork", ENONET}, + {"org.freedesktop.DBus.Error.AddressInUse", EADDRINUSE}, + {"org.freedesktop.DBus.Error.Disconnected", ECONNRESET}, + {"org.freedesktop.DBus.Error.InvalidArgs", EINVAL}, + {"org.freedesktop.DBus.Error.FileNotFound", ENOENT}, + {"org.freedesktop.DBus.Error.FileExists", EEXIST}, + {"org.freedesktop.DBus.Error.UnknownMethod", EBADR}, + {"org.freedesktop.DBus.Error.UnknownObject", EBADR}, + {"org.freedesktop.DBus.Error.UnknownInterface", EBADR}, + {"org.freedesktop.DBus.Error.UnknownProperty", EBADR}, + {"org.freedesktop.DBus.Error.PropertyReadOnly", EROFS}, + {"org.freedesktop.DBus.Error.UnixProcessIdUnknown", ESRCH}, + {"org.freedesktop.DBus.Error.InvalidSignature", EINVAL}, + {"org.freedesktop.DBus.Error.InconsistentMessage", EBADMSG}, + + {"org.freedesktop.DBus.Error.TimedOut", ETIMEDOUT}, + {"org.freedesktop.DBus.Error.MatchRuleInvalid", EINVAL}, + {"org.freedesktop.DBus.Error.InvalidFileContent", EINVAL}, + {"org.freedesktop.DBus.Error.MatchRuleNotFound", ENOENT}, + {"org.freedesktop.DBus.Error.SELinuxSecurityContextUnknown", ESRCH}, + {"org.freedesktop.DBus.Error.ObjectPathInUse", EBUSY}, +}; + +extern const sd_bus_name_error_mapping __start_sd_bus_errnomap[]; +extern const sd_bus_name_error_mapping __stop_sd_bus_errnomap[]; + +static int bus_error_mapping_lookup(const char *name, size_t len) { + const sd_bus_name_error_mapping *m; + + for (m = __start_sd_bus_errnomap; m < __stop_sd_bus_errnomap; m++) + if (m->name && strneq(m->name, name, len)) + return m->code; + + return EIO; +} + static int bus_error_name_to_errno(const char *name) { const char *p; int r; - const name_error_mapping *m; if (!name) return EINVAL; @@ -52,11 +102,7 @@ static int bus_error_name_to_errno(const char *name) { return r; } - m = bus_error_mapping_lookup(name, strlen(name)); - if (m) - return m->code; - - return EIO; + return bus_error_mapping_lookup(name, strlen(name)); } static sd_bus_error errno_to_bus_error_const(int error) { @@ -194,8 +240,10 @@ int bus_error_setfv(sd_bus_error *e, const char *name, const char *format, va_li return -ENOMEM; } + /* Of we hit OOM on formatting the pretty message, we ignore + * this, since we at least managed to write the error name */ if (format) - vasprintf((char**) &e->message, format, ap); + (void) vasprintf((char**) &e->message, format, ap); e->_need_free = 1; @@ -396,6 +444,7 @@ _public_ int sd_bus_error_set_errno(sd_bus_error *e, int error) { } int bus_error_set_errnofv(sd_bus_error *e, int error, const char *format, va_list ap) { + PROTECT_ERRNO; int r; if (error < 0) @@ -429,8 +478,9 @@ int bus_error_set_errnofv(sd_bus_error *e, int error, const char *format, va_lis if (format) { char *m; - /* First, let's try to fill in the supplied message */ + /* Then, let's try to fill in the supplied message */ + errno = error; /* Make sure that %m resolves to the specified error */ r = vasprintf(&m, format, ap); if (r >= 0) {