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:
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user