blob: ec1fa8793bbc6f5611435db93053908cce5bf9fb [file] [log] [blame]
From 21aa7e46e66dee529053f0570511a13a0d4201ff Mon Sep 17 00:00:00 2001
From: Chris Morin <cmtm@google.com>
Date: Fri, 14 Jun 2019 13:16:10 -0700
Subject: [PATCH] dbus-send: add --sender option
Clients listening for a signal can match against the 'sender', expecting
it to come from a connection with a specific name. With this change,
dbus-send can send signals to them.
---
doc/dbus-send.1.xml.in | 7 +++++++
tools/dbus-send.c | 32 ++++++++++++++++++++++++++++++++
2 files changed, 39 insertions(+)
diff --git a/doc/dbus-send.1.xml.in b/doc/dbus-send.1.xml.in
index 67b6dfd2..8c1bbeaa 100644
--- a/doc/dbus-send.1.xml.in
+++ b/doc/dbus-send.1.xml.in
@@ -22,6 +22,7 @@
<cmdsynopsis>
<command>dbus-send</command>
<group choice='opt'><arg choice='plain'>--system </arg><arg choice='plain'>--session </arg><arg choice='plain'>--address=<replaceable>ADDRESS</replaceable></arg></group>
+ <arg choice='opt'>--sender=<replaceable>NAME</replaceable></arg>
<arg choice='opt'>--dest=<replaceable>NAME</replaceable></arg>
<arg choice='opt'><arg choice='plain'>--print-reply </arg><arg choice='opt'><replaceable>=literal</replaceable></arg></arg>
<arg choice='opt'>--reply-timeout=<replaceable>MSEC</replaceable></arg>
@@ -140,6 +141,12 @@ The default is implementation&hyphen;defined, typically 25 seconds.</para>
<term><option>--address=</option><replaceable>ADDRESS</replaceable></term>
<listitem>
<para>Send to <replaceable>ADDRESS</replaceable>.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>--sender=</option><replaceable>NAME</replaceable></term>
+ <listitem>
+<para>Request ownership of name <replaceable>NAME</replaceable> before sending message.</para>
</listitem>
</varlistentry>
<varlistentry>
diff --git a/tools/dbus-send.c b/tools/dbus-send.c
index fb6a9e6e..bf1e584c 100644
--- a/tools/dbus-send.c
+++ b/tools/dbus-send.c
@@ -337,6 +337,7 @@ main (int argc, char *argv[])
int message_type = DBUS_MESSAGE_TYPE_SIGNAL;
const char *type_str = NULL;
const char *address = NULL;
+ const char *sender = NULL;
int is_bus = FALSE;
int session_or_system = FALSE;
int fixed = 0;
@@ -387,6 +388,16 @@ main (int argc, char *argv[])
usage (1);
}
}
+ else if (strstr (arg, "--sender=") == arg)
+ {
+ sender = strchr (arg, '=') + 1;
+
+ if (sender[0] == '\0')
+ {
+ fprintf (stderr, "\"--sender=\" requires a NAME\n");
+ usage (1);
+ }
+ }
else if (strncmp (arg, "--print-reply", 13) == 0)
{
print_reply = TRUE;
@@ -497,6 +508,27 @@ main (int argc, char *argv[])
}
}
+ if (sender != NULL)
+ {
+ switch(dbus_bus_request_name (connection, sender, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error))
+ {
+ case DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER:
+ /* success */
+ break;
+ case DBUS_REQUEST_NAME_REPLY_EXISTS:
+ fprintf (stderr, "Requested name \"%s\" already has owner\n", sender);
+ exit (1);
+ case -1:
+ fprintf (stderr, "Failed to request sender name \"%s\": %s\n", sender, error.message);
+ dbus_error_free(&error);
+ exit (1);
+ default:
+ /* This should be unreachable if the bus is compliant */
+ fprintf (stderr, "Request of sender name failed unexpectedly\n");
+ exit (1);
+ }
+ }
+
if (message_type == DBUS_MESSAGE_TYPE_METHOD_CALL)
{
char *last_dot;
--
2.22.0.410.gd8fdbe21b5-goog