summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2003-05-16 20:09:25 +0000
committerHavoc Pennington <hp@redhat.com>2003-05-16 20:09:25 +0000
commit306eab3e3d998472ad111146a12b7697ea96c9b9 (patch)
tree613b5918113060fb66b7122307d8a6d2c2c2344f
parentce53bbd7af4488b8374aeccc2e80fb2f7eff0683 (diff)
2003-05-16 Havoc Pennington <hp@redhat.com>
* 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
-rw-r--r--ChangeLog17
-rw-r--r--bus/bus.c6
-rw-r--r--bus/system.conf.in2
-rw-r--r--dbus/dbus-connection.c2
-rw-r--r--dbus/dbus-transport-unix.c10
-rw-r--r--dbus/dbus-watch.c1
-rw-r--r--doc/TODO5
-rw-r--r--tools/Makefile.am6
-rw-r--r--tools/dbus-monitor.c58
-rw-r--r--tools/dbus-print-message.c83
-rw-r--r--tools/dbus-print-message.h31
-rw-r--r--tools/dbus-send.111
-rw-r--r--tools/dbus-send.c40
13 files changed, 205 insertions, 67 deletions
diff --git a/ChangeLog b/ChangeLog
index 8f9bfa02..496bdd26 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,22 @@
2003-05-16 Havoc Pennington <hp@redhat.com>
+ * 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 <hp@redhat.com>
+
* bus/policy.c (free_rule_list_func): avoid a crash when passed
NULL as DBusHashTable is annoyingly likely to do.
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 @@
<!-- But allow all users to connect -->
<allow user="*"/>
<!-- Allow anyone to talk to the message bus -->
+ <!-- FIXME I think currently these allow rules are always implicit
+ even if they aren't in here -->
<allow send_to="org.freedesktop.DBus"/>
<allow receive_from="org.freedesktop.DBus"/>
</policy>
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 <dbus/dbus.h>
/* Don't copy this, for programs outside the dbus tree it's dbus/dbus-glib.h */
#include <glib/dbus-glib.h>
+#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 <philb@gnu.org>
+ * 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 <philb@gnu.org>
+ * 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 <stdio.h>
+#include <string.h>
+#include <dbus/dbus.h>
+
+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] <message name> [contents ...]
+[\-\-session] [\-\-dest=SERVICE] [\-\-print-reply] <message name> [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 <dbus/dbus.h>
+#include "dbus-print-message.h"
+
static void
usage (char *name)
{
- fprintf (stderr, "Usage: %s [--session] [--dest=SERVICE] <message type> [contents ...]\n", name);
+ fprintf (stderr, "Usage: %s [--session] [--dest=SERVICE] [--print-reply] <message type> [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);