]> git.meshlink.io Git - catta/blobdiff - avahi-client/resolver.c
* drop AVAHI_RESOLVER_TIMEOUT, AVAHI_RESOLVER_NOT_FOUND and AVAHI_BROWSER_NOT_FOUND...
[catta] / avahi-client / resolver.c
index f08ce77b455ff6e63c952ac0d835e941919aa4e0..889088f3a2b772ecf771443d2ed0230f4054e131 100644 (file)
@@ -61,94 +61,113 @@ DBusHandlerResult avahi_service_resolver_event (AvahiClient *client, AvahiResolv
     if (!r)
         goto fail;
 
-    if (event == AVAHI_RESOLVER_FOUND) {
-        int j;
-        int32_t interface, flags, protocol, aprotocol;
-        char *name, *type, *domain, *host, *address;
-        uint16_t port;
-        DBusMessageIter iter, sub;
-        AvahiAddress a;
-        
-        if (!dbus_message_get_args(
-                message, &error,
-                DBUS_TYPE_INT32, &interface,
-                DBUS_TYPE_INT32, &protocol,
-                DBUS_TYPE_STRING, &name,
-                DBUS_TYPE_STRING, &type,
-                DBUS_TYPE_STRING, &domain,
-                DBUS_TYPE_STRING, &host,
-                DBUS_TYPE_INT32, &aprotocol,
-                DBUS_TYPE_STRING, &address,
-                DBUS_TYPE_UINT16, &port,
-                DBUS_TYPE_INVALID) ||
-            dbus_error_is_set (&error)) {
+    switch (event) {
+        case AVAHI_RESOLVER_FOUND: {
+            int j;
+            int32_t interface, protocol, aprotocol;
+            uint32_t flags;
+            char *name, *type, *domain, *host, *address;
+            uint16_t port;
+            DBusMessageIter iter, sub;
+            AvahiAddress a;
             
-            fprintf(stderr, "Failed to parse resolver event.\n");
-            goto fail;
-        }
+            if (!dbus_message_get_args(
+                    message, &error,
+                    DBUS_TYPE_INT32, &interface,
+                    DBUS_TYPE_INT32, &protocol,
+                    DBUS_TYPE_STRING, &name,
+                    DBUS_TYPE_STRING, &type,
+                    DBUS_TYPE_STRING, &domain,
+                    DBUS_TYPE_STRING, &host,
+                    DBUS_TYPE_INT32, &aprotocol,
+                    DBUS_TYPE_STRING, &address,
+                    DBUS_TYPE_UINT16, &port,
+                    DBUS_TYPE_INVALID) ||
+                dbus_error_is_set (&error)) {
+            
+                fprintf(stderr, "Failed to parse resolver event.\n");
+                goto fail;
+            }
         
-        dbus_message_iter_init(message, &iter);
+            dbus_message_iter_init(message, &iter);
         
-        for (j = 0; j < 9; j++)
-            dbus_message_iter_next(&iter);
+            for (j = 0; j < 9; j++)
+                dbus_message_iter_next(&iter);
         
-        if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
-            dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_ARRAY) {
-            fprintf(stderr, "Error parsing service resolving message\n");
-            goto fail;
-        }
+            if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
+                dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_ARRAY) {
+                fprintf(stderr, "Error parsing service resolving message\n");
+                goto fail;
+            }
         
-        strlst = NULL;
-        dbus_message_iter_recurse(&iter, &sub);
+            strlst = NULL;
+            dbus_message_iter_recurse(&iter, &sub);
         
-        for (;;) {
-            DBusMessageIter sub2;
-            int at;
+            for (;;) {
+                DBusMessageIter sub2;
+                int at;
             
-            if ((at = dbus_message_iter_get_arg_type(&sub)) == DBUS_TYPE_INVALID)
-                break;
+                if ((at = dbus_message_iter_get_arg_type(&sub)) == DBUS_TYPE_INVALID)
+                    break;
             
-            assert(at == DBUS_TYPE_ARRAY);
+                assert(at == DBUS_TYPE_ARRAY);
             
-            if (dbus_message_iter_get_element_type(&sub) != DBUS_TYPE_BYTE) {
-                fprintf(stderr, "Error parsing service resolving message\n");
-                goto fail;
-            }
+                if (dbus_message_iter_get_element_type(&sub) != DBUS_TYPE_BYTE) {
+                    fprintf(stderr, "Error parsing service resolving message\n");
+                    goto fail;
+                }
             
-            dbus_message_iter_recurse(&sub, &sub2);
+                dbus_message_iter_recurse(&sub, &sub2);
 
-            if (dbus_message_iter_get_array_len(&sub2) > 0) {
-                uint8_t *k;
-                int n;
+                if (dbus_message_iter_get_array_len(&sub2) > 0) {
+                    uint8_t *k;
+                    int n;
                 
-                dbus_message_iter_get_fixed_array(&sub2, &k, &n);
-                strlst = avahi_string_list_add_arbitrary(strlst, k, n);
-            }
+                    dbus_message_iter_get_fixed_array(&sub2, &k, &n);
+                    strlst = avahi_string_list_add_arbitrary(strlst, k, n);
+                }
             
-            dbus_message_iter_next(&sub);
-        }
+                dbus_message_iter_next(&sub);
+            }
 
-        dbus_message_iter_next(&iter);
+            dbus_message_iter_next(&iter);
 
-        if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) {
-            fprintf(stderr, "Failed to parse resolver event. XXX %i\n", dbus_message_iter_get_arg_type(&iter));
-            goto fail;
-        }
+            if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT32) {
+                fprintf(stderr, "Failed to parse resolver event.\n");
+                goto fail;
+            }
 
-        dbus_message_iter_get_basic(&iter, &flags);
+            dbus_message_iter_get_basic(&iter, &flags);
                                     
-        assert(address);
-        if (!avahi_address_parse(address, (AvahiProtocol) aprotocol, &a)) {
-            fprintf(stderr, "Failed to parse address\n");
-            goto fail;
-        }
+            assert(address);
+            if (!avahi_address_parse(address, (AvahiProtocol) aprotocol, &a)) {
+                fprintf(stderr, "Failed to parse address\n");
+                goto fail;
+            }
     
-        r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, name, type, domain, host, &a, port, strlst, (AvahiLookupResultFlags) flags, r->userdata);
+            r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, name, type, domain, host, &a, port, strlst, (AvahiLookupResultFlags) flags, r->userdata);
         
-        avahi_string_list_free(strlst);
-
-    } else
-        r->callback(r, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, event, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, r->userdata);
+            avahi_string_list_free(strlst);
+            break;
+        }
+            
+        case AVAHI_RESOLVER_FAILURE: {
+            char *etxt;
+            
+            if (!dbus_message_get_args(
+                    message, &error,
+                    DBUS_TYPE_STRING, &etxt,
+                    DBUS_TYPE_INVALID) ||
+                dbus_error_is_set (&error)) {
+                fprintf(stderr, "Failed to parse resolver event.\n");
+                goto fail;
+            }
+            
+            avahi_client_set_errno(r->client, avahi_error_dbus_to_number(etxt));
+            r->callback(r, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, event, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, r->userdata);
+            break;
+        }
+    }
 
     return DBUS_HANDLER_RESULT_HANDLED;
 
@@ -159,7 +178,6 @@ fail:
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
 
-
 AvahiServiceResolver * avahi_service_resolver_new(
     AvahiClient *client,
     AvahiIfIndex interface,
@@ -173,9 +191,10 @@ AvahiServiceResolver * avahi_service_resolver_new(
     void *userdata) {
 
     DBusError error;
-    AvahiServiceResolver *r;
+    AvahiServiceResolver *r = NULL;
     DBusMessage *message = NULL, *reply = NULL;
-    int32_t i_interface, i_protocol, i_aprotocol, i_flags;
+    int32_t i_interface, i_protocol, i_aprotocol;
+    uint32_t u_flags;
     char *path;
     
     assert(client);
@@ -214,7 +233,7 @@ AvahiServiceResolver * avahi_service_resolver_new(
     i_interface = (int32_t) interface;
     i_protocol = (int32_t) protocol;
     i_aprotocol = (int32_t) aprotocol;
-    i_flags = (int32_t) flags;
+    u_flags = (uint32_t) flags;
 
     if (!(dbus_message_append_args(
               message,
@@ -224,7 +243,7 @@ AvahiServiceResolver * avahi_service_resolver_new(
               DBUS_TYPE_STRING, &type,
               DBUS_TYPE_STRING, &domain,
               DBUS_TYPE_INT32, &i_aprotocol,
-              DBUS_TYPE_INT32, &i_flags,
+              DBUS_TYPE_UINT32, &u_flags,
               DBUS_TYPE_INVALID))) {
         avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY);
         goto fail;
@@ -323,35 +342,54 @@ DBusHandlerResult avahi_host_name_resolver_event (AvahiClient *client, AvahiReso
     if (!r)
         goto fail;
 
-    if (event == AVAHI_RESOLVER_FOUND) {
-        int32_t interface, protocol, aprotocol, flags;
-        char *name, *address;
-        AvahiAddress a;
-        
-        if (!dbus_message_get_args(
-                message, &error,
-                DBUS_TYPE_INT32, &interface,
-                DBUS_TYPE_INT32, &protocol,
-                DBUS_TYPE_STRING, &name,
-                DBUS_TYPE_INT32, &aprotocol,
-                DBUS_TYPE_STRING, &address,
-                DBUS_TYPE_INT32, &flags,
-                DBUS_TYPE_INVALID) ||
-            dbus_error_is_set (&error)) {
-            fprintf(stderr, "Failed to parse resolver event.\n");
-            goto fail;
+    switch (event) {
+        case AVAHI_RESOLVER_FOUND: {
+            int32_t interface, protocol, aprotocol;
+            uint32_t flags;
+            char *name, *address;
+            AvahiAddress a;
+            
+            if (!dbus_message_get_args(
+                    message, &error,
+                    DBUS_TYPE_INT32, &interface,
+                    DBUS_TYPE_INT32, &protocol,
+                    DBUS_TYPE_STRING, &name,
+                    DBUS_TYPE_INT32, &aprotocol,
+                    DBUS_TYPE_STRING, &address,
+                    DBUS_TYPE_UINT32, &flags,
+                    DBUS_TYPE_INVALID) ||
+                dbus_error_is_set (&error)) {
+                fprintf(stderr, "Failed to parse resolver event.\n");
+                goto fail;
+            }
+            
+            assert(address);
+            if (!avahi_address_parse(address, (AvahiProtocol) aprotocol, &a)) {
+                fprintf(stderr, "Failed to parse address\n");
+                goto fail;
+            }
+            
+            r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, name, &a, (AvahiLookupResultFlags) flags, r->userdata);
+            break;
         }
-        
-        assert(address);
-        if (!avahi_address_parse(address, (AvahiProtocol) aprotocol, &a)) {
-            fprintf(stderr, "Failed to parse address\n");
-            goto fail;
+            
+        case AVAHI_RESOLVER_FAILURE: {
+            char *etxt;
+            
+            if (!dbus_message_get_args(
+                    message, &error,
+                    DBUS_TYPE_STRING, &etxt,
+                    DBUS_TYPE_INVALID) ||
+                dbus_error_is_set (&error)) {
+                fprintf(stderr, "Failed to parse resolver event.\n");
+                goto fail;
+            }
+            
+            avahi_client_set_errno(r->client, avahi_error_dbus_to_number(etxt));
+            r->callback(r, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, event, NULL, NULL, 0, r->userdata);
+            break;
         }
-    
-        r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, name, &a, flags, r->userdata);
-
-    } else
-        r->callback(r, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, event, NULL, NULL, 0, r->userdata);
+    }
 
     return DBUS_HANDLER_RESULT_HANDLED;
     
@@ -372,9 +410,10 @@ AvahiHostNameResolver * avahi_host_name_resolver_new(
     void *userdata) {
 
     DBusError error;
-    AvahiHostNameResolver *r;
+    AvahiHostNameResolver *r = NULL;
     DBusMessage *message = NULL, *reply = NULL;
-    int32_t i_interface, i_protocol, i_aprotocol, i_flags;
+    int32_t i_interface, i_protocol, i_aprotocol;
+    uint32_t u_flags;
     char *path;
     
     assert(client);
@@ -407,7 +446,7 @@ AvahiHostNameResolver * avahi_host_name_resolver_new(
     i_interface = (int32_t) interface;
     i_protocol = (int32_t) protocol;
     i_aprotocol = (int32_t) aprotocol;
-    i_flags = (int32_t) flags;
+    u_flags = (uint32_t) flags;
 
     if (!(dbus_message_append_args(
               message,
@@ -415,7 +454,7 @@ AvahiHostNameResolver * avahi_host_name_resolver_new(
               DBUS_TYPE_INT32, &i_protocol,
               DBUS_TYPE_STRING, &name,
               DBUS_TYPE_INT32, &i_aprotocol,
-              DBUS_TYPE_INT32, &i_flags,
+              DBUS_TYPE_UINT32, &u_flags,
               DBUS_TYPE_INVALID))) {
         avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY);
         goto fail;
@@ -513,34 +552,54 @@ DBusHandlerResult avahi_address_resolver_event (AvahiClient *client, AvahiResolv
     if (!r)
         goto fail;
 
-    if (event == AVAHI_RESOLVER_FOUND) {
-        int32_t interface, protocol, aprotocol, flags;
-        char *name, *address;
-        AvahiAddress a;
-        
-        if (!dbus_message_get_args(
-                message, &error,
-                DBUS_TYPE_INT32, &interface,
-                DBUS_TYPE_INT32, &protocol,
-                DBUS_TYPE_INT32, &aprotocol,
-                DBUS_TYPE_STRING, &address,
-                DBUS_TYPE_STRING, &name,
-                DBUS_TYPE_INT32, &flags,
-                DBUS_TYPE_INVALID) ||
-            dbus_error_is_set (&error)) {
-            fprintf(stderr, "Failed to parse resolver event.\n");
-            goto fail;
+    switch (event) {
+        case AVAHI_RESOLVER_FOUND: {
+            int32_t interface, protocol, aprotocol;
+            uint32_t flags;
+            char *name, *address;
+            AvahiAddress a;
+            
+            if (!dbus_message_get_args(
+                    message, &error,
+                    DBUS_TYPE_INT32, &interface,
+                    DBUS_TYPE_INT32, &protocol,
+                    DBUS_TYPE_INT32, &aprotocol,
+                    DBUS_TYPE_STRING, &address,
+                    DBUS_TYPE_STRING, &name,
+                    DBUS_TYPE_UINT32, &flags,
+                    DBUS_TYPE_INVALID) ||
+                dbus_error_is_set (&error)) {
+                fprintf(stderr, "Failed to parse resolver event.\n");
+                goto fail;
+            }
+            
+            assert(address);
+            if (!avahi_address_parse(address, (AvahiProtocol) aprotocol, &a)) {
+                fprintf(stderr, "Failed to parse address\n");
+                goto fail;
+            }
+            
+            r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, (AvahiProtocol) aprotocol, &a, name, (AvahiLookupResultFlags) flags, r->userdata);
+            break;
         }
-        
-        assert(address);
-        if (!avahi_address_parse(address, (AvahiProtocol) aprotocol, &a)) {
-            fprintf(stderr, "Failed to parse address\n");
-            goto fail;
+
+        case AVAHI_RESOLVER_FAILURE: {
+            char *etxt;
+            
+            if (!dbus_message_get_args(
+                    message, &error,
+                    DBUS_TYPE_STRING, &etxt,
+                    DBUS_TYPE_INVALID) ||
+                dbus_error_is_set (&error)) {
+                fprintf(stderr, "Failed to parse resolver event.\n");
+                goto fail;
+            }
+            
+            avahi_client_set_errno(r->client, avahi_error_dbus_to_number(etxt));
+            r->callback(r, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, event, AVAHI_PROTO_UNSPEC, NULL, NULL, 0, r->userdata);
+            break;
         }
-    
-        r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, (AvahiProtocol) aprotocol, &a, name, (AvahiLookupResultFlags) flags, r->userdata);
-    } else
-        r->callback(r, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, event, AVAHI_PROTO_UNSPEC, NULL, NULL, 0, r->userdata);
+    }
 
     return DBUS_HANDLER_RESULT_HANDLED;
     
@@ -583,9 +642,10 @@ AvahiAddressResolver * avahi_address_resolver_new(
     void *userdata) {
 
     DBusError error;
-    AvahiAddressResolver *r;
+    AvahiAddressResolver *r = NULL;
     DBusMessage *message = NULL, *reply = NULL;
-    int32_t i_interface, i_protocol, i_flags;
+    int32_t i_interface, i_protocol;
+    uint32_t u_flags;
     char *path;
     
     assert(client);
@@ -616,14 +676,14 @@ AvahiAddressResolver * avahi_address_resolver_new(
 
     i_interface = (int32_t) interface;
     i_protocol = (int32_t) protocol;
-    i_flags = (int32_t) flags;
+    u_flags = (uint32_t) flags;
 
     if (!(dbus_message_append_args(
               message,
               DBUS_TYPE_INT32, &i_interface,
               DBUS_TYPE_INT32, &i_protocol,
               DBUS_TYPE_STRING, &address,
-              DBUS_TYPE_INT32, &i_flags,
+              DBUS_TYPE_UINT32, &u_flags,
               DBUS_TYPE_INVALID))) {
         avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY);
         goto fail;