diff options
author | Alban Crequy <alban.crequy@collabora.co.uk> | 2014-07-02 14:18:26 +0100 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2014-10-14 13:53:59 +0100 |
commit | 74b4f1d07a0f166cee38c2624e9afd462676b0e9 (patch) | |
tree | 5ac8c7636fbfd9e1d400d3c8fae9054c7aa1c9c8 | |
parent | 75b35badb7574333376dcd8b2a1314ae697756aa (diff) | |
download | dbus-74b4f1d07a0f166cee38c2624e9afd462676b0e9.tar.gz |
dbus-test-tool: add black-hole mode
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=34140
Reviewed-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
-rw-r--r-- | tools/dbus-echo.c | 149 | ||||
-rw-r--r-- | tools/test-tool.c | 5 | ||||
-rw-r--r-- | tools/test-tool.h | 1 |
3 files changed, 123 insertions, 32 deletions
diff --git a/tools/dbus-echo.c b/tools/dbus-echo.c index 05af6011..72973cdb 100644 --- a/tools/dbus-echo.c +++ b/tools/dbus-echo.c @@ -26,14 +26,19 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> #include <dbus/dbus.h> #include "test-tool.h" #include "tool-common.h" +static int sleep_ms = -1; +static dbus_bool_t noreply = FALSE; +static dbus_bool_t noread = FALSE; + static void -usage (int exit_with) +usage_echo (int exit_with) { fprintf (stderr, "Usage: dbus-test-tool echo [OPTIONS]\n" @@ -52,43 +57,99 @@ usage (int exit_with) exit (exit_with); } +static void +usage_black_hole (int exit_with) +{ + fprintf (stderr, + "Usage: dbus-test-tool black-hole [OPTIONS]\n" + "\n" + "Receive method calls but do not reply.\n" + "\n" + "Options:\n" + "\n" + " --name=NAME claim this well-known name first\n" + "\n" + " --no-read don't read anything on the D-Bus socket\n" + "\n" + " --session use the session bus (default)\n" + " --system use the system bus\n" + ); + exit (exit_with); +} + static DBusHandlerResult filter (DBusConnection *connection, DBusMessage *message, void *user_data) { DBusMessage *reply; - int *sleep_ms = user_data; if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - if (*sleep_ms > 0) + if (sleep_ms > 0) { - tool_millisleep (*sleep_ms); + tool_millisleep (sleep_ms); } - reply = dbus_message_new_method_return (message); + if (!noreply) + { + reply = dbus_message_new_method_return (message); - if (reply == NULL) - tool_oom ("allocating reply"); + if (reply == NULL) + tool_oom ("allocating reply"); - if (!dbus_connection_send (connection, reply, NULL)) - tool_oom ("sending reply"); + if (!dbus_connection_send (connection, reply, NULL)) + tool_oom ("sending reply"); - dbus_message_unref (reply); + dbus_message_unref (reply); + } return DBUS_HANDLER_RESULT_HANDLED; } +static DBusConnection * +init_connection (DBusBusType type, const char *name) +{ + DBusConnection *connection; + DBusError error = DBUS_ERROR_INIT; + + connection = dbus_bus_get (type, &error); + + if (connection == NULL) + { + fprintf (stderr, "Failed to connect to bus: %s: %s\n", + error.name, error.message); + dbus_error_free (&error); + exit (1); + } + + if (name != NULL) + { + if (dbus_bus_request_name (connection, name, DBUS_NAME_FLAG_DO_NOT_QUEUE, + NULL) != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) + { + fprintf (stderr, "failed to take bus name %s\n", name); + exit (1); + } + } + else + { + printf ("%s\n", dbus_bus_get_unique_name (connection)); + } + + if (!dbus_connection_add_filter (connection, filter, NULL, NULL)) + tool_oom ("adding message filter"); + + return connection; +} + int dbus_test_tool_echo (int argc, char **argv) { DBusConnection *connection; - DBusError error = DBUS_ERROR_INIT; DBusBusType type = DBUS_BUS_SESSION; int i; - int sleep_ms = -1; const char *name = NULL; /* argv[1] is the tool name, so start from 2 */ @@ -115,36 +176,64 @@ dbus_test_tool_echo (int argc, char **argv) } else { - usage (2); + usage_echo (2); } } - connection = dbus_bus_get (type, &error); + connection = init_connection (type, name); - if (connection == NULL) - { - fprintf (stderr, "Failed to connect to bus: %s: %s\n", - error.name, error.message); - dbus_error_free (&error); - return 1; - } + while (dbus_connection_read_write_dispatch (connection, -1)) + {} - if (name != NULL) + dbus_connection_unref (connection); + return 0; +} + +int +dbus_test_tool_black_hole (int argc, char **argv) +{ + DBusConnection *connection; + DBusBusType type = DBUS_BUS_SESSION; + int i; + const char *name = NULL; + + /* argv[1] is the tool name, so start from 2 */ + + for (i = 2; i < argc; i++) { - if (dbus_bus_request_name (connection, name, DBUS_NAME_FLAG_DO_NOT_QUEUE, - NULL) != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) + const char *arg = argv[i]; + + if (strcmp (arg, "--system") == 0) { - fprintf (stderr, "failed to take bus name %s\n", name); - exit (1); + type = DBUS_BUS_SYSTEM; + } + else if (strcmp (arg, "--session") == 0) + { + type = DBUS_BUS_SESSION; + } + else if (strstr (arg, "--name=") == arg) + { + name = arg + strlen ("--name="); + } + else if (strcmp (arg, "--no-read") == 0) + { + noread = TRUE; + } + else + { + usage_black_hole (2); } } - else + + connection = init_connection (type, name); + + if (noread) { - printf ("%s\n", dbus_bus_get_unique_name (connection)); + while (1) + sleep (3600); } - if (!dbus_connection_add_filter (connection, filter, &sleep_ms, NULL)) - tool_oom ("adding message filter"); + noreply = TRUE; while (dbus_connection_read_write_dispatch (connection, -1)) {} diff --git a/tools/test-tool.c b/tools/test-tool.c index 1893b78c..149c10ab 100644 --- a/tools/test-tool.c +++ b/tools/test-tool.c @@ -34,8 +34,9 @@ static struct { const char *name; int (*callback) (int, char **); } subcommands[] = { - { "echo", dbus_test_tool_echo }, - { "spam", dbus_test_tool_spam }, + { "black-hole", dbus_test_tool_black_hole }, + { "echo", dbus_test_tool_echo }, + { "spam", dbus_test_tool_spam }, { NULL, NULL } }; diff --git a/tools/test-tool.h b/tools/test-tool.h index b6d51c22..8143cd50 100644 --- a/tools/test-tool.h +++ b/tools/test-tool.h @@ -24,6 +24,7 @@ #ifndef DBUS_TEST_TOOL_H #define DBUS_TEST_TOOL_H +int dbus_test_tool_black_hole (int argc, char **argv); int dbus_test_tool_echo (int argc, char **argv); int dbus_test_tool_spam (int argc, char **argv); |