mirror of
https://github.com/systemd/systemd
synced 2024-07-21 02:05:05 +00:00
varlinkctl: add new --collect switch
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.
This commit is contained in:
parent
9bca989183
commit
7781d28fd7
|
@ -184,6 +184,15 @@
|
|||
<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>
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue