]> git.meshlink.io Git - catta/commitdiff
* start implementing error handling in avahi-client
authorLennart Poettering <lennart@poettering.net>
Tue, 16 Aug 2005 01:29:28 +0000 (01:29 +0000)
committerLennart Poettering <lennart@poettering.net>
Tue, 16 Aug 2005 01:29:28 +0000 (01:29 +0000)
* doxygen document timeval.h
* add two more AVAHI_GCC_SENTINELs

git-svn-id: file:///home/lennart/svn/public/avahi/trunk@350 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe

13 files changed:
avahi-client/browser.c
avahi-client/client-test.c
avahi-client/client.c
avahi-client/client.h
avahi-client/entrygroup.c
avahi-client/internal.h
avahi-common/dbus.h
avahi-common/domain.h
avahi-common/error.c
avahi-common/error.h
avahi-common/timeval.h
avahi-core/core.h
avahi-daemon/dbus-protocol.c

index 01608d09d8b7e3edfe5963bbd8181437d606dcea..dfc70f189e490b779da1a55f2f72f9cfaa6a1b76 100644 (file)
@@ -40,7 +40,7 @@
 
 /* AvahiDomainBrowser */
 
-AvahiDomainBrowser* avahi_domain_browser_new (AvahiClient *client, AvahiIfIndex interface, AvahiProtocol protocol, const char *domain, AvahiDomainBrowserType btype, AvahiDomainBrowserCallback callback, void *user_data)
+AvahiDomainBrowser* avahi_domain_browser_new (AvahiClient *client, AvahiIfIndex interface, AvahiProtocol protocol, const char *domain, AvahiDomainBrowserType btype, AvahiDomainBrowserCallback callback, void *userdata)
 {
     AvahiDomainBrowser *tmp = NULL;
     DBusMessage *message = NULL, *reply;
@@ -72,7 +72,7 @@ AvahiDomainBrowser* avahi_domain_browser_new (AvahiClient *client, AvahiIfIndex
     tmp = avahi_new (AvahiDomainBrowser, 1);
     tmp->client = client;
     tmp->callback = callback;
-    tmp->user_data = user_data;
+    tmp->userdata = userdata;
     tmp->path = strdup (path);
 
     AVAHI_LLIST_PREPEND(AvahiDomainBrowser, domain_browsers, client->domain_browsers, tmp);
@@ -150,7 +150,7 @@ avahi_domain_browser_event (AvahiClient *client, AvahiBrowserEvent event, DBusMe
     if (dbus_error_is_set (&error))
         goto out;
 
-    db->callback (db, interface, protocol, event, domain, db->user_data);
+    db->callback (db, interface, protocol, event, domain, db->userdata);
 
     return DBUS_HANDLER_RESULT_HANDLED;
 
@@ -160,7 +160,7 @@ out:
 }
 
 /* AvahiServiceTypeBrowser */
-AvahiServiceTypeBrowser* avahi_service_type_browser_new (AvahiClient *client, AvahiIfIndex interface, AvahiProtocol protocol, const char *domain, AvahiServiceTypeBrowserCallback callback, void *user_data)
+AvahiServiceTypeBrowser* avahi_service_type_browser_new (AvahiClient *client, AvahiIfIndex interface, AvahiProtocol protocol, const char *domain, AvahiServiceTypeBrowserCallback callback, void *userdata)
 {
     AvahiServiceTypeBrowser *tmp = NULL;
     DBusMessage *message = NULL, *reply;
@@ -194,7 +194,7 @@ AvahiServiceTypeBrowser* avahi_service_type_browser_new (AvahiClient *client, Av
     tmp = avahi_new(AvahiServiceTypeBrowser, 1);
     tmp->client = client;
     tmp->callback = callback;
-    tmp->user_data = user_data;
+    tmp->userdata = userdata;
     tmp->path = strdup (path);
 
     AVAHI_LLIST_PREPEND(AvahiServiceTypeBrowser, service_type_browsers, client->service_type_browsers, tmp);
@@ -276,7 +276,7 @@ avahi_service_type_browser_event (AvahiClient *client, AvahiBrowserEvent event,
     if (dbus_error_is_set (&error))
         goto out;
 
-    db->callback (db, interface, protocol, event, type, domain, db->user_data);
+    db->callback (db, interface, protocol, event, type, domain, db->userdata);
 
     return DBUS_HANDLER_RESULT_HANDLED;
 
@@ -287,7 +287,7 @@ out:
 
 /* AvahiServiceBrowser */
 
-AvahiServiceBrowser* avahi_service_browser_new (AvahiClient *client, AvahiIfIndex interface, AvahiProtocol protocol, const char *type, const char *domain, AvahiServiceBrowserCallback callback, void *user_data)
+AvahiServiceBrowser* avahi_service_browser_new (AvahiClient *client, AvahiIfIndex interface, AvahiProtocol protocol, const char *type, const char *domain, AvahiServiceBrowserCallback callback, void *userdata)
 {
     AvahiServiceBrowser *tmp = NULL;
     DBusMessage *message = NULL, *reply;
@@ -324,7 +324,7 @@ AvahiServiceBrowser* avahi_service_browser_new (AvahiClient *client, AvahiIfInde
     tmp = avahi_new(AvahiServiceBrowser, 1);
     tmp->client = client;
     tmp->callback = callback;
-    tmp->user_data = user_data;
+    tmp->userdata = userdata;
     tmp->path = strdup (path);
 
     AVAHI_LLIST_PREPEND(AvahiServiceBrowser, service_browsers, client->service_browsers, tmp);
@@ -407,7 +407,7 @@ avahi_service_browser_event (AvahiClient *client, AvahiBrowserEvent event, DBusM
     if (dbus_error_is_set (&error))
         goto out;
 
-    db->callback (db, interface, protocol, event, name, type, domain, db->user_data);
+    db->callback (db, interface, protocol, event, name, type, domain, db->userdata);
 
     return DBUS_HANDLER_RESULT_HANDLED;
 
index 11bc4f251ded160252bc0e52451a5c3509f591be..f8f81afbe1f386c737406cacfec3dcd7b87c3561 100644 (file)
@@ -87,12 +87,16 @@ main (int argc, char *argv[])
     AvahiServiceTypeBrowser *st;
     AvahiSimplePoll *simple_poll;
     char *ret;
+    int error;
     struct timeval tv;
 
     simple_poll = avahi_simple_poll_new();
     poll_api = avahi_simple_poll_get(simple_poll);
     
-    avahi = avahi_client_new(poll_api, avahi_client_callback, "omghai2u");
+    if (!(avahi = avahi_client_new(poll_api, avahi_client_callback, "omghai2u", &error))) {
+        fprintf(stderr, "Client failed: %s\n", avahi_strerror(error));
+        goto fail;
+    }
 
     assert (avahi != NULL);
 
@@ -155,10 +159,13 @@ main (int argc, char *argv[])
         if (avahi_simple_poll_iterate(simple_poll, -1) != 0)
             break;
 
+fail:
 
-    avahi_simple_poll_free(simple_poll);
+    if (simple_poll)
+        avahi_simple_poll_free(simple_poll);
 
-    avahi_free (avahi);
+    if (avahi)
+        avahi_free (avahi);
 
     return 0;
 }
index fcb4921112a5162df8ec0e1ee228dcaed774813f..e99956a2d4bb894327ec505b8916b7887505c49e 100644 (file)
 int
 avahi_client_set_errno (AvahiClient *client, int error)
 {
-    if (client == NULL) return error;
+    assert(client);
 
     client->error = error;
 
     return error;
 }
     
-static
-void avahi_client_state_change (AvahiClient *client, int state)
-{
-    if (client == NULL || client->callback == NULL) 
+static void avahi_client_set_state (AvahiClient *client, AvahiServerState state) {
+    assert(state);
+
+    if (client->state == state)
         return;
 
-    client->callback (client, state, client->user_data);
+    client->state = state;
+
+    if (client->callback)
+        client->callback (client, state, client->userdata);
 }
 
 static void
@@ -80,7 +83,7 @@ avahi_client_state_request_callback (DBusPendingCall *call, void *data)
         if (dbus_error_is_set (&error))
             return;
         
-        avahi_client_state_change (client, state);
+        avahi_client_set_state (client, state);
     } else if (type == DBUS_MESSAGE_TYPE_ERROR) {
         dbus_set_error_from_message (&error, reply);
     }
@@ -94,6 +97,10 @@ avahi_client_schedule_state_request (AvahiClient *client)
     DBusMessage *message;
     DBusPendingCall *pcall;
 
+    /*** Lennart says that this can't happen this way since it will
+     * never be called if no main loop is used. This call has to
+     * happen synchronously */
+
     if (client == NULL) return;
 
     message = dbus_message_new_method_call (AVAHI_DBUS_NAME, AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, "GetState");
@@ -128,9 +135,9 @@ filter_func (DBusConnection *bus, DBusMessage *message, void *data)
         if (strcmp (name, AVAHI_DBUS_NAME) == 0) {
 
             if (old == NULL && new != NULL) {
-                avahi_client_state_change (client, AVAHI_CLIENT_RECONNECTED);
+                avahi_client_set_state (client, AVAHI_CLIENT_RECONNECTED);
             } else if (old != NULL && new == NULL) {
-                avahi_client_state_change (client, AVAHI_CLIENT_DISCONNECTED);
+                avahi_client_set_state (client, AVAHI_CLIENT_DISCONNECTED);
                 /* XXX: we really need to expire all entry groups */
             }
         }
@@ -153,8 +160,6 @@ filter_func (DBusConnection *bus, DBusMessage *message, void *data)
         
         if (group != NULL) {
             int state;
-            DBusError error;
-            dbus_error_init (&error);
             dbus_message_get_args (message, &error, DBUS_TYPE_INT32, &state, DBUS_TYPE_INVALID);
             if (dbus_error_is_set (&error))
                 goto out;
@@ -181,74 +186,116 @@ out:
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
 
+static int translate_dbus_error(const DBusError *error) {
+    assert(error);
+
+    /*** FIXME! Some more eloquent error translation should happen here */
+    
+    return AVAHI_ERR_DBUS_ERROR;
+}
+
 AvahiClient *
-avahi_client_new (const AvahiPoll *poll_api, AvahiClientCallback callback, void *user_data)
+avahi_client_new (const AvahiPoll *poll_api, AvahiClientCallback callback, void *userdata, int *ret_error)
 {
-    AvahiClient *tmp = NULL;
+    AvahiClient *client = NULL;
     DBusError error;
 
     dbus_error_init (&error);
 
-    if (!(tmp = avahi_new(AvahiClient, 1)))
+    if (!(client = avahi_new(AvahiClient, 1))) {
+        if (ret_error)
+            *ret_error = AVAHI_ERR_NO_MEMORY;
         goto fail;
+    }
 
-    AVAHI_LLIST_HEAD_INIT(AvahiEntryGroup, tmp->groups);
-    AVAHI_LLIST_HEAD_INIT(AvahiDomainBrowser, tmp->domain_browsers);
-    AVAHI_LLIST_HEAD_INIT(AvahiServiceBrowser, tmp->service_browsers);
-    AVAHI_LLIST_HEAD_INIT(AvahiServiceTypeBrowser, tmp->service_type_browsers);
-    
-    tmp->poll_api = poll_api;
-    tmp->bus = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
+    client->poll_api = poll_api;
+    client->error = AVAHI_OK;
+    client->callback = callback;
+    client->userdata = userdata;
+    client->state = AVAHI_SERVER_INVALID;
+
+    AVAHI_LLIST_HEAD_INIT(AvahiEntryGroup, client->groups);
+    AVAHI_LLIST_HEAD_INIT(AvahiDomainBrowser, client->domain_browsers);
+    AVAHI_LLIST_HEAD_INIT(AvahiServiceBrowser, client->service_browsers);
+    AVAHI_LLIST_HEAD_INIT(AvahiServiceTypeBrowser, client->service_type_browsers);
 
+    client->bus = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
     if (dbus_error_is_set (&error)) {
+        if (ret_error)
+            *ret_error = translate_dbus_error(&error);
         goto fail;
     }
 
-/*     dbus_connection_setup_with_g_main (tmp->bus, NULL); */
-/*     dbus_connection_set_exit_on_disconnect (tmp->bus, FALSE); */
-
-    if (avahi_dbus_connection_glue(tmp->bus, poll_api) < 0)
+    if (avahi_dbus_connection_glue(client->bus, poll_api) < 0) {
+        if (ret_error)
+            *ret_error = AVAHI_ERR_NO_MEMORY; /* Not optimal */
         goto fail;
+    }
 
-    if (!dbus_connection_add_filter (tmp->bus, filter_func, tmp, NULL))
-    {
+    if (!dbus_connection_add_filter (client->bus, filter_func, client, NULL)) {
+        if (ret_error)
+            *ret_error = AVAHI_ERR_NO_MEMORY; 
         goto fail;
     }
+        
+    dbus_bus_add_match(
+        client->bus,
+        "type='signal', "
+        "interface='" AVAHI_DBUS_INTERFACE_SERVER "', "
+        "sender='" AVAHI_DBUS_NAME "', "
+        "path='" AVAHI_DBUS_PATH_SERVER "'",
+        &error);
 
-    dbus_bus_add_match (tmp->bus,
-            "type='signal', "
-            "interface='" AVAHI_DBUS_INTERFACE_SERVER "', "
-            "sender='" AVAHI_DBUS_NAME "', "
-            "path='" AVAHI_DBUS_PATH_SERVER "'",
-            &error);
-
-    if (dbus_error_is_set (&error))
-    {
+    if (dbus_error_is_set (&error)) {
+        if (ret_error)
+            *ret_error = translate_dbus_error(&error);
         goto fail;
     }   
 
-    dbus_bus_add_match (tmp->bus,
-            "type='signal', "
-            "interface='" DBUS_INTERFACE_DBUS "', "
-            "sender='" DBUS_SERVICE_DBUS "', "
-            "path='" DBUS_PATH_DBUS "'",
-            &error);
+    dbus_bus_add_match (
+        client->bus,
+        "type='signal', "
+        "interface='" DBUS_INTERFACE_DBUS "', "
+        "sender='" DBUS_SERVICE_DBUS "', "
+        "path='" DBUS_PATH_DBUS "'",
+        &error);
 
-    if (dbus_error_is_set (&error))
-    {
+    if (dbus_error_is_set (&error)) {
+        if (ret_error)
+            *ret_error = translate_dbus_error(&error);
         goto fail;
     }
 
-    tmp->callback = callback;
-    tmp->user_data = user_data;
+    if (!(dbus_bus_name_has_owner(client->bus, AVAHI_DBUS_NAME, &error))) {
 
-    avahi_client_schedule_state_request (tmp);
+        if (dbus_error_is_set (&error)) {
+            if (ret_error)
+                *ret_error = translate_dbus_error(&error);
+            goto fail;
+        }
+        
+        if (ret_error)
+            *ret_error = AVAHI_ERR_NO_DAEMON;
+        goto fail;
+    }
+
+    /* This can't happen asynchronously, since it is not guaranteed that a main loop is used */
+    
+    /*client_get_server_state (client);*/
 
-    avahi_client_set_errno (tmp, AVAHI_OK);
-    return tmp;
+    return client;
 
 fail:
-    avahi_free (tmp);
+
+    if (client) {
+
+        if (client->bus) {
+            dbus_connection_disconnect(client->bus);
+            dbus_connection_unref(client->bus);
+        }
+        
+        avahi_free(client);
+    }
 
     if (dbus_error_is_set(&error))
         dbus_error_free(&error);
index de6f207207bb56af868126ab6154e061921fe17a..99f27dd257c26016f6f88b5abcbebeb0d9838ed0 100644 (file)
@@ -59,16 +59,16 @@ typedef void (*AvahiClientCallback) (AvahiClient *s, AvahiClientState state, voi
 typedef void (*AvahiEntryGroupCallback) (AvahiEntryGroup *g, AvahiEntryGroupState state, void* userdata);
 
 /** The function prototype for the callback of an AvahiDomainBrowser */
-typedef void (*AvahiDomainBrowserCallback) (AvahiDomainBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *domain, void *user_data);
+typedef void (*AvahiDomainBrowserCallback) (AvahiDomainBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *domain, void *userdata);
 
 /** The function prototype for the callback of an AvahiServiceBrowser */
-typedef void (*AvahiServiceBrowserCallback) (AvahiServiceBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *name, const char *type, const char *domain, void *user_data);
+typedef void (*AvahiServiceBrowserCallback) (AvahiServiceBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *name, const char *type, const char *domain, void *userdata);
 
 /** The function prototype for the callback of an AvahiServiceTypeBrowser */
-typedef void (*AvahiServiceTypeBrowserCallback) (AvahiServiceTypeBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *type, const char *domain, void *user_data);
+typedef void (*AvahiServiceTypeBrowserCallback) (AvahiServiceTypeBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *type, const char *domain, void *userdata);
 
 /** Creates a new client instance */
-AvahiClient* avahi_client_new (const AvahiPoll *poll_api, AvahiClientCallback callback, void *user_data);
+AvahiClient* avahi_client_new (const AvahiPoll *poll_api, AvahiClientCallback callback, void *userdata, int *error);
 
 /** Get the version of the server */
 char* avahi_client_get_version_string (AvahiClient*);
@@ -83,7 +83,7 @@ char* avahi_client_get_domain_name (AvahiClient*);
 char* avahi_client_get_host_name_fqdn (AvahiClient*);
 
 /** Create a new AvahiEntryGroup object */
-AvahiEntryGroup* avahi_entry_group_new (AvahiClient*, AvahiEntryGroupCallback callback, void *user_data);
+AvahiEntryGroup* avahi_entry_group_new (AvahiClient*, AvahiEntryGroupCallback callback, void *userdata);
 
 /** Clean up and free an AvahiEntryGroup object */
 int avahi_entry_group_free (AvahiEntryGroup *);
@@ -128,7 +128,7 @@ AvahiDomainBrowser* avahi_domain_browser_new (AvahiClient *client,
                                               const char *domain,
                                               AvahiDomainBrowserType btype,
                                               AvahiDomainBrowserCallback callback,
-                                              void *user_data);
+                                              void *userdata);
 
 /** Get the D-Bus path of an AvahiDomainBrowser object, for debugging purposes only. */
 const char* avahi_domain_browser_path (AvahiDomainBrowser *);
@@ -143,7 +143,7 @@ AvahiServiceTypeBrowser* avahi_service_type_browser_new (
                 AvahiProtocol protocol,
                 const char *domain,
                 AvahiServiceTypeBrowserCallback callback,
-                void *user_data);
+                void *userdata);
 
 /** Get the D-Bus path of an AvahiServiceTypeBrowser object, for debugging purposes only. */
 const char* avahi_service_type_browser_path (AvahiServiceTypeBrowser *);
@@ -159,7 +159,7 @@ AvahiServiceBrowser* avahi_service_browser_new (
                 const char *type,
                 const char *domain,
                 AvahiServiceBrowserCallback callback,
-                void *user_data);
+                void *userdata);
 
 /** Get the D-Bus path of an AvahiServiceBrowser object, for debugging purposes only. */
 const char* avahi_service_browser_path (AvahiServiceBrowser *);
index 633575579bd0940ee05da797203e2bf2ed3751e7..dbd1a4e4d5e9dab2551406a6ad130d76df211fb7 100644 (file)
@@ -43,7 +43,7 @@ void avahi_entry_group_state_change (AvahiEntryGroup *group, int state)
     if (group == NULL || group->callback == NULL)
         return;
 
-    group->callback (group, state, group->user_data);
+    group->callback (group, state, group->userdata);
 }
 
 AvahiEntryGroup*
@@ -93,7 +93,7 @@ avahi_entry_group_new (AvahiClient *client, AvahiEntryGroupCallback callback, vo
 
     tmp->path = avahi_strdup (path);
     tmp->callback = callback;
-    tmp->user_data = user_data;
+    tmp->userdata = user_data;
 
     AVAHI_LLIST_PREPEND(AvahiEntryGroup, groups, client->groups, tmp);
 
index 6058e20b47a8276a58fd026314bf1ef444ea003b..4aaca392845b5052be5ef849192aed9cb30ed913 100644 (file)
@@ -30,8 +30,11 @@ struct _AvahiClient
     const AvahiPoll *poll_api;
     DBusConnection *bus;
     int error;
+    AvahiServerState state;
+
     AvahiClientCallback callback;
-    void *user_data;
+    void *userdata;
+    
     AVAHI_LLIST_HEAD(AvahiEntryGroup, groups);
     AVAHI_LLIST_HEAD(AvahiDomainBrowser, domain_browsers);
     AVAHI_LLIST_HEAD(AvahiServiceBrowser, service_browsers);
@@ -42,7 +45,7 @@ struct _AvahiEntryGroup {
     char *path;
     AvahiClient *client;
     AvahiEntryGroupCallback callback;
-    void *user_data;
+    void *userdata;
     AVAHI_LLIST_FIELDS(AvahiEntryGroup, groups);
 };
 
@@ -50,7 +53,7 @@ struct _AvahiDomainBrowser {
     char *path;
     AvahiClient *client;
     AvahiDomainBrowserCallback callback;
-    void *user_data;
+    void *userdata;
     AVAHI_LLIST_FIELDS(AvahiDomainBrowser, domain_browsers);
 };
 
@@ -58,7 +61,7 @@ struct _AvahiServiceBrowser {
     char *path;
     AvahiClient *client;
     AvahiServiceBrowserCallback callback;
-    void *user_data;
+    void *userdata;
     AVAHI_LLIST_FIELDS(AvahiServiceBrowser, service_browsers);
 };
 
@@ -66,7 +69,7 @@ struct _AvahiServiceTypeBrowser {
     char *path;
     AvahiClient *client;
     AvahiServiceTypeBrowserCallback callback;
-    void *user_data;
+    void *userdata;
     AVAHI_LLIST_FIELDS(AvahiServiceTypeBrowser, service_type_browsers);
 };
 
index e3aef6ca5bb111b6d842c5b3554e276fa4049a17..3b27421136e960dad9e5129554aea701e2881759 100644 (file)
@@ -60,7 +60,8 @@ AVAHI_C_DECL_BEGIN
 #define AVAHI_DBUS_ERR_DBUS_ERROR "org.freedesktop.Avahi.DBusError"
 #define AVAHI_DBUS_ERR_NOT_CONNECTED "org.freedesktop.Avahi.NotConnectedError"
 #define AVAHI_DBUS_ERR_NO_MEMORY "org.freedesktop.Avahi.NoMemoryError"
-#define AVAHI_DBUS_ERR_INVALID_OBJECT "org.freedesktop.Avahi.InvalidObject"
+#define AVAHI_DBUS_ERR_INVALID_OBJECT "org.freedesktop.Avahi.InvalidObjectError"
+#define AVAHI_DBUS_ERR_NO_DAEMON "org.freedesktop.Avahi.NoDaemonError"
 
 AVAHI_C_DECL_END
 
index c9cc39ebf2630dd1d4c3b453611465765e94fd44..88cf4d3ee1e980875360d001950f035182c390bd 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef foodomainhfoo
-#define foodimainhfoo
+#define foodomainhfoo
 
 /* $Id$ */
 
@@ -30,7 +30,9 @@
 
 #include <avahi-common/cdecl.h>
 
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
 AVAHI_C_DECL_BEGIN
+#endif
 
 /** Normalize a domain name into canonical form. This drops trailing
  * dots and removes useless backslash escapes. avahi_free() the
@@ -68,8 +70,8 @@ int avahi_is_valid_host_name(const char *t);
 /** Return some kind of hash value for the domain, useful for using domains as hash table keys. */
 unsigned avahi_domain_hash(const char *name);
 
-
-
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
 AVAHI_C_DECL_END
+#endif
 
 #endif
index 0635161e9275c5ba0251876a1429dd7572b5eea9..67a57011c534a3e4669b093da477052d39454b27 100644 (file)
@@ -48,8 +48,9 @@ const char *avahi_strerror(int error) {
         "Invalid operation",
         "An unexpected DBUS error occured",
         "Could not get a connection to the daemon",
-        "Memory exhausted"
-        "The object passed in was not valid"
+        "Memory exhausted",
+        "The object passed in was not valid",
+        "Daemon not running",
     };
 
     if (-error < 0 || -error >= -AVAHI_ERR_MAX)
index 2cdda5f890625249402ef2fc7a850fc362f83205..b367ffb7188d4b257e2bb42a8d0f304ceec13813 100644 (file)
@@ -56,6 +56,7 @@ enum {
     AVAHI_ERR_NOT_CONNECTED = -23,         /**< Could not get a connection to the daemon */
     AVAHI_ERR_NO_MEMORY = -24,             /**< Memory exhausted */
     AVAHI_ERR_INVALID_OBJECT = -25,        /**< The object passed to this function was invalid */
+    AVAHI_ERR_NO_DAEMON = -26,             /**< Daemon not running */
 
     /****
      ****    IF YOU ADD A NEW ERROR CODE HERE, PLEASE DON'T FORGET TO ADD
@@ -66,7 +67,7 @@ enum {
      ****    Also remember to update the MAX value below.
      ****/
     
-    AVAHI_ERR_MAX = -26
+    AVAHI_ERR_MAX = -27
 };
 
 /** Return a human readable error string for the specified error code */
index c046a19b852bdb44c9f9a1c6861335749d62af63..5bbe1a705e5535fd62f3c5f488f21fa0db628a94 100644 (file)
 
 #include <avahi-common/cdecl.h>
 
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
 AVAHI_C_DECL_BEGIN
+#endif
 
+/** A numeric data type for storing microsecond values. (signed 64bit integer) */
 typedef int64_t AvahiUsec;
 
+/** Compare two timeval structures and return a ngeative value when a < b, 0 when a == b and a positive value otherwise */
 int avahi_timeval_compare(const struct timeval *a, const struct timeval *b);
+
+/** Calculate the difference between to timeval structures as microsecond value */
 AvahiUsec avahi_timeval_diff(const struct timeval *a, const struct timeval *b);
+
+/** Add a number of microseconds to the specified timeval structure and return it. *a is modified. */
 struct timeval* avahi_timeval_add(struct timeval *a, AvahiUsec usec);
 
+/** Return the difference between the current time and *a. Positive if *a was earlier */
 AvahiUsec avahi_age(const struct timeval *a);
-struct timeval *avahi_elapse_time(struct timeval *tv, unsigned msec, unsigned jitter);
 
+/** Fill *tv with the current time plus "ms" milliseconds plus an
+ * extra jitter of "j" milliseconds. Pass 0 for j if you don't want
+ * the jitter */
+struct timeval *avahi_elapse_time(struct timeval *tv, unsigned ms, unsigned j);
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
 AVAHI_C_DECL_END
+#endif
 
 #endif
index b8ee91a646f9373ae174399953f236211793e8f2..99315898a8ac496047b29f43d3b39a5347cffeae 100644 (file)
@@ -228,7 +228,7 @@ int avahi_server_add_txt(
     AvahiEntryFlags flags,
     uint32_t ttl,             /**< DNS TTL for this record */
     const char *name,       /**< TXT record name */
-    ... /**< Text record data, terminated by NULL */);
+    ... /**< Text record data, terminated by NULL */) AVAHI_GCC_SENTINEL;
 
 /** Add a PTR RR to the server. Mostly identical to
  * avahi_server_add_text but takes a va_list instead of a variable
@@ -288,7 +288,7 @@ int avahi_server_add_service(
     const char *domain,       
     const char *host,         /**< Host name where this servcie resides, or NULL if on the local host */
     uint16_t port,              /**< Port number of the service */
-    ...  /**< Text records, terminated by NULL */);
+    ...  /**< Text records, terminated by NULL */) AVAHI_GCC_SENTINEL;
 
 /** Mostly identical to avahi_server_add_service(), but takes an va_list for the TXT records. */
 int avahi_server_add_service_va(
index f72b8d6d0ab6a8994b81f9d50422a286204b8130..772756b8a3ede585bc1e06cb57a561e1b2fa472c 100644 (file)
@@ -354,7 +354,8 @@ static DBusHandlerResult respond_error(DBusConnection *c, DBusMessage *m, int er
         AVAHI_DBUS_ERR_DBUS_ERROR,
         AVAHI_DBUS_ERR_NOT_CONNECTED,
         AVAHI_DBUS_ERR_NO_MEMORY,
-        AVAHI_DBUS_ERR_INVALID_OBJECT
+        AVAHI_DBUS_ERR_INVALID_OBJECT,
+        AVAHI_DBUS_ERR_NO_DAEMON
     };
 
     assert(-error > -AVAHI_OK);
@@ -1686,9 +1687,8 @@ int dbus_protocol_setup(const AvahiPoll *poll_api) {
         goto fail;
     }
 
-    dbus_bus_add_match(server->bus, "type='signal',""interface='" DBUS_INTERFACE_DBUS  "'", &error);
-
     dbus_connection_add_filter(server->bus, msg_signal_filter_impl, (void*) poll_api, NULL);
+    dbus_bus_add_match(server->bus, "type='signal',""interface='" DBUS_INTERFACE_DBUS  "'", &error);
     dbus_connection_register_object_path(server->bus, AVAHI_DBUS_PATH_SERVER, &server_vtable, NULL);
 
     return 0;