From a4562f945d2386f9f089f16f67463b9b38e78957 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 19 Dec 2023 15:01:36 +0100 Subject: [PATCH] varlink: add helper that turns varlink errors back to errnos, client-side --- src/shared/varlink.c | 39 +++++++++++++++++++++++++++++++++++++++ src/shared/varlink.h | 2 ++ 2 files changed, 41 insertions(+) diff --git a/src/shared/varlink.c b/src/shared/varlink.c index 84497c1a06..f9c7f2e659 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 418ba49d1a..f703391279 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); -- 2.25.1