]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
varlink: add new call varlink_server_loop_auto()
authorLennart Poettering <lennart@poettering.net>
Mon, 25 Sep 2023 13:57:39 +0000 (15:57 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 6 Oct 2023 09:49:38 +0000 (11:49 +0200)
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.

src/shared/varlink.c
src/shared/varlink.h

index 229d97febf30851e6b14b4014430d3504dc69da5..e97127838a2116945d6d49c9983eec8675743b02 100644 (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;
index 776904890d8b9c2ea5d530b1110ea846b8ddf205..cfb7f7ed8be4c1c505effe4ca8a25cf9dee02e70 100644 (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);