]> git.meshlink.io Git - catta/commitdiff
* add address resolver
authorLennart Poettering <lennart@poettering.net>
Fri, 20 May 2005 23:22:54 +0000 (23:22 +0000)
committerLennart Poettering <lennart@poettering.net>
Fri, 20 May 2005 23:22:54 +0000 (23:22 +0000)
git-svn-id: file:///home/lennart/svn/public/avahi/trunk@82 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe

avahi-core/Makefile.am
avahi-core/core.h
avahi-core/resolve-address.c [new file with mode: 0644]
avahi-core/server.c
avahi-core/server.h

index 3aeb08da08dc42e36b756a45cf0141c6c91a66ef..42ad9c47db44f99e42a8225a550813f68dd4f2f6 100644 (file)
@@ -58,7 +58,8 @@ libavahi_core_la_SOURCES = \
        strlst.c strlst.h \
        rrlist.c rrlist.h \
        alternative.c alternative.h \
-       resolve-host-name.c
+       resolve-host-name.c \
+       resolve-address.c
 
 prioq_test_SOURCES = \
        prioq-test.c  \
index e1927b66d6986eb66e90b9829c53130cad5a628a..e800a389baf83a3936628e44af55be55a1b7d09b 100644 (file)
@@ -212,19 +212,25 @@ typedef enum {
 } AvahiBrowserEvent;
 
 typedef struct AvahiRecordResolver AvahiRecordResolver;
-typedef struct AvahiHostNameResolver AvahiHostNameResolver;
-typedef struct AvahiReverseHostNameResolver AvahiReverseHostNameResolver;
-typedef struct AvahiDomainBrowser AvahiDomainBrowser;
-typedef struct AvahiServiceTypeBrowser AvahiServiceTypeBrowser;
-typedef struct AvahiServiceBrowser AvahiServiceBrowser;
-typedef struct AvahiServiceResolver AvahiServiceResolver;
-
 typedef void (*AvahiRecordResolverCallback)(AvahiRecordResolver *r, gint interface, guchar protocol, AvahiBrowserEvent event, AvahiRecord *record, gpointer userdata);
 AvahiRecordResolver *avahi_record_resolver_new(AvahiServer *server, gint interface, guchar protocol, AvahiKey *key, AvahiRecordResolverCallback callback, gpointer userdata);
 void avahi_record_resolver_free(AvahiRecordResolver *r);
 
+typedef struct AvahiHostNameResolver AvahiHostNameResolver;
 typedef void (*AvahiHostNameResolverCallback)(AvahiHostNameResolver *r, gint interface, guchar protocol, AvahiBrowserEvent event, const gchar *host_name, const AvahiAddress *a, gpointer userdata);
 AvahiHostNameResolver *avahi_host_name_resolver_new(AvahiServer *server, gint interface, guchar protocol, const gchar *host_name, AvahiHostNameResolverCallback calback, gpointer userdata);
 void avahi_host_name_resolver_free(AvahiHostNameResolver *r);
 
+typedef struct AvahiAddressResolver AvahiAddressResolver;
+typedef void (*AvahiAddressResolverCallback)(AvahiAddressResolver *r, gint interface, guchar protocol, AvahiBrowserEvent event, const AvahiAddress *a, const gchar *host_name, gpointer userdata);
+AvahiAddressResolver *avahi_address_resolver_new(AvahiServer *server, gint interface, guchar protocol, const AvahiAddress *address, AvahiAddressResolverCallback calback, gpointer userdata);
+void avahi_address_resolver_free(AvahiAddressResolver *r);
+
+/* not yet implemented */
+
+typedef struct AvahiDomainBrowser AvahiDomainBrowser;
+typedef struct AvahiServiceTypeBrowser AvahiServiceTypeBrowser;
+typedef struct AvahiServiceBrowser AvahiServiceBrowser;
+typedef struct AvahiServiceResolver AvahiServiceResolver;
+
 #endif
