From: Lennart Poettering Date: Mon, 25 Sep 2023 13:57:39 +0000 (+0200) Subject: varlink: add new call varlink_server_loop_auto() X-Git-Tag: v255-rc1~305^2~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2e5edb93b7e55de6465954d6fa03a384e52b00ae;p=thirdparty%2Fsystemd.git 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. --- diff --git a/src/shared/varlink.c b/src/shared/varlink.c index 229d97febf3..e97127838a2 100644 --- a/src/shared/varlink.c +++ b/src/shared/varlink.c @@ -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; diff --git a/src/shared/varlink.h b/src/shared/varlink.h index 776904890d8..cfb7f7ed8be 100644 --- a/src/shared/varlink.h +++ b/src/shared/varlink.h @@ -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);