varlink: add helper that turns varlink errors back to errnos, client-side

This commit is contained in:
Lennart Poettering 2023-12-19 15:01:36 +01:00
parent d9975dbb3c
commit a4562f945d
2 changed files with 41 additions and 0 deletions

View file

@ -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 */
}

View file

@ -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);