Commit 306eab3e authored by Havoc Pennington's avatar Havoc Pennington

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
parent ce53bbd7
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
......
......@@ -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;
}
......@@ -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>
......
......@@ -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); \
......
......@@ -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)
......
......@@ -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;
}
......
......@@ -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.
......@@ -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
......
......@@ -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;
}
......
/* -*- 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));
}
/* -*- 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 */
......@@ -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.
......
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment