mirror of
https://gitlab.freedesktop.org/dbus/dbus.git
synced 2026-05-05 07:38:20 +02:00
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:
parent
ce53bbd7af
commit
306eab3e3d
13 changed files with 204 additions and 66 deletions
17
ChangeLog
17
ChangeLog
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
5
doc/TODO
5
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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
83
tools/dbus-print-message.c
Normal file
83
tools/dbus-print-message.c
Normal 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));
|
||||
}
|
||||
|
||||
31
tools/dbus-print-message.h
Normal file
31
tools/dbus-print-message.h
Normal 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 */
|
||||
|
|
@ -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);
|
||||
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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue