blob: b2b337fd2d19235da99aefd9172fbca951a317d9 [file] [log] [blame]
Tomáš Pecka6936b912023-06-12 11:30:36 +02001From 542b30b98c67c7407053bd5526ab080cc8090fb2 Mon Sep 17 00:00:00 2001
Tomáš Peckaae301762021-10-13 10:50:37 +02002From: Tomas Pecka <peckato1@users.noreply.github.com>
3Date: Thu, 9 Sep 2021 09:19:05 +0200
Tomáš Pecka6936b912023-06-12 11:30:36 +02004Subject: [PATCH 4/7] varlink: Implement varlink_observe_complete
Tomáš Peckaae301762021-10-13 10:50:37 +02005
6In some cases one doesn't want to run the sd_event loop just to obtain
7results from varlink replies in the "continues" mode.
8
9The new function (`varlink_observe_complete`) runs the varlink process
10mode on the client side synchronously and returns when no more replies
11are expected.
12This is similar to the behavior seen in the `varlink_call` function.
13---
14 src/shared/varlink.c | 31 +++++++++++++++++++++++++++++++
15 src/shared/varlink.h | 1 +
16 2 files changed, 32 insertions(+)
17
18diff --git a/src/shared/varlink.c b/src/shared/varlink.c
Tomáš Pecka6936b912023-06-12 11:30:36 +020019index 4f7ac97689..d7892693d1 100644
Tomáš Peckaae301762021-10-13 10:50:37 +020020--- a/src/shared/varlink.c
21+++ b/src/shared/varlink.c
Tomáš Pecka6936b912023-06-12 11:30:36 +020022@@ -1450,6 +1450,37 @@ int varlink_observeb(Varlink *v, const char *method, ...) {
Tomáš Peckaae301762021-10-13 10:50:37 +020023 return varlink_observe(v, method, parameters);
24 }
25
26+int varlink_observe_complete(Varlink *v) {
27+ int r;
28+
29+ while (v->state == VARLINK_AWAITING_REPLY_MORE) {
30+ r = varlink_process(v);
31+ if (r < 0)
32+ return r;
33+ if (r > 0)
34+ continue;
35+
36+ r = varlink_wait(v, USEC_INFINITY);
37+ if (r < 0)
38+ return r;
39+ }
40+
41+ switch (v->state) {
42+ case VARLINK_IDLE_CLIENT:
43+ return 1;
44+
45+ case VARLINK_PENDING_DISCONNECT:
46+ case VARLINK_DISCONNECTED:
47+ return varlink_log_errno(v, SYNTHETIC_ERRNO(ECONNRESET), "Connection was closed.");
48+
49+ case VARLINK_PENDING_TIMEOUT:
50+ return varlink_log_errno(v, SYNTHETIC_ERRNO(ETIME), "Connection timed out.");
51+
52+ default:
Václav Kubernát8cd61562021-12-08 13:27:31 +010053+ assert_not_reached();
Tomáš Peckaae301762021-10-13 10:50:37 +020054+ }
55+}
56+
57 int varlink_call(
58 Varlink *v,
59 const char *method,
60diff --git a/src/shared/varlink.h b/src/shared/varlink.h
Tomáš Pecka6936b912023-06-12 11:30:36 +020061index 9518cd9098..a424411ce6 100644
Tomáš Peckaae301762021-10-13 10:50:37 +020062--- a/src/shared/varlink.h
63+++ b/src/shared/varlink.h
64@@ -92,6 +92,7 @@ int varlink_invokeb(Varlink *v, const char *method, ...);
65 /* Enqueue method call, expect a reply now, and possibly more later, which are all delivered to the reply callback */
66 int varlink_observe(Varlink *v, const char *method, JsonVariant *parameters);
67 int varlink_observeb(Varlink *v, const char *method, ...);
68+int varlink_observe_complete(Varlink *v);
69
70 /* Enqueue a final reply */
71 int varlink_reply(Varlink *v, JsonVariant *parameters);
72--
Tomáš Pecka6936b912023-06-12 11:30:36 +0200732.41.0
Tomáš Peckaae301762021-10-13 10:50:37 +020074