summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlban Crequy <alban.crequy@collabora.co.uk>2014-07-02 14:18:26 +0100
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2014-10-14 13:53:59 +0100
commit74b4f1d07a0f166cee38c2624e9afd462676b0e9 (patch)
tree5ac8c7636fbfd9e1d400d3c8fae9054c7aa1c9c8
parent75b35badb7574333376dcd8b2a1314ae697756aa (diff)
downloaddbus-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.c149
-rw-r--r--tools/test-tool.c5
-rw-r--r--tools/test-tool.h1
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);