blob: a181c0eda5016953f6a15179c75dae773ba793aa [file] [log] [blame]
Tomáš Pecka5e070252022-05-20 20:41:21 +02001From 072ebba1de115cb31a71f6398c17a1bfdb383ee8 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
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
Václav Kubernát8cd61562021-12-08 13:27:31 +010019index e0038dfd28..7e5c9657f8 100644
Tomáš Peckaae301762021-10-13 10:50:37 +020020--- 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:
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
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--
Tomáš Pecka5e070252022-05-20 20:41:21 +0200732.35.1
Tomáš Peckaae301762021-10-13 10:50:37 +020074