]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
varlinkctl: add new --collect switch
authorLennart Poettering <lennart@poettering.net>
Wed, 7 Feb 2024 10:20:05 +0000 (11:20 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 12 Feb 2024 11:04:18 +0000 (12:04 +0100)
It exposes the varlink_collect() call we internally provide: it collects
all responses of a method call that is issued with the "more" method
call flag. It then returns the result as a single JSON array.

man/varlinkctl.xml
src/varlinkctl/varlinkctl.c

index eff49af349b16eaefac5a89fec17775ead50358c..646fea0d2479c36e1c0b7457f4a43227aeec1dc4 100644 (file)
         <xi:include href="version-info.xml" xpointer="v255"/></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><option>--collect</option></term>
+
+        <listitem><para>This is similar to <option>--more</option> but collects all responses in a JSON
+        array, and prints it, rather than in JSON_SEQ mode.</para>
+
+        <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><option>--oneway</option></term>
 
index 8f3a88aba57f24a0c9d8c89791d2750e009e7359..714396d3874336d7d827ba0c91a320f6d2eca8e4 100644 (file)
@@ -19,6 +19,7 @@
 static JsonFormatFlags arg_json_format_flags = JSON_FORMAT_OFF;
 static PagerFlags arg_pager_flags = 0;
 static VarlinkMethodFlags arg_method_flags = 0;
+static bool arg_collect = false;
 
 static int help(void) {
         _cleanup_free_ char *link = NULL;
@@ -47,6 +48,7 @@ static int help(void) {
                "     --version           Show package version\n"
                "     --no-pager          Do not pipe output into a pager\n"
                "     --more              Request multiple responses\n"
+               "     --collect           Collect multiple responses in a JSON array\n"
                "     --oneway            Do not request response\n"
                "     --json=MODE         Output as JSON\n"
                "  -j                     Same as --json=pretty on tty, --json=short otherwise\n"
@@ -73,6 +75,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_MORE,
                 ARG_ONEWAY,
                 ARG_JSON,
+                ARG_COLLECT,
         };
 
         static const struct option options[] = {
@@ -82,6 +85,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "more",     no_argument,       NULL, ARG_MORE     },
                 { "oneway",   no_argument,       NULL, ARG_ONEWAY   },
                 { "json",     required_argument, NULL, ARG_JSON     },
+                { "collect",  no_argument,       NULL, ARG_COLLECT  },
                 {},
         };
 
@@ -112,6 +116,10 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_method_flags = (arg_method_flags & ~VARLINK_METHOD_MORE) | VARLINK_METHOD_ONEWAY;
                         break;
 
+                case ARG_COLLECT:
+                        arg_collect = true;
+                        break;
+
                 case ARG_JSON:
                         r = parse_json_argument(optarg, &arg_json_format_flags);
                         if (r <= 0)
@@ -388,7 +396,26 @@ static int verb_call(int argc, char *argv[], void *userdata) {
         if (r < 0)
                 return r;
 
-        if (arg_method_flags & VARLINK_METHOD_ONEWAY) {
+        if (arg_collect) {
+                JsonVariant *reply = NULL;
+                const char *error = NULL;
+
+                r = varlink_collect(vl, method, jp, &reply, &error);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to issue %s() call: %m", method);
+                if (error) {
+                        /* Propagate the error we received via sd_notify() */
+                        (void) sd_notifyf(/* unset_environment= */ false, "VARLINKERROR=%s", error);
+
+                        r = log_error_errno(SYNTHETIC_ERRNO(EBADE), "Method call %s() failed: %s", method, error);
+                } else
+                        r = 0;
+
+                pager_open(arg_pager_flags);
+                json_variant_dump(reply, arg_json_format_flags, stdout, NULL);
+                return r;
+
+        } else if (arg_method_flags & VARLINK_METHOD_ONEWAY) {
                 r = varlink_send(vl, method, jp);
                 if (r < 0)
                         return log_error_errno(r, "Failed to issue %s() call: %m", method);