mirror of
https://github.com/systemd/systemd
synced 2024-09-16 06:43:18 +00:00
varlink: add helper that turns varlink errors back to errnos, client-side
This commit is contained in:
parent
d9975dbb3c
commit
a4562f945d
|
@ -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 */
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue