From 5a85013ee94a838a2438a3bd1dedec1b78cc68a6 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Thu, 22 Apr 2010 11:18:48 +0000 Subject: [PATCH] --- src/util/resolver_api.c | 32 +++++++++++++++++++++++++ src/util/test_resolver_api.c | 46 ++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/src/util/resolver_api.c b/src/util/resolver_api.c index f4844a490..6d874cce8 100644 --- a/src/util/resolver_api.c +++ b/src/util/resolver_api.c @@ -692,6 +692,38 @@ GNUNET_RESOLVER_local_hostname_get ( ) return GNUNET_strdup (hostname); } +/** + * Get local fully qualified domain name + * @return fqdn + */ +char * +GNUNET_RESOLVER_local_fqdn_get ( void ) +{ + struct hostent *host; + char hostname[GNUNET_OS_get_hostname_max_length() + 1]; + + + if (0 != gethostname (hostname, sizeof (hostname) - 1)) + { + GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR | + GNUNET_ERROR_TYPE_BULK, "gethostname"); + return NULL; + } +#if DEBUG_RESOLVER + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + _("Resolving our FQDN `%s'\n"), hostname); +#endif + host = gethostbyname ( hostname ); + if ( NULL == host) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Could not resolve our FQDN : %s\n"), + hstrerror (h_errno)); + return NULL; + } + return GNUNET_strdup (host->h_name); +} + /** * Looking our own hostname. * diff --git a/src/util/test_resolver_api.c b/src/util/test_resolver_api.c index af8ecdeec..d0831bf49 100644 --- a/src/util/test_resolver_api.c +++ b/src/util/test_resolver_api.c @@ -127,6 +127,44 @@ check_127(void *cls, const struct sockaddr *sa, socklen_t salen) } } +static void +check_local_fqdn(void *cls, const char *gnunet_fqdn) +{ + int result = 0; + + struct hostent *host; + char hostname[GNUNET_OS_get_hostname_max_length() + 1]; + + if (0 != gethostname (hostname, sizeof (hostname) - 1)) + { + GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR | + GNUNET_ERROR_TYPE_BULK, "gethostname"); + return NULL; + } +#if DEBUG_RESOLVER + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + _("Resolving our FQDN `%s'\n"), hostname); +#endif + host = gethostbyname ( hostname ); + if ( NULL == host) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Could not resolve our FQDN : %s %u\n"), + hstrerror (h_errno), h_errno); + return NULL; + } + + GNUNET_assert( 0 != host); + + result = strcmp(host->h_name, gnunet_fqdn); + if ( 0 != result ) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Local resolved and resolver resolved fqdns are not equal\n"); + } + GNUNET_assert( 0 == result); +} + static void check_local_hostname(void *cls, const char *hostname) { @@ -219,6 +257,7 @@ run(void *cls, struct GNUNET_SCHEDULER_Handle *sched, char * const *args, GNUNET_TIME_UNIT_MILLISECONDS, 2500); int count_ips = 0; char * own_hostname; + char * own_fqdn; memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; @@ -239,6 +278,13 @@ run(void *cls, struct GNUNET_SCHEDULER_Handle *sched, char * const *args, check_local_hostname( NULL, own_hostname); GNUNET_free (own_hostname); + /* + * Looking up our own fqdn + */ + own_fqdn = GNUNET_RESOLVER_local_fqdn_get(); + check_local_fqdn( NULL, own_fqdn); + GNUNET_free_non_null (own_fqdn); + /* * Testing non-local DNS resolution * DNS rootserver to test: a.root-servers.net - 198.41.0.4 -- 2.25.1