From ce2b1c69ba4f49757298333e26d0428686a1c85f Mon Sep 17 00:00:00 2001 From: Alban Crequy Date: Wed, 2 Jul 2014 14:18:26 +0100 Subject: [PATCH 3/3] dbus-test-tool: add black-hole mode https://bugs.freedesktop.org/show_bug.cgi?id=34140 --- tools/dbus-echo.c | 149 +++++++++++++++++++++++++++++++++++++++++++----------- tools/test-tool.c | 5 +- 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 05af601..72973cd 100644 --- a/tools/dbus-echo.c +++ b/tools/dbus-echo.c @@ -26,14 +26,19 @@ #include #include #include +#include #include #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 1893b78..149c10a 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 b6d51c2..8143cd5 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); -- 1.8.5.3