]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
varlink: allow associating Varlink IDL information with a VarlinkServer
authorLennart Poettering <lennart@poettering.net>
Fri, 22 Sep 2023 20:31:01 +0000 (22:31 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 6 Oct 2023 09:49:38 +0000 (11:49 +0200)
The data is not used for anything yet, but this will be added in later
commits.

src/shared/varlink.c
src/shared/varlink.h

index 5af2c2c3634791ae4b5183b20492d1da9e9bf101..2295f460165cdfdeabd62ea0a26e70d553353812 100644 (file)
@@ -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;
 
index 5eb4676dc83330409e9fd1d80fc244cd55725ea3..457332eecc30184c1d6d6fcc8031004f4e358a43 100644 (file)
@@ -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);