diff options
-rw-r--r-- | ChangeLog | 34 | ||||
-rw-r--r-- | bus/connection.c | 11 | ||||
-rw-r--r-- | dbus/dbus-marshal.c | 2 | ||||
-rw-r--r-- | dbus/dbus-message.c | 9 | ||||
-rw-r--r-- | dbus/dbus-pending-call.c | 2 | ||||
-rw-r--r-- | doc/TODO | 4 | ||||
-rw-r--r-- | glib/dbus-gmain.c | 2 | ||||
-rw-r--r-- | glib/dbus-gproxy.c | 17 | ||||
-rw-r--r-- | test/glib/Makefile.am | 12 | ||||
-rw-r--r-- | test/glib/test-dbus-glib.c | 76 | ||||
-rw-r--r-- | tools/dbus-launch.1 | 38 | ||||
-rw-r--r-- | tools/dbus-launch.c | 35 |
12 files changed, 189 insertions, 53 deletions
@@ -1,3 +1,37 @@ +2003-10-12 Havoc Pennington <hp@pobox.com> + + Added test code that 1) starts an actual bus daemon and 2) uses + DBusGProxy; fixed bugs that were revealed by the test. Lots + more testing possible, but this is the basic framework. + + * glib/dbus-gproxy.c (dbus_gproxy_manager_unregister): remove + empty proxy lists from the proxy list hash + + * dbus/dbus-message.c (dbus_message_iter_get_args_valist): add a + couple of return_if_fail checks + + * dbus/dbus-pending-call.c (_dbus_pending_call_new): use dbus_new0 + to allocate, so everything is cleared to NULL as it should be. + + * glib/dbus-gmain.c (dbus_connection_setup_with_g_main): pass + source as data to dbus_connection_set_timeout_functions() as the + timeout functions expected + + * test/glib/run-test.sh: add a little script to start up a message + bus and run tests using it + + * tools/dbus-launch.1: updates + + * tools/dbus-launch.c (main): add --config-file option + + * tools/dbus-launch.c (main): remove confusing else if (runprog) + that could never be reached. + + * dbus/dbus-message.c (dbus_message_new_method_return) + (dbus_message_new_error, dbus_message_new_signal): set the + no-reply-expected flag on all these. Redundant, but may + as well be consistent. + 2003-10-11 Havoc Pennington <hp@pobox.com> * test/decode-gcov.c (function_solve_graph): make broken block diff --git a/bus/connection.c b/bus/connection.c index 68e4158a..6a4b55d6 100644 --- a/bus/connection.c +++ b/bus/connection.c @@ -33,6 +33,17 @@ static void bus_connection_remove_transactions (DBusConnection *connection); +typedef struct +{ + BusExpireItem expire_item; + + DBusConnection *will_get_reply; + DBusConnection *will_send_reply; + + dbus_uint32_t reply_serial; + +} BusPendingReply; + struct BusConnections { int refcount; diff --git a/dbus/dbus-marshal.c b/dbus/dbus-marshal.c index 1e4992ad..ecc1e1ae 100644 --- a/dbus/dbus-marshal.c +++ b/dbus/dbus-marshal.c @@ -1400,7 +1400,7 @@ _dbus_demarshal_double_array (const DBusString *str, * @param pos the position in the string * @param new_pos the new position of the string * @param array the array - * @param array_len length of the demarshaled data + * @param array_len location for length of the demarshaled data or NULL * @returns #TRUE on success */ dbus_bool_t diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c index e23e56e1..45309766 100644 --- a/dbus/dbus-message.c +++ b/dbus/dbus-message.c @@ -1224,6 +1224,8 @@ dbus_message_new_method_return (DBusMessage *method_call) return NULL; } + dbus_message_set_no_reply (message, TRUE); + if (!dbus_message_set_reply_serial (message, dbus_message_get_serial (method_call))) { @@ -1268,6 +1270,8 @@ dbus_message_new_signal (const char *path, dbus_message_unref (message); return NULL; } + + dbus_message_set_no_reply (message, TRUE); return message; } @@ -1313,6 +1317,8 @@ dbus_message_new_error (DBusMessage *reply_to, return NULL; } + dbus_message_set_no_reply (message, TRUE); + if (!dbus_message_set_reply_serial (message, dbus_message_get_serial (reply_to))) { @@ -2207,6 +2213,9 @@ dbus_message_iter_get_args_valist (DBusMessageIter *iter, data = va_arg (var_args, void *); len = va_arg (var_args, int *); + _dbus_return_val_if_fail (data != NULL, FALSE); + _dbus_return_val_if_fail (len != NULL, FALSE); + if (dbus_message_iter_get_array_type (iter) != type) { dbus_set_error (error, DBUS_ERROR_INVALID_ARGS, diff --git a/dbus/dbus-pending-call.c b/dbus/dbus-pending-call.c index dad444e3..e0d8e3ee 100644 --- a/dbus/dbus-pending-call.c +++ b/dbus/dbus-pending-call.c @@ -64,7 +64,7 @@ _dbus_pending_call_new (DBusConnection *connection, if (!dbus_pending_call_allocate_data_slot (¬ify_user_data_slot)) return NULL; - pending = dbus_new (DBusPendingCall, 1); + pending = dbus_new0 (DBusPendingCall, 1); if (pending == NULL) { @@ -107,3 +107,7 @@ - dbus_message_iter_init_array_iterator has "iter" and "iterator" in the same function name + + - the GLib bindings varargs take DBUS_TYPE_WHATEVER and + return stuff allocated with dbus_malloc(); should this + be made more "G" at some expense in code duplication? diff --git a/glib/dbus-gmain.c b/glib/dbus-gmain.c index 7c845d5b..6f0737bf 100644 --- a/glib/dbus-gmain.c +++ b/glib/dbus-gmain.c @@ -492,7 +492,7 @@ dbus_connection_setup_with_g_main (DBusConnection *connection, add_timeout, remove_timeout, timeout_toggled, - NULL, NULL)) + source, NULL)) goto nomem; dbus_connection_set_wakeup_main_function (connection, diff --git a/glib/dbus-gproxy.c b/glib/dbus-gproxy.c index 13b4248c..f5e59186 100644 --- a/glib/dbus-gproxy.c +++ b/glib/dbus-gproxy.c @@ -460,7 +460,7 @@ dbus_gproxy_manager_unregister (DBusGProxyManager *manager, #ifndef G_DISABLE_CHECKS if (manager->proxy_lists == NULL) { - g_warning ("Trying to disconnect a signal on a proxy but none are connected\n"); + g_warning ("Trying to unregister a proxy but there aren't any registered"); return; } #endif @@ -468,13 +468,11 @@ dbus_gproxy_manager_unregister (DBusGProxyManager *manager, tri = tristring_from_proxy (proxy); list = g_hash_table_lookup (manager->proxy_lists, tri); - - g_free (tri); #ifndef G_DISABLE_CHECKS if (list == NULL) { - g_warning ("Trying to disconnect a signal on a proxy but none are connected\n"); + g_warning ("Trying to unregister a proxy but it isn't registered"); return; } #endif @@ -485,12 +483,21 @@ dbus_gproxy_manager_unregister (DBusGProxyManager *manager, g_assert (g_slist_find (list->proxies, proxy) == NULL); + if (list->proxies == NULL) + { + g_hash_table_remove (manager->proxy_lists, + tri); + list = NULL; + } + if (g_hash_table_size (manager->proxy_lists) == 0) { g_hash_table_destroy (manager->proxy_lists); manager->proxy_lists = NULL; } - + + g_free (tri); + UNLOCK_MANAGER (manager); } diff --git a/test/glib/Makefile.am b/test/glib/Makefile.am index 9f900b13..608e7d01 100644 --- a/test/glib/Makefile.am +++ b/test/glib/Makefile.am @@ -1,5 +1,17 @@ INCLUDES=-I$(top_srcdir) $(DBUS_CLIENT_CFLAGS) $(DBUS_GLIB_CFLAGS) -I$(top_srcdir)/glib +## note that TESTS has special meaning (stuff to use in make check) +## so if adding tests not to be run in make check, don't add them to +## TESTS +if DBUS_BUILD_TESTS +TESTS_ENVIRONMENT=DBUS_TOP_BUILDDIR=$(top_builddir) DBUS_TEST_HOMEDIR=$(top_builddir)/dbus +TESTS=run-test.sh +else +TESTS= +endif + +EXTRA_DIST=run-test.sh + if DBUS_BUILD_TESTS if HAVE_GLIB_THREADS diff --git a/test/glib/test-dbus-glib.c b/test/glib/test-dbus-glib.c index beda0a7a..c302b239 100644 --- a/test/glib/test-dbus-glib.c +++ b/test/glib/test-dbus-glib.c @@ -1,52 +1,74 @@ /* -*- mode: C; c-file-style: "gnu" -*- */ #include "dbus-glib.h" #include <stdio.h> +#include <stdlib.h> +#include <string.h> int main (int argc, char **argv) { DBusConnection *connection; - DBusMessage *message, *reply; GMainLoop *loop; - DBusError error; - - if (argc < 2) - { - g_printerr ("Give the server address as an argument\n"); - return 1; - } + GError *error; + DBusGProxy *driver; + DBusPendingCall *call; + char **service_list; + int service_list_len; + int i; + g_type_init (); + loop = g_main_loop_new (NULL, FALSE); - dbus_error_init (&error); - connection = dbus_connection_open (argv[1], &error); + error = NULL; + connection = dbus_bus_get_with_g_main (DBUS_BUS_SESSION, + &error); if (connection == NULL) { - g_printerr ("Failed to open connection to %s: %s\n", argv[1], - error.message); - dbus_error_free (&error); - return 1; + g_printerr ("Failed to open connection to bus: %s\n", + error->message); + g_error_free (error); + exit (1); } - dbus_connection_setup_with_g_main (connection, NULL); + /* Create a proxy object for the "bus driver" */ + + driver = dbus_gproxy_new_for_service (connection, + DBUS_SERVICE_ORG_FREEDESKTOP_DBUS, + DBUS_PATH_ORG_FREEDESKTOP_DBUS, + DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS); + + /* Call ListServices method */ + + call = dbus_gproxy_begin_call (driver, "ListServices", DBUS_TYPE_INVALID); - message = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS, - DBUS_PATH_ORG_FREEDESKTOP_DBUS, - DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS, - "Hello"); + error = NULL; + if (!dbus_gproxy_end_call (driver, call, &error, + DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, + &service_list, &service_list_len, + DBUS_TYPE_INVALID)) + { + g_printerr ("Failed to complete ListServices call: %s\n", + error->message); + g_error_free (error); + exit (1); + } - dbus_error_init (&error); - reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error); - if (reply == NULL) + g_print ("Services on the message bus:\n"); + i = 0; + while (i < service_list_len) { - g_printerr ("Error on hello message: %s\n", error.message); - dbus_error_free (&error); - return 1; + g_assert (service_list[i] != NULL); + g_print (" %s\n", service_list[i]); + ++i; } + g_assert (service_list[i] == NULL); - g_print ("reply received\n"); + dbus_free_string_array (service_list); + + g_object_unref (G_OBJECT (driver)); - g_main_loop_run (loop); + g_print ("Successfully completed %s\n", argv[0]); return 0; } diff --git a/tools/dbus-launch.1 b/tools/dbus-launch.1 index 95708c77..771dcb2c 100644 --- a/tools/dbus-launch.1 +++ b/tools/dbus-launch.1 @@ -7,7 +7,7 @@ dbus-launch \- Utility to start a message bus from a shell script .SH SYNOPSIS .PP -.B dbus-launch [\-\-version] [\-\-sh-syntax] [\-\-csh-syntax] [\-\-auto-syntax] [\-\-exit-with-session] [PROGRAM] [ARGS...] +.B dbus-launch [\-\-version] [\-\-sh-syntax] [\-\-csh-syntax] [\-\-auto-syntax] [\-\-exit-with-session] [\-\-config-file=FILENAME] [PROGRAM] [ARGS...] .SH DESCRIPTION @@ -25,15 +25,18 @@ will then set the appropriate environment variables and execute the specified program, with the specified arguments. See below for examples. -Finally, you may use the \-\-auto-syntax command to cause -\fIdbus-launch\fP to emit shell code to set up the environment. This -is useful in shell scripts. With this option, \fIdbus-launch\fP looks -at the value of the SHELL environment variable to determine which -shell syntax should be used. If SHELL ends in "csh", then -csh-compatible code is emitted; otherwise Bourne shell code is -emitted. Instead of passing \-\-auto-syntax, you may explicity -specify a particular one by using \-\-sh-syntax for Bourne syntax, or -\-\-csh-syntax for csh syntax. +Finally, you may use the \-\-sh-syntax, \-\-csh-syntax, or +\-\-auto-syntax commands to cause \fIdbus-launch\fP to emit shell code +to set up the environment. This is useful in shell scripts. + +With the \-\-auto-syntax option, \fIdbus-launch\fP looks at the value +of the SHELL environment variable to determine which shell syntax +should be used. If SHELL ends in "csh", then csh-compatible code is +emitted; otherwise Bourne shell code is emitted. Instead of passing +\-\-auto-syntax, you may explicity specify a particular one by using +\-\-sh-syntax for Bourne syntax, or \-\-csh-syntax for csh syntax. +In scripts, it's more robust to avoid \-\-auto-syntax and you hopefully +know which shell your script is written in. .PP See http://www.freedesktop.org/software/dbus/ for more information @@ -47,7 +50,7 @@ sh-compatible shell to start the per-session bus daemon: ## test for an existing bus daemon, just to be safe if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then ## if not found, launch a new one - eval `dbus-launch --auto-syntax --exit-with-session` + eval `dbus-launch --sh-syntax --exit-with-session` echo "D-BUS per-session daemon address is: $DBUS_SESSION_BUS_ADDRESS" fi @@ -62,17 +65,22 @@ program, like so: dbus-launch gnome-session .fi -The above would likely be appropriate for ~/.xsession. +The above would likely be appropriate for ~/.xsession or ~/.Xclients. .SH OPTIONS The following options are supported: .TP .I "--auto-syntax" -Attempt to detect the shell in use, and emit compatible code. +Choose \-\-csh-syntax or \-\-sh-syntax based on the SHELL environment variable. + +.TP +.I "--config-file=FILENAME" +Pass \-\-config-file=FILENAME to the bus daemon, instead of passing it +the \-\-session argument. See the man page for dbus-daemon-1 .TP .I "--csh-syntax" -Emit csh compatible code. +Emit csh compatible code to set up environment variables. .TP .I "--exit-with-session" @@ -83,7 +91,7 @@ it kills the message bus daemon. .TP .I "--sh-syntax" -Emit Bourne-shell compatible code. +Emit Bourne-shell compatible code to set up environment variables. .TP .I "--version" diff --git a/tools/dbus-launch.c b/tools/dbus-launch.c index 3b429013..dc9dad45 100644 --- a/tools/dbus-launch.c +++ b/tools/dbus-launch.c @@ -593,8 +593,10 @@ main (int argc, char **argv) int bus_pid_to_launcher_pipe[2]; int bus_pid_to_babysitter_pipe[2]; int bus_address_to_launcher_pipe[2]; + char *config_file; exit_with_session = FALSE; + config_file = NULL; prev_arg = NULL; i = 1; @@ -618,8 +620,34 @@ main (int argc, char **argv) version (); else if (strcmp (arg, "--exit-with-session") == 0) exit_with_session = TRUE; - else if (runprog) - usage (1); + else if (strstr (arg, "--config-file=") == arg) + { + const char *file; + + if (config_file != NULL) + { + fprintf (stderr, "--config-file given twice\n"); + exit (1); + } + + file = strchr (arg, '='); + ++file; + + config_file = xstrdup (file); + } + else if (prev_arg && + strcmp (prev_arg, "--config-file") == 0) + { + if (config_file != NULL) + { + fprintf (stderr, "--config-file given twice\n"); + exit (1); + } + + config_file = xstrdup (arg); + } + else if (strcmp (arg, "--config-file") == 0) + ; /* wait for next arg */ else { runprog = arg; @@ -736,9 +764,10 @@ main (int argc, char **argv) execlp ("dbus-daemon-1", "dbus-daemon-1", "--fork", - "--session", "--print-pid", write_pid_fd_as_string, "--print-address", write_address_fd_as_string, + config_file ? "--config-file" : "--session", + config_file, /* has to be last in this varargs list */ NULL); fprintf (stderr, |