+ return -error;
+
+use_fallback:
+ sd_bus_error_set_const(e, name, fallback);
+ return -error;
+}
+
+static sd_bus_error map_from_errno(int error) {
+
+ if (error < 0)
+ error = -error;
+
+ switch (error) {
+
+ case ENOMEM:
+ return SD_BUS_ERROR_MAKE(SD_BUS_ERROR_NO_NETWORK, "Out of memory");
+
+ case EPERM:
+ case EACCES:
+ return SD_BUS_ERROR_MAKE(SD_BUS_ERROR_ACCESS_DENIED, "Access denied");
+
+ case EINVAL:
+ return SD_BUS_ERROR_MAKE(SD_BUS_ERROR_INVALID_ARGS, "Invalid argument");
+
+ case ESRCH:
+ return SD_BUS_ERROR_MAKE(SD_BUS_ERROR_UNIX_PROCESS_ID_UNKNOWN, "No such process");
+
+ case ENOENT:
+ return SD_BUS_ERROR_MAKE(SD_BUS_ERROR_FILE_NOT_FOUND, "File not found");
+
+ case EEXIST:
+ return SD_BUS_ERROR_MAKE(SD_BUS_ERROR_FILE_EXISTS, "File exists");
+
+ case ETIMEDOUT:
+ case ETIME:
+ return SD_BUS_ERROR_MAKE(SD_BUS_ERROR_TIMEOUT, "Timed out");
+
+ case EIO:
+ return SD_BUS_ERROR_MAKE(SD_BUS_ERROR_IO_ERROR, "Input/output error");
+
+ case ENETRESET:
+ case ECONNABORTED:
+ case ECONNRESET:
+ return SD_BUS_ERROR_MAKE(SD_BUS_ERROR_DISCONNECTED, "Disconnected");
+
+ case ENOTSUP:
+ return SD_BUS_ERROR_MAKE(SD_BUS_ERROR_NOT_SUPPORTED, "Not supported");
+
+ case EADDRNOTAVAIL:
+ return SD_BUS_ERROR_MAKE(SD_BUS_ERROR_BAD_ADDRESS, "Address not available");
+
+ case ENOBUFS:
+ return SD_BUS_ERROR_MAKE(SD_BUS_ERROR_LIMITS_EXCEEDED, "Limits exceeded");
+
+ case EADDRINUSE:
+ return SD_BUS_ERROR_MAKE(SD_BUS_ERROR_ADDRESS_IN_USE, "Address in use");
+
+ case EBADMSG:
+ return SD_BUS_ERROR_MAKE(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Inconsistent message");
+ }
+
+ return SD_BUS_ERROR_MAKE(SD_BUS_ERROR_FAILED, "Operation failed");
+}
+
+int sd_bus_error_set_errno(sd_bus_error *e, int error) {
+ sd_bus_error x;
+
+ x = map_from_errno(error);
+
+ return bus_error_set_strerror_or_const(e, x.name, error, x.message);
+}
+
+int bus_error_set_errnofv(sd_bus_error *e, int error, const char *format, va_list ap) {
+ sd_bus_error x;
+ int r;
+
+ if (error < 0)
+ error = -error;
+
+ if (!e)
+ return 0;
+
+ assert_return(!bus_error_is_dirty(e), -EINVAL);
+
+ x = map_from_errno(error);
+
+ if (format) {
+ char *n, *m;
+
+ r = vasprintf(&m, format, ap);
+ if (r < 0)
+ goto fallback;
+
+ n = strdup(x.name);
+ if (!n) {
+ free(m);
+ goto fallback;
+ }
+
+ e->name = n;
+ e->message = m;
+ e->need_free = true;
+ return -error;