From: Lennart Poettering Date: Tue, 19 Dec 2023 14:01:36 +0000 (+0100) Subject: varlink: add helper that turns varlink errors back to errnos, client-side X-Git-Tag: v256-rc1~1118^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a4562f945d2386f9f089f16f67463b9b38e78957;p=thirdparty%2Fsystemd.git varlink: add helper that turns varlink errors back to errnos, client-side --- diff --git a/src/shared/varlink.c b/src/shared/varlink.c index 84497c1a06e..f9c7f2e659d 100644 --- a/src/shared/varlink.c +++ b/src/shared/varlink.c @@ -3997,3 +3997,42 @@ int varlink_invocation(VarlinkInvocationFlags flags) { return true; } + +int varlink_error_to_errno(const char *error, JsonVariant *parameters) { + static const struct { + const char *error; + int value; + } table[] = { + { VARLINK_ERROR_DISCONNECTED, -ECONNRESET }, + { VARLINK_ERROR_TIMEOUT, -ETIMEDOUT }, + { VARLINK_ERROR_PROTOCOL, -EPROTO }, + { VARLINK_ERROR_INTERFACE_NOT_FOUND, -EADDRNOTAVAIL }, + { VARLINK_ERROR_METHOD_NOT_FOUND, -ENXIO }, + { VARLINK_ERROR_METHOD_NOT_IMPLEMENTED, -ENOTTY }, + { VARLINK_ERROR_INVALID_PARAMETER, -EINVAL }, + { VARLINK_ERROR_PERMISSION_DENIED, -EACCES }, + { VARLINK_ERROR_EXPECTED_MORE, -EBADE }, + }; + + if (!error) + return 0; + + FOREACH_ARRAY(t, table, ELEMENTSOF(table)) + if (streq(error, t->error)) + return t->value; + + if (streq(error, VARLINK_ERROR_SYSTEM) && parameters) { + JsonVariant *e; + + e = json_variant_by_key(parameters, "errno"); + if (json_variant_is_integer(e)) { + int64_t i; + + i = json_variant_integer(e); + if (i > 0 && i < ERRNO_MAX) + return -i; + } + } + + return -EBADR; /* Catch-all */ +} diff --git a/src/shared/varlink.h b/src/shared/varlink.h index 418ba49d1a0..f7033912799 100644 --- a/src/shared/varlink.h +++ b/src/shared/varlink.h @@ -213,6 +213,8 @@ typedef enum VarlinkInvocationFlags { int varlink_invocation(VarlinkInvocationFlags flags); +int varlink_error_to_errno(const char *error, JsonVariant *parameters); + DEFINE_TRIVIAL_CLEANUP_FUNC(Varlink *, varlink_unref); DEFINE_TRIVIAL_CLEANUP_FUNC(Varlink *, varlink_close_unref); DEFINE_TRIVIAL_CLEANUP_FUNC(Varlink *, varlink_flush_close_unref);