diff --git a/avahi-core/resolve-address.c b/avahi-core/resolve-address.c
new file mode 100644 (file)
index 0000000..cba30ac
--- /dev/null
@@ -0,0 +1,90 @@
+/* $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 <config.h>
+#endif
+
+#include "resolve.h"
+#include "util.h"
+
+struct AvahiAddressResolver {
+    AvahiServer *server;
+    AvahiAddress address;
+    
+    AvahiRecordResolver *record_resolver;
+
+    AvahiAddressResolverCallback callback;
+    gpointer userdata;
+
+    AVAHI_LLIST_FIELDS(AvahiAddressResolver, resolver);
+};
+
+static void record_resolver_callback(AvahiRecordResolver*rr, gint interface, guchar protocol, AvahiBrowserEvent event, AvahiRecord *record, gpointer userdata) {
+    AvahiAddressResolver *r = userdata;
+
+    g_assert(rr);
+    g_assert(record);
+    g_assert(r);
+
+    r->callback(r, interface, protocol, event, &r->address, record->data.ptr.name, r->userdata);
+}
+
+AvahiAddressResolver *avahi_address_resolver_new(AvahiServer *server, gint interface, guchar protocol, const AvahiAddress *address, AvahiAddressResolverCallback callback, gpointer userdata) {
+    AvahiAddressResolver *r;
+    AvahiKey *k;
+    gchar *n;
+
+    g_assert(server);
+    g_assert(address);
+    g_assert(callback);
+
+    g_assert(address->family == AF_INET || address->family == AF_INET6);
+
+    r = g_new(AvahiAddressResolver, 1);
+    r->server = server;
+    r->address = *address;
+    r->callback = callback;
+    r->userdata = userdata;
+
+    if (address->family == AF_INET)
+        n = avahi_reverse_lookup_name_ipv4(&address->data.ipv4);
+    else 
+        n = avahi_reverse_lookup_name_ipv6_arpa(&address->data.ipv6);
+    
+    k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_PTR);
+    g_free(n);
+    
+    r->record_resolver = avahi_record_resolver_new(server, interface, protocol, k, record_resolver_callback, r);
+    avahi_key_unref(k);
+
+    AVAHI_LLIST_PREPEND(AvahiAddressResolver, resolver, server->address_resolvers, r);
+    
+    return r;
+}
+
+void avahi_address_resolver_free(AvahiAddressResolver *r) {
+    g_assert(r);
+
+    AVAHI_LLIST_REMOVE(AvahiAddressResolver, resolver, r->server->address_resolvers, r);
+    avahi_record_resolver_free(r->record_resolver);
+    g_free(r);
+}
index 3e9baaf5134a3d50572a6d65300ce6771e91b152..644bb168c5002ecf19faa62f8812fdfce9c4f09d 100644 (file)
@@ -953,6 +953,7 @@ AvahiServer *avahi_server_new(GMainContext *c, const AvahiServerConfig *sc, Avah
     AVAHI_LLIST_HEAD_INIT(AvahiRecordResolver, s->record_resolvers);
     s->record_resolver_hashtable = g_hash_table_new((GHashFunc) avahi_key_hash, (GEqualFunc) avahi_key_equal);
     AVAHI_LLIST_HEAD_INIT(AvahiHostNameResolver, s->host_name_resolvers);
+    AVAHI_LLIST_HEAD_INIT(AvahiAddressResolver, s->address_resolvers);
 
     /* Get host name */
     s->host_name = s->config.host_name ? avahi_normalize_name(s->config.host_name) : avahi_get_host_name();
@@ -993,7 +994,8 @@ void avahi_server_free(AvahiServer* s) {
 
     while (s->host_name_resolvers)
         avahi_host_name_resolver_free(s->host_name_resolvers);
-    
+    while (s->address_resolvers)
+        avahi_address_resolver_free(s->address_resolvers);
     while (s->record_resolvers)
         avahi_record_resolver_free(s->record_resolvers);
     g_hash_table_destroy(s->record_resolver_hashtable);
index 0f0fde2117bb9909c26d85779a20a424b8ca20fa..41a691e4c52040f6d604926f26eb0e51520beaaf 100644 (file)
@@ -78,6 +78,7 @@ struct AvahiServer {
     AVAHI_LLIST_HEAD(AvahiRecordResolver, record_resolvers);
     GHashTable *record_resolver_hashtable;
     AVAHI_LLIST_HEAD(AvahiHostNameResolver, host_name_resolvers);
+    AVAHI_LLIST_HEAD(AvahiAddressResolver, address_resolvers);
 
     gboolean need_entry_cleanup, need_group_cleanup;