diff --git a/src/shared/varlink.c b/src/shared/varlink.c index 229d97febf..e97127838a 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 776904890d..cfb7f7ed8b 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);