busctl: add options to control message header flags when invoking methods

This commit is contained in:
Lennart Poettering 2014-11-21 20:13:26 +01:00
parent 574edc9006
commit 3805157836
2 changed files with 115 additions and 4 deletions

View File

@ -156,12 +156,14 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>.
<term><option>--quiet</option></term>
<listitem>
<para>When used with the <command>call</command> command suppresses
display of the response message.</para>
<para>When used with the <command>call</command> command
suppresses display of the response message payload. Note that even
if this option is specified errors returned will still be
printed and the tool will indicate success or failure with
the process exit code.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--verbose</option></term>
@ -172,6 +174,48 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>.
</listitem>
</varlistentry>
<varlistentry>
<term><option>--expect-reply=</option><replaceable>BOOL</replaceable></term>
<listitem>
<para>When used with the <command>call</command> command
specifies whether <command>busctl</command> shall wait for
completion of the method call, output the returned method
response data, and return success or failure via the process
exit code. If this is set to <literal>no</literal> the
method call will be issued but no response is expected, the
tool terminates immediately, and thus no response can be
shown, and no success or failure is returned via the exit
code. To only suppress output of the reply message payload
use <option>--quiet</option> above. Defaults to
<literal>yes</literal>.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--auto-start=</option><replaceable>BOOL</replaceable></term>
<listitem>
<para>When used with the <command>call</command> command specifies
whether the method call should implicitly activate the
called service should it not be running yet but is
configured to be auto-started. Defaults to
<literal>yes</literal>.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--allow-interactive-authorization=</option><replaceable>BOOL</replaceable></term>
<listitem>
<para>When used with the <command>call</command> command
specifies whether the services may enforce interactive
authorization while executing the operation, if the security
policy is configured for this. Defaults to
<literal>yes</literal>.</para>
</listitem>
</varlistentry>
<xi:include href="user-system-options.xml" xpointer="user" />
<xi:include href="user-system-options.xml" xpointer="system" />
<xi:include href="user-system-options.xml" xpointer="host" />

View File

@ -53,6 +53,9 @@ static size_t arg_snaplen = 4096;
static bool arg_list = false;
static bool arg_quiet = false;
static bool arg_verbose = false;
static bool arg_expect_reply = true;
static bool arg_auto_start = true;
static bool arg_allow_interactive_authorization = true;
static void pager_open_if_enabled(void) {
@ -1454,6 +1457,18 @@ static int call(sd_bus *bus, char *argv[]) {
if (r < 0)
return bus_log_create_error(r);
r = sd_bus_message_set_expect_reply(m, arg_expect_reply);
if (r < 0)
return bus_log_create_error(r);
r = sd_bus_message_set_auto_start(m, arg_auto_start);
if (r < 0)
return bus_log_create_error(r);
r = sd_bus_message_set_allow_interactive_authorization(m, arg_allow_interactive_authorization);
if (r < 0)
return bus_log_create_error(r);
if (!isempty(argv[5])) {
char **p;
@ -1469,6 +1484,16 @@ static int call(sd_bus *bus, char *argv[]) {
}
}
if (!arg_expect_reply) {
r = sd_bus_send(bus, m, NULL);
if (r < 0) {
log_error("Failed to send message.");
return r;
}
return 0;
}
r = sd_bus_call(bus, m, 0, &error, &reply);
if (r < 0) {
log_error("%s", bus_error_message(&error, r));
@ -1630,7 +1655,11 @@ static int help(void) {
" --match=MATCH Only show matching messages\n"
" --list Don't show tree, but simple object path list\n"
" --quiet Don't show method call reply\n"
" --verbose Show result values in long format\n\n"
" --verbose Show result values in long format\n"
" --expect-reply=BOOL Expect a method call reply\n"
" --auto-start=BOOL Auto-start destination service\n"
" --allow-interactive-authorization=BOOL\n"
" Allow interactive authorization for operation\n\n"
"Commands:\n"
" list List bus names\n"
" status SERVICE Show service name status\n"
@ -1667,6 +1696,9 @@ static int parse_argv(int argc, char *argv[]) {
ARG_SIZE,
ARG_LIST,
ARG_VERBOSE,
ARG_EXPECT_REPLY,
ARG_AUTO_START,
ARG_ALLOW_INTERACTIVE_AUTHORIZATION,
};
static const struct option options[] = {
@ -1688,6 +1720,9 @@ static int parse_argv(int argc, char *argv[]) {
{ "list", no_argument, NULL, ARG_LIST },
{ "quiet", no_argument, NULL, 'q' },
{ "verbose", no_argument, NULL, ARG_VERBOSE },
{ "expect-reply", required_argument, NULL, ARG_EXPECT_REPLY },
{ "auto-start", required_argument, NULL, ARG_AUTO_START },
{ "allow-interactive-authorization", required_argument, NULL, ARG_ALLOW_INTERACTIVE_AUTHORIZATION },
{},
};
@ -1789,6 +1824,38 @@ static int parse_argv(int argc, char *argv[]) {
arg_verbose = true;
break;
case ARG_EXPECT_REPLY:
r = parse_boolean(optarg);
if (r < 0) {
log_error("Failed to parse --expect-reply= parameter.");
return r;
}
arg_expect_reply = !!r;
break;
case ARG_AUTO_START:
r = parse_boolean(optarg);
if (r < 0) {
log_error("Failed to parse --auto-start= parameter.");
return r;
}
arg_auto_start = !!r;
break;
case ARG_ALLOW_INTERACTIVE_AUTHORIZATION:
r = parse_boolean(optarg);
if (r < 0) {
log_error("Failed to parse --allow-interactive-authorization= parameter.");
return r;
}
arg_allow_interactive_authorization = !!r;
break;
case '?':
return -EINVAL;