From: Lennart Poettering Date: Fri, 22 Sep 2023 20:31:01 +0000 (+0200) Subject: varlink: allow associating Varlink IDL information with a VarlinkServer X-Git-Tag: v255-rc1~305^2~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9fc843ed0ee9f605ceec96a1678e07a158920830;p=thirdparty%2Fsystemd.git varlink: allow associating Varlink IDL information with a VarlinkServer The data is not used for anything yet, but this will be added in later commits. --- diff --git a/src/shared/varlink.c b/src/shared/varlink.c index 5af2c2c3634..2295f460165 100644 --- a/src/shared/varlink.c +++ b/src/shared/varlink.c @@ -211,6 +211,7 @@ struct VarlinkServer { LIST_HEAD(VarlinkServerSocket, sockets); Hashmap *methods; + Hashmap *interfaces; VarlinkConnect connect_callback; VarlinkDisconnect disconnect_callback; @@ -2486,6 +2487,7 @@ static VarlinkServer* varlink_server_destroy(VarlinkServer *s) { free(m); hashmap_free(s->methods); + hashmap_free(s->interfaces); hashmap_free(s->by_uid); sd_event_unref(s->event); @@ -2961,6 +2963,38 @@ int varlink_server_bind_disconnect(VarlinkServer *s, VarlinkDisconnect callback) return 0; } +int varlink_server_add_interface(VarlinkServer *s, const VarlinkInterface *interface) { + assert_return(s, -EINVAL); + assert_return(interface, -EINVAL); + assert_return(interface->name, -EINVAL); + + if (hashmap_contains(s->interfaces, interface->name)) + return log_debug_errno(SYNTHETIC_ERRNO(EEXIST), "Duplicate registration of interface '%s'.", interface->name); + + return hashmap_ensure_put(&s->interfaces, &string_hash_ops, interface->name, (void*) interface); +} + +int varlink_server_add_interface_many_internal(VarlinkServer *s, ...) { + va_list ap; + int r = 0; + + assert_return(s, -EINVAL); + + va_start(ap, s); + for (;;) { + const VarlinkInterface *interface = va_arg(ap, const VarlinkInterface*); + if (!interface) + break; + + r = varlink_server_add_interface(s, interface); + if (r < 0) + break; + } + va_end(ap); + + return r; +} + unsigned varlink_server_connections_max(VarlinkServer *s) { int dts; diff --git a/src/shared/varlink.h b/src/shared/varlink.h index 5eb4676dc83..457332eecc3 100644 --- a/src/shared/varlink.h +++ b/src/shared/varlink.h @@ -5,6 +5,7 @@ #include "json.h" #include "time-util.h" +#include "varlink-idl.h" /* A minimal Varlink implementation. We only implement the minimal, obvious bits here though. No validation, * no introspection, no name service, just the stuff actually needed. @@ -153,6 +154,11 @@ int varlink_server_bind_method_many_internal(VarlinkServer *s, ...); int varlink_server_bind_connect(VarlinkServer *s, VarlinkConnect connect); int varlink_server_bind_disconnect(VarlinkServer *s, VarlinkDisconnect disconnect); +/* Add interface definition */ +int varlink_server_add_interface(VarlinkServer *s, const VarlinkInterface *interface); +int varlink_server_add_interface_many_internal(VarlinkServer *s, ...); +#define varlink_server_add_interface_many(s, ...) varlink_server_add_interface_many_internal(s, __VA_ARGS__, NULL) + void* varlink_server_set_userdata(VarlinkServer *s, void *userdata); void* varlink_server_get_userdata(VarlinkServer *s);