From 306eab3e3d998472ad111146a12b7697ea96c9b9 Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Fri, 16 May 2003 20:09:25 +0000 Subject: 2003-05-16 Havoc Pennington * 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 --- tools/Makefile.am | 6 +++- tools/dbus-monitor.c | 58 ++++---------------------------- tools/dbus-print-message.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++ tools/dbus-print-message.h | 31 +++++++++++++++++ tools/dbus-send.1 | 11 +++--- tools/dbus-send.c | 40 +++++++++++++++++++--- 6 files changed, 167 insertions(+), 62 deletions(-) create mode 100644 tools/dbus-print-message.c create mode 100644 tools/dbus-print-message.h (limited to 'tools') 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 /* Don't copy this, for programs outside the dbus tree it's dbus/dbus-glib.h */ #include +#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 + * 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 + * 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 +#include +#include + +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] [contents ...] +[\-\-session] [\-\-dest=SERVICE] [\-\-print-reply] [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 +#include "dbus-print-message.h" + static void usage (char *name) { - fprintf (stderr, "Usage: %s [--session] [--dest=SERVICE] [contents ...]\n", name); + fprintf (stderr, "Usage: %s [--session] [--dest=SERVICE] [--print-reply] [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); -- cgit