varlink: add new call varlink_server_loop_auto()

This is a helper call that runs the specified VarlinkServer object in an
event loop, and exits once no more connections exist.

This is useful for pure varlink servers (i.e. those which only server
varlink requests and do nothing else), to run as long as there's
something to do and exit right after.
This commit is contained in:
Lennart Poettering
2023-10-06 11:49:38 +02:00
parent 206504a594
commit 2e5edb93b7
2 changed files with 30 additions and 0 deletions
+28
View File
@@ -3123,6 +3123,34 @@ void* varlink_server_get_userdata(VarlinkServer *s) {
return s->userdata;
}
int varlink_server_loop_auto(VarlinkServer *server) {
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
int r;
assert_return(server, -EINVAL);
assert_return(!server->event, -EBUSY);
/* Runs a Varlink service event loop populated with a passed fd. Exits on the last connection. */
r = sd_event_new(&event);
if (r < 0)
return r;
r = varlink_server_set_exit_on_idle(server, true);
if (r < 0)
return r;
r = varlink_server_attach_event(server, event, 0);
if (r < 0)
return r;
r = varlink_server_listen_auto(server);
if (r < 0)
return r;
return sd_event_loop(event);
}
static VarlinkServerSocket* varlink_server_socket_destroy(VarlinkServerSocket *ss) {
if (!ss)
return NULL;
+2
View File
@@ -169,6 +169,8 @@ int varlink_server_attach_event(VarlinkServer *v, sd_event *e, int64_t priority)
int varlink_server_detach_event(VarlinkServer *v);
sd_event *varlink_server_get_event(VarlinkServer *v);
int varlink_server_loop_auto(VarlinkServer *server);
int varlink_server_shutdown(VarlinkServer *server);
int varlink_server_set_exit_on_idle(VarlinkServer *s, bool b);