From ff4f6bf87626cdc1674e0c0c52c3692212c61116 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 20 May 2005 23:22:54 +0000 Subject: * add address resolver git-svn-id: file:///home/lennart/svn/public/avahi/trunk@82 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe --- avahi-core/Makefile.am | 3 +- avahi-core/core.h | 20 ++++++---- avahi-core/resolve-address.c | 90 ++++++++++++++++++++++++++++++++++++++++++++ avahi-core/server.c | 4 +- avahi-core/server.h | 1 + 5 files changed, 109 insertions(+), 9 deletions(-) create mode 100644 avahi-core/resolve-address.c (limited to 'avahi-core') diff --git a/avahi-core/Makefile.am b/avahi-core/Makefile.am index 3aeb08d..42ad9c4 100644 --- a/avahi-core/Makefile.am +++ b/avahi-core/Makefile.am @@ -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 \ diff --git a/avahi-core/core.h b/avahi-core/core.h index e1927b6..e800a38 100644 --- a/avahi-core/core.h +++ b/avahi-core/core.h @@ -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 index 0000000..cba30ac --- /dev/null +++ b/avahi-core/resolve-address.c @@ -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 +#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); +} diff --git a/avahi-core/server.c b/avahi-core/server.c index 3e9baaf..644bb16 100644 --- a/avahi-core/server.c +++ b/avahi-core/server.c @@ -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); diff --git a/avahi-core/server.h b/avahi-core/server.h index 0f0fde2..41a691e 100644 --- a/avahi-core/server.h +++ b/avahi-core/server.h @@ -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; -- cgit