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
This commit is contained in:
Havoc Pennington 2003-05-16 20:09:25 +00:00
parent ce53bbd7af
commit 306eab3e3d
13 changed files with 204 additions and 66 deletions

View file

@ -1,3 +1,20 @@
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

View file

@ -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;
}

View 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>

View 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); \

View 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)

View 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;
}

View file

@ -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.

View 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

View 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;
}

View file

@ -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));
}

View file

@ -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 */

View 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.

View file

@ -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);
if (print_reply)
{
DBusMessage *reply;
dbus_connection_flush (connection);
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);