From 306eab3e3d998472ad111146a12b7697ea96c9b9 Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Fri, 16 May 2003 20:09:25 +0000 Subject: 2003-05-16 Havoc Pennington * dbus/dbus-connection.c: disable verbose lock spew * tools/dbus-send.c: add --print-reply command line option * tools/dbus-print-message.h (print_message): new util function shared by dbus-send and dbus-monitor * tools/dbus-monitor.c (handler_func): exit on disconnect * dbus/dbus-transport-unix.c (do_reading): if the transport is disconnected, don't try to use the read_watch * dbus/dbus-watch.c (dbus_watch_get_enabled): assert watch != NULL so we can find this bug more easily --- ChangeLog | 17 ++++++++++ bus/bus.c | 6 +++- bus/system.conf.in | 2 ++ dbus/dbus-connection.c | 2 +- dbus/dbus-transport-unix.c | 10 ++++-- dbus/dbus-watch.c | 1 + doc/TODO | 5 +++ tools/Makefile.am | 6 +++- tools/dbus-monitor.c | 58 ++++---------------------------- tools/dbus-print-message.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++ tools/dbus-print-message.h | 31 +++++++++++++++++ tools/dbus-send.1 | 11 +++--- tools/dbus-send.c | 40 +++++++++++++++++++--- 13 files changed, 205 insertions(+), 67 deletions(-) create mode 100644 tools/dbus-print-message.c create mode 100644 tools/dbus-print-message.h diff --git a/ChangeLog b/ChangeLog index 8f9bfa02..496bdd26 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2003-05-16 Havoc Pennington + + * dbus/dbus-connection.c: disable verbose lock spew + + * tools/dbus-send.c: add --print-reply command line option + + * tools/dbus-print-message.h (print_message): new util function + shared by dbus-send and dbus-monitor + + * tools/dbus-monitor.c (handler_func): exit on disconnect + + * dbus/dbus-transport-unix.c (do_reading): if the transport is + disconnected, don't try to use the read_watch + + * dbus/dbus-watch.c (dbus_watch_get_enabled): assert watch != NULL + so we can find this bug more easily + 2003-05-16 Havoc Pennington * bus/policy.c (free_rule_list_func): avoid a crash when passed diff --git a/bus/bus.c b/bus/bus.c index 85d737da..e86243a6 100644 --- a/bus/bus.c +++ b/bus/bus.c @@ -970,6 +970,7 @@ bus_context_check_security_policy (BusContext *context, "had name \"%s\" destination \"%s\")", dbus_message_get_name (message), dest ? dest : DBUS_SERVICE_DBUS); + _dbus_verbose ("security policy disallowing message due to sender policy\n"); return FALSE; } @@ -986,6 +987,7 @@ bus_context_check_security_policy (BusContext *context, "had name \"%s\" destination \"%s\")", dbus_message_get_name (message), dest ? dest : DBUS_SERVICE_DBUS); + _dbus_verbose ("security policy disallowing message due to recipient policy\n"); return FALSE; } @@ -998,8 +1000,10 @@ bus_context_check_security_policy (BusContext *context, dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED, "The destination service \"%s\" has a full message queue", dest ? dest : DBUS_SERVICE_DBUS); + _dbus_verbose ("security policy disallowing message due to full message queue\n"); return FALSE; } - + + _dbus_verbose ("security policy allowing message\n"); return TRUE; } diff --git a/bus/system.conf.in b/bus/system.conf.in index 6fb764aa..cab68d3a 100644 --- a/bus/system.conf.in +++ b/bus/system.conf.in @@ -37,6 +37,8 @@ + diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c index 9da5fb52..d877a0b4 100644 --- a/dbus/dbus-connection.c +++ b/dbus/dbus-connection.c @@ -36,7 +36,7 @@ #include "dbus-protocol.h" #include "dbus-dataslot.h" -#if 1 +#if 0 #define CONNECTION_LOCK(connection) do { \ _dbus_verbose (" LOCK: %s\n", _DBUS_FUNCTION_NAME); \ dbus_mutex_lock ((connection)->mutex); \ diff --git a/dbus/dbus-transport-unix.c b/dbus/dbus-transport-unix.c index fbf334e4..5df1c461 100644 --- a/dbus/dbus-transport-unix.c +++ b/dbus/dbus-transport-unix.c @@ -593,11 +593,9 @@ do_reading (DBusTransport *transport) total = 0; again: - + /* See if we've exceeded max messages and need to disable reading */ check_read_watch (transport); - if (!dbus_watch_get_enabled (unix_transport->read_watch)) - return TRUE; if (total > unix_transport->max_bytes_read_per_iteration) { @@ -606,9 +604,15 @@ do_reading (DBusTransport *transport) goto out; } + _dbus_assert (unix_transport->read_watch != NULL || + transport->disconnected); + if (transport->disconnected) goto out; + if (!dbus_watch_get_enabled (unix_transport->read_watch)) + return TRUE; + if (_dbus_auth_needs_decoding (transport->auth)) { if (_dbus_string_get_length (&unix_transport->encoded_incoming) > 0) diff --git a/dbus/dbus-watch.c b/dbus/dbus-watch.c index 55b182b2..5b59e8c8 100644 --- a/dbus/dbus-watch.c +++ b/dbus/dbus-watch.c @@ -535,6 +535,7 @@ dbus_watch_set_data (DBusWatch *watch, dbus_bool_t dbus_watch_get_enabled (DBusWatch *watch) { + _dbus_assert (watch != NULL); return watch->enabled; } diff --git a/doc/TODO b/doc/TODO index b3231454..05bd25db 100644 --- a/doc/TODO +++ b/doc/TODO @@ -56,3 +56,8 @@ will only be right for one of them. Probably need to just write() the serial number, rather than putting it in the DBusMessage, or something. + - currently the security policy stuff for messages to/from + the bus driver is kind of strange; basically it's hardcoded that + you can always talk to the driver, but the default config file + has rules for it anyway, or something. it's conceptually + screwy at the moment. diff --git a/tools/Makefile.am b/tools/Makefile.am index 60b9ddab..53f4be01 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -9,10 +9,14 @@ endif bin_PROGRAMS=dbus-send $(GLIB_TOOLS) dbus-launch dbus_send_SOURCES= \ + dbus-print-message.c \ + dbus-print-message.h \ dbus-send.c dbus_monitor_SOURCES= \ - dbus-monitor.c + dbus-monitor.c \ + dbus-print-message.c \ + dbus-print-message.h dbus_launch_SOURCES= \ dbus-launch.c diff --git a/tools/dbus-monitor.c b/tools/dbus-monitor.c index 441ead38..465515ba 100644 --- a/tools/dbus-monitor.c +++ b/tools/dbus-monitor.c @@ -27,6 +27,7 @@ #include /* Don't copy this, for programs outside the dbus tree it's dbus/dbus-glib.h */ #include +#include "dbus-print-message.h" static DBusHandlerResult handler_func (DBusMessageHandler *handler, @@ -34,58 +35,11 @@ handler_func (DBusMessageHandler *handler, DBusMessage *message, void *user_data) { - DBusMessageIter iter; - - printf ("message name=%s; sender=%s\n", dbus_message_get_name (message), - dbus_message_get_sender (message)); - - dbus_message_iter_init (message, &iter); - - do - { - int type = dbus_message_iter_get_arg_type (&iter); - char *str; - dbus_uint32_t uint32; - dbus_int32_t int32; - double d; - unsigned char byte; - - if (type == DBUS_TYPE_INVALID) - break; - - switch (type) - { - case DBUS_TYPE_STRING: - str = dbus_message_iter_get_string (&iter); - printf ("string:%s\n", str); - break; - - case DBUS_TYPE_INT32: - int32 = dbus_message_iter_get_int32 (&iter); - printf ("int32:%d\n", int32); - break; - - case DBUS_TYPE_UINT32: - uint32 = dbus_message_iter_get_uint32 (&iter); - printf ("int32:%u\n", uint32); - break; - - case DBUS_TYPE_DOUBLE: - d = dbus_message_iter_get_double (&iter); - printf ("double:%f\n", d); - break; - - case DBUS_TYPE_BYTE: - byte = dbus_message_iter_get_byte (&iter); - printf ("byte:%d\n", byte); - break; - - default: - printf ("(unknown arg type %d)\n", type); - break; - } - } while (dbus_message_iter_next (&iter)); - + print_message (message); + + if (dbus_message_has_name (message, DBUS_MESSAGE_LOCAL_DISCONNECT)) + exit (0); + return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS; } diff --git a/tools/dbus-print-message.c b/tools/dbus-print-message.c new file mode 100644 index 00000000..fcf22b74 --- /dev/null +++ b/tools/dbus-print-message.c @@ -0,0 +1,83 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* dbus-print-message.h Utility function to print out a message + * + * Copyright (C) 2003 Philip Blundell + * Copyright (C) 2003 Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "dbus-print-message.h" + +void +print_message (DBusMessage *message) +{ + DBusMessageIter iter; + const char *sender; + + sender = dbus_message_get_sender (message); + + printf ("message name=%s; sender=%s\n", + dbus_message_get_name (message), + sender ? sender : "(no sender)"); + + dbus_message_iter_init (message, &iter); + + do + { + int type = dbus_message_iter_get_arg_type (&iter); + char *str; + dbus_uint32_t uint32; + dbus_int32_t int32; + double d; + unsigned char byte; + + if (type == DBUS_TYPE_INVALID) + break; + + switch (type) + { + case DBUS_TYPE_STRING: + str = dbus_message_iter_get_string (&iter); + printf ("string:%s\n", str); + break; + + case DBUS_TYPE_INT32: + int32 = dbus_message_iter_get_int32 (&iter); + printf ("int32:%d\n", int32); + break; + + case DBUS_TYPE_UINT32: + uint32 = dbus_message_iter_get_uint32 (&iter); + printf ("int32:%u\n", uint32); + break; + + case DBUS_TYPE_DOUBLE: + d = dbus_message_iter_get_double (&iter); + printf ("double:%f\n", d); + break; + + case DBUS_TYPE_BYTE: + byte = dbus_message_iter_get_byte (&iter); + printf ("byte:%d\n", byte); + break; + + default: + printf ("(unknown arg type %d)\n", type); + break; + } + } while (dbus_message_iter_next (&iter)); +} + diff --git a/tools/dbus-print-message.h b/tools/dbus-print-message.h new file mode 100644 index 00000000..c40e7667 --- /dev/null +++ b/tools/dbus-print-message.h @@ -0,0 +1,31 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* dbus-print-message.h Utility function to print out a message + * + * Copyright (C) 2003 Philip Blundell + * Copyright (C) 2003 Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef DBUS_PRINT_MESSAGE_H +#define DBUS_PRINT_MESSAGE_H + +#include +#include +#include + +void print_message (DBusMessage *message); + +#endif /* DBUS_PRINT_MESSAGE_H */ diff --git a/tools/dbus-send.1 b/tools/dbus-send.1 index 76358132..6f125c35 100644 --- a/tools/dbus-send.1 +++ b/tools/dbus-send.1 @@ -8,7 +8,7 @@ dbus-send \- Send a message to a message bus .SH SYNOPSIS .PP .B dbus-send -[\-\-session] [\-\-dest=SERVICE] [contents ...] +[\-\-session] [\-\-dest=SERVICE] [\-\-print-reply] [contents ...] .SH DESCRIPTION @@ -50,11 +50,14 @@ Here is an example invocation: .SH OPTIONS The following options are supported: .TP -.I "--session" -Use the per-login-session message bus instead of the systemwide bus. -.TP .I "--dest=SERVICE" Specify the service to receive the message. +.TP +.I "--print-reply" +Block for a reply to the message sent, and print any reply received. +.TP +.I "--session" +Use the per-login-session message bus instead of the systemwide bus. .SH AUTHOR dbus-send was written by Philip Blundell. diff --git a/tools/dbus-send.c b/tools/dbus-send.c index a105f8b4..ea00a836 100644 --- a/tools/dbus-send.c +++ b/tools/dbus-send.c @@ -25,10 +25,12 @@ #include +#include "dbus-print-message.h" + static void usage (char *name) { - fprintf (stderr, "Usage: %s [--session] [--dest=SERVICE] [contents ...]\n", name); + fprintf (stderr, "Usage: %s [--session] [--dest=SERVICE] [--print-reply] [contents ...]\n", name); exit (1); } @@ -38,6 +40,7 @@ main (int argc, char *argv[]) DBusConnection *connection; DBusError error; DBusMessage *message; + int print_reply; DBusMessageIter iter; int i; DBusBusType type = DBUS_BUS_SYSTEM; @@ -47,12 +50,16 @@ main (int argc, char *argv[]) if (argc < 2) usage (argv[0]); + print_reply = FALSE; + for (i = 1; i < argc && name == NULL; i++) { char *arg = argv[i]; - if (!strcmp (arg, "--session")) + if (strcmp (arg, "--session") == 0) type = DBUS_BUS_SESSION; + else if (strcmp (arg, "--print-reply") == 0) + print_reply = TRUE; else if (strstr (arg, "--dest=") == arg) dest = strchr (arg, '=') + 1; else if (arg[0] == '-') @@ -156,9 +163,32 @@ main (int argc, char *argv[]) } } - dbus_connection_send (connection, message, NULL); - - dbus_connection_flush (connection); + if (print_reply) + { + DBusMessage *reply; + + dbus_error_init (&error); + reply = dbus_connection_send_with_reply_and_block (connection, + message, -1, + &error); + if (dbus_error_is_set (&error)) + { + fprintf (stderr, "Error: %s\n", + error.message); + exit (1); + } + + if (reply) + { + print_message (reply); + dbus_message_unref (reply); + } + } + else + { + dbus_connection_send (connection, message, NULL); + dbus_connection_flush (connection); + } dbus_message_unref (message); -- cgit v1.2.1