From: Christopher Morin Date: Mon, 15 Jul 2019 12:36:50 +0000 (+0000) Subject: dbus-send: add --sender option X-Git-Tag: dbus-1.13.14~24^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9842689a29f9a3ca57a15b5a201a030688a831bf;p=thirdparty%2Fdbus.git 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. --- diff --git a/doc/dbus-send.1.xml.in b/doc/dbus-send.1.xml.in index 34c4b99e7..981c786db 100644 --- a/doc/dbus-send.1.xml.in +++ b/doc/dbus-send.1.xml.in @@ -22,6 +22,7 @@ dbus-send --system --session --bus=ADDRESS--peer=ADDRESS + --sender=NAME --dest=NAME --print-reply =literal --reply-timeout=MSEC @@ -146,6 +147,12 @@ The default is implementation‐defined, typically 25 seconds. ADDRESS Send to a non-message-bus D-Bus server at ADDRESS. In this case dbus-send will not call the Hello method. + + + + NAME + +Request ownership of name NAME before sending the message. The name will be released when dbus-send exits. diff --git a/tools/dbus-send.c b/tools/dbus-send.c index efeb76e00..343fd75a2 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] [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] [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;