From 9642bac4b85de24ce62c53ad6a8e2ab4b2dd31ba Mon Sep 17 00:00:00 2001 From: Trent Lloyd Date: Fri, 19 Aug 2005 12:45:14 +0000 Subject: * Improve and reorganise DBus error handling, see avahi-common/dbus.h git-svn-id: file:///home/lennart/svn/public/avahi/trunk@354 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe --- avahi-client/client.c | 5 ++- avahi-common/Makefile.am | 6 +++- avahi-common/dbus.c | 84 ++++++++++++++++++++++++++++++++++++++++++++ avahi-common/dbus.h | 8 +++++ avahi-daemon/dbus-protocol.c | 33 ++--------------- doxygen.cfg | 2 +- 6 files changed, 102 insertions(+), 36 deletions(-) create mode 100644 avahi-common/dbus.c diff --git a/avahi-client/client.c b/avahi-client/client.c index 90a816f..1159152 100644 --- a/avahi-client/client.c +++ b/avahi-client/client.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -137,9 +138,7 @@ out: static int translate_dbus_error(const DBusError *error) { assert(error); - /*** FIXME! Some more eloquent error translation should happen here */ - - return AVAHI_ERR_DBUS_ERROR; + return avahi_error_dbus_to_number (error->name); } static int get_server_state(AvahiClient *client, int *ret_error) { diff --git a/avahi-common/Makefile.am b/avahi-common/Makefile.am index 627dcf9..1ea7ba4 100644 --- a/avahi-common/Makefile.am +++ b/avahi-common/Makefile.am @@ -22,6 +22,9 @@ AM_CFLAGS=-I$(top_srcdir) # This cool debug trap works on i386/gcc only AM_CFLAGS+='-DDEBUG_TRAP=__asm__("int $$3")' +# Need some DBUS defines for dbus.h +AM_CFLAGS+=$(DBUS_CFLAGS) + avahi_commonincludedir=$(includedir)/avahi-common avahi_commoninclude_HEADERS = \ @@ -60,7 +63,8 @@ libavahi_common_la_SOURCES = \ domain.c domain.h \ timeval.c timeval.h \ simple-watch.c simple-watch.h \ - watch.h gccmacro.h + watch.h gccmacro.h \ + dbus.c dbus.h libavahi_common_la_CFLAGS = $(AM_CFLAGS) libavahi_common_la_LDFLAGS = $(AM_LDFLAGS) -export-dynamic -version-info 0:0:0 diff --git a/avahi-common/dbus.c b/avahi-common/dbus.c new file mode 100644 index 0000000..93bd8cd --- /dev/null +++ b/avahi-common/dbus.c @@ -0,0 +1,84 @@ +/* $Id$ */ + +/*** + This file is part of avahi. + + avahi is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + avahi 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 Lesser General + Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with avahi; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include + +static const char * const table[- AVAHI_ERR_MAX] = { + NULL, /* OK */ + AVAHI_DBUS_ERR_FAILURE, + AVAHI_DBUS_ERR_BAD_STATE, + AVAHI_DBUS_ERR_INVALID_HOST_NAME, + AVAHI_DBUS_ERR_INVALID_DOMAIN_NAME, + AVAHI_DBUS_ERR_NO_NETWORK, + AVAHI_DBUS_ERR_INVALID_TTL, + AVAHI_DBUS_ERR_IS_PATTERN, + AVAHI_DBUS_ERR_LOCAL_COLLISION, + AVAHI_DBUS_ERR_INVALID_RECORD, + AVAHI_DBUS_ERR_INVALID_SERVICE_NAME, + AVAHI_DBUS_ERR_INVALID_SERVICE_TYPE, + AVAHI_DBUS_ERR_INVALID_PORT, + AVAHI_DBUS_ERR_INVALID_KEY, + AVAHI_DBUS_ERR_INVALID_ADDRESS, + AVAHI_DBUS_ERR_TIMEOUT, + AVAHI_DBUS_ERR_TOO_MANY_CLIENTS, + AVAHI_DBUS_ERR_TOO_MANY_OBJECTS, + AVAHI_DBUS_ERR_TOO_MANY_ENTRIES, + AVAHI_DBUS_ERR_OS, + AVAHI_DBUS_ERR_ACCESS_DENIED, + AVAHI_DBUS_ERR_INVALID_OPERATION, + AVAHI_DBUS_ERR_DBUS_ERROR, + AVAHI_DBUS_ERR_NOT_CONNECTED, + AVAHI_DBUS_ERR_NO_MEMORY, + AVAHI_DBUS_ERR_INVALID_OBJECT, + AVAHI_DBUS_ERR_NO_DAEMON + }; + +int +avahi_error_dbus_to_number (const char *s) +{ + int e; + + assert (s == NULL); + + for (e = 0; e > AVAHI_ERR_MAX; e--) + if (strcmp (s, table[-e]) == 0) + return e; + + return AVAHI_ERR_DBUS_ERROR; +} + +const char * +avahi_error_number_to_dbus (int error) +{ + assert(error > AVAHI_ERR_MAX); + assert(error < 1); + + return table[-error]; +} diff --git a/avahi-common/dbus.h b/avahi-common/dbus.h index 3b27421..0164bdb 100644 --- a/avahi-common/dbus.h +++ b/avahi-common/dbus.h @@ -25,6 +25,7 @@ /** \file dbus.h Some definitions for the DBUS interface */ #include +#include AVAHI_C_DECL_BEGIN @@ -63,6 +64,13 @@ AVAHI_C_DECL_BEGIN #define AVAHI_DBUS_ERR_INVALID_OBJECT "org.freedesktop.Avahi.InvalidObjectError" #define AVAHI_DBUS_ERR_NO_DAEMON "org.freedesktop.Avahi.NoDaemonError" + +/** Convert a DBus error string into an Avahi error number */ +int avahi_error_dbus_to_number (const char *s); + +/** Convert an Avahi error number into a DBus error string. Result should not be freed */ +const char * avahi_error_number_to_dbus (int error); + AVAHI_C_DECL_END #endif diff --git a/avahi-daemon/dbus-protocol.c b/avahi-daemon/dbus-protocol.c index 4816a6c..b28b09f 100644 --- a/avahi-daemon/dbus-protocol.c +++ b/avahi-daemon/dbus-protocol.c @@ -36,6 +36,7 @@ #include +#include #include #include #include @@ -328,40 +329,10 @@ static Client *client_get(const char *name, int create) { static DBusHandlerResult respond_error(DBusConnection *c, DBusMessage *m, int error, const char *text) { DBusMessage *reply; - const char * const table[- AVAHI_ERR_MAX] = { - NULL, /* OK */ - AVAHI_DBUS_ERR_FAILURE, - AVAHI_DBUS_ERR_BAD_STATE, - AVAHI_DBUS_ERR_INVALID_HOST_NAME, - AVAHI_DBUS_ERR_INVALID_DOMAIN_NAME, - AVAHI_DBUS_ERR_NO_NETWORK, - AVAHI_DBUS_ERR_INVALID_TTL, - AVAHI_DBUS_ERR_IS_PATTERN, - AVAHI_DBUS_ERR_LOCAL_COLLISION, - AVAHI_DBUS_ERR_INVALID_RECORD, - AVAHI_DBUS_ERR_INVALID_SERVICE_NAME, - AVAHI_DBUS_ERR_INVALID_SERVICE_TYPE, - AVAHI_DBUS_ERR_INVALID_PORT, - AVAHI_DBUS_ERR_INVALID_KEY, - AVAHI_DBUS_ERR_INVALID_ADDRESS, - AVAHI_DBUS_ERR_TIMEOUT, - AVAHI_DBUS_ERR_TOO_MANY_CLIENTS, - AVAHI_DBUS_ERR_TOO_MANY_OBJECTS, - AVAHI_DBUS_ERR_TOO_MANY_ENTRIES, - AVAHI_DBUS_ERR_OS, - AVAHI_DBUS_ERR_ACCESS_DENIED, - AVAHI_DBUS_ERR_INVALID_OPERATION, - AVAHI_DBUS_ERR_DBUS_ERROR, - AVAHI_DBUS_ERR_NOT_CONNECTED, - AVAHI_DBUS_ERR_NO_MEMORY, - AVAHI_DBUS_ERR_INVALID_OBJECT, - AVAHI_DBUS_ERR_NO_DAEMON - }; - assert(-error > -AVAHI_OK); assert(-error < -AVAHI_ERR_MAX); - reply = dbus_message_new_error(m, table[-error], text ? text : avahi_strerror(error)); + reply = dbus_message_new_error(m, avahi_error_number_to_dbus (error), text ? text : avahi_strerror(error)); dbus_connection_send(c, reply, NULL); dbus_message_unref(reply); diff --git a/doxygen.cfg b/doxygen.cfg index 7ccecb0..d79c9a0 100644 --- a/doxygen.cfg +++ b/doxygen.cfg @@ -67,7 +67,7 @@ WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- -INPUT = $(SRCDIR)/avahi-common/cdecl.h $(SRCDIR)/avahi-core/core.h $(SRCDIR)/avahi-common/address.h $(SRCDIR)/avahi-core/rr.h $(SRCDIR)/avahi-common/strlst.h $(SRCDIR)/avahi-common/alternative.h $(SRCDIR)/avahi-core/log.h $(SRCDIR)/avahi-common/defs.h $(SRCDIR)/avahi-client/client.h $(SRCDIR)/avahi-common/error.h $(SRCDIR)/avahi-common/malloc.h $(SRCDIR)/avahi-common/domain.h $(SRCDIR)/avahi-common/gccmacro.h $(SRCDIR)/avahi-common/watch.h $(SRCDIR)/avahi-common/simple-watch.h $(SRCDIR)/avahi-glib/glib-watch.h $(SRCDIR)/avahi-glib/glib-malloc.h $(SRCDIR)/avahi-common/timeval.h +INPUT = $(SRCDIR)/avahi-common/cdecl.h $(SRCDIR)/avahi-core/core.h $(SRCDIR)/avahi-common/address.h $(SRCDIR)/avahi-core/rr.h $(SRCDIR)/avahi-common/strlst.h $(SRCDIR)/avahi-common/alternative.h $(SRCDIR)/avahi-core/log.h $(SRCDIR)/avahi-common/defs.h $(SRCDIR)/avahi-client/client.h $(SRCDIR)/avahi-common/error.h $(SRCDIR)/avahi-common/malloc.h $(SRCDIR)/avahi-common/domain.h $(SRCDIR)/avahi-common/gccmacro.h $(SRCDIR)/avahi-common/watch.h $(SRCDIR)/avahi-common/simple-watch.h $(SRCDIR)/avahi-glib/glib-watch.h $(SRCDIR)/avahi-glib/glib-malloc.h $(SRCDIR)/avahi-common/timeval.h $(SRCDIR)/avahi-common/dbus.h FILE_PATTERNS = RECURSIVE = NO EXCLUDE = -- cgit