blob: 8bf777b1a8ad7fea538a3b351fab747b429e9a6b [file] [log] [blame]
From 4e9830147f9a265965e76f1375a10a8a427beca2 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.
[Adrian Ratiu: rebased on dbus-1.12.20]
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
---
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 34c4b99e..c3ddda1c 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'>--bus=<replaceable>ADDRESS</replaceable></arg><arg choice='plain'>--peer=<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>
@@ -146,6 +147,12 @@ The default is implementation&hyphen;defined, typically 25 seconds.</para>
<term><option>--peer=</option><replaceable>ADDRESS</replaceable></term>
<listitem>
<para>Send to a non-message-bus D-Bus server at <replaceable>ADDRESS</replaceable>. In this case <command>dbus-send</command> will not call the <literal>Hello</literal> method.</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 efeb76e0..a1884837 100644
--- a/tools/dbus-send.c
+++ b/tools/dbus-send.c
@@ -261,6 +261,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;
@@ -313,6 +314,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;
@@ -421,6 +432,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.30.1