chiark / gitweb /
busctl: add options to control message header flags when invoking methods
authorLennart Poettering <lennart@poettering.net>
Fri, 21 Nov 2014 19:13:26 +0000 (20:13 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 21 Nov 2014 19:13:26 +0000 (20:13 +0100)
man/busctl.xml
src/libsystemd/sd-bus/busctl.c

index e9b758a..e0af30e 100644 (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" />
index 7f5124f..145b319 100644 (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;