blob: 579dd9fca9216c196e1e5b2818bfb623ad5aa418 [file] [log] [blame]
Tomáš Peckaae301762021-10-13 10:50:37 +02001From 657ce718099d6d82d2a6757909496d285221b22f Mon Sep 17 00:00:00 2001
2From: Tomas Pecka <peckato1@users.noreply.github.com>
3Date: Thu, 9 Sep 2021 09:19:05 +0200
4Subject: [PATCH 4/9] varlink: Implement varlink_observe_complete
5
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
19index 8da568e208..23a72516fb 100644
20--- a/src/shared/varlink.c
21+++ b/src/shared/varlink.c
22@@ -1440,6 +1440,37 @@ int varlink_observeb(Varlink *v, const char *method, ...) {
23 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:
53+ assert_not_reached("Unexpected state");
54+ }
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
61index 66a1ff630e..9bc836e1f9 100644
62--- 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--
732.33.0
74