2003-05-16 Havoc Pennington <hp@redhat.com>
authorHavoc Pennington <hp@redhat.com>
Fri, 16 May 2003 20:09:25 +0000 (20:09 +0000)
committerHavoc Pennington <hp@redhat.com>
Fri, 16 May 2003 20:09:25 +0000 (20:09 +0000)
* 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

13 files changed:
ChangeLog
bus/bus.c
bus/system.conf.in
dbus/dbus-connection.c
dbus/dbus-transport-unix.c
dbus/dbus-watch.c
doc/TODO
tools/Makefile.am
tools/dbus-monitor.c
tools/dbus-print-message.c [new file with mode: 0644]
tools/dbus-print-message.h [new file with mode: 0644]
tools/dbus-send.1
tools/dbus-send.c

index 8f9bfa0..496bdd2 100644 (file)
--- 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.
 
index 85d737d..e86243a 100644 (file)
--- 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;
 }
index 6fb764a..cab68d3 100644 (file)
@@ -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>
index 9da5fb5..d877a0b 100644 (file)
@@ -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);                      \
index fbf334e..5df1c46 100644 (file)
@@ -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)
index 55b182b..5b59e8c 100644 (file)
@@ -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;
 }
 
index b323145..05bd25d 100644 (file)
--- 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.
index 60b9dda..53f4be0 100644 (file)
@@ -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
index 441ead3..465515b 100644 (file)
@@ -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 (file)
index 0000000..fcf22b7
--- /dev/null
@@ -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 (file)
index 0000000..c40e766
--- /dev/null
@@ -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 */
index 7635813..6f125c3 100644 (file)
@@ -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.
index a105f8b..ea00a83 100644 (file)
 
 #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);