summaryrefslogtreecommitdiff
path: root/tools/dbus-send.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/dbus-send.c')
-rw-r--r--tools/dbus-send.c52
1 files changed, 50 insertions, 2 deletions
diff --git a/tools/dbus-send.c b/tools/dbus-send.c
index efeb76e0..343fd75a 100644
--- a/tools/dbus-send.c
+++ b/tools/dbus-send.c
@@ -54,7 +54,7 @@ static void usage (int ecode) _DBUS_GNUC_NORETURN;
static void
usage (int ecode)
{
- fprintf (stderr, "Usage: %s [--help] [--system | --session | --bus=ADDRESS | --peer=ADDRESS] [--dest=NAME] [--type=TYPE] [--print-reply[=literal]] [--reply-timeout=MSEC] <destination object path> <message name> [contents ...]\n", appname);
+ fprintf (stderr, "Usage: %s [--help] [--system | --session | --bus=ADDRESS | --peer=ADDRESS] [--sender=NAME] [--dest=NAME] [--type=TYPE] [--print-reply[=literal]] [--reply-timeout=MSEC] <destination object path> <message name> [contents ...]\n", appname);
exit (ecode);
}
@@ -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;
@@ -372,6 +383,12 @@ main (int argc, char *argv[])
usage (1);
}
+ if (sender != NULL && address != NULL && !is_bus)
+ {
+ fprintf (stderr, "\"--peer\" may not be used with \"--sender\"\n");
+ exit (1);
+ }
+
if (type_str != NULL)
{
message_type = dbus_message_type_from_string (type_str);
@@ -383,12 +400,20 @@ main (int argc, char *argv[])
exit (1);
}
}
-
+
dbus_error_init (&error);
if (dest && !dbus_validate_bus_name (dest, &error))
{
fprintf (stderr, "invalid value (%s) of \"--dest\"\n", dest);
+ dbus_error_free (&error);
+ usage (1);
+ }
+
+ if (sender && !dbus_validate_bus_name (sender, &error))
+ {
+ fprintf (stderr, "invalid value (%s) of \"--sender\"\n", sender);
+ dbus_error_free (&error);
usage (1);
}
@@ -421,6 +446,29 @@ main (int argc, char *argv[])
}
}
+ if (sender != NULL)
+ {
+ int ret = dbus_bus_request_name (connection, sender, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error);
+ switch (ret)
+ {
+ 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, "Failed to request sender name \"%s\": unexpected result code %d\n",
+ sender, ret);
+ exit (1);
+ }
+ }
+
if (message_type == DBUS_MESSAGE_TYPE_METHOD_CALL)
{
char *last_dot;