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.
This commit is contained in:
Lennart Poettering
2023-10-06 11:49:38 +02:00
parent e50b2a93d6
commit 9fc843ed0e
2 changed files with 40 additions and 0 deletions
+34
View 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;
+6
View 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);