*/
#include "platform.h"
#include "gnunet_getopt_lib.h"
+#include "gnunet_os_lib.h"
#include "gnunet_client_lib.h"
#include "gnunet_protocols.h"
#include "gnunet_resolver_service.h"
*/
struct GNUNET_CLIENT_Connection *client;
- /**
- * Our scheduler.
- */
- struct GNUNET_SCHEDULER_Handle *sched;
-
/**
* Name of the host that we are resolving.
*/
case AF_INET:
if (salen != sizeof (struct sockaddr_in))
return NULL;
- inet_ntop (AF_INET,
- &((struct sockaddr_in *) sa)->sin_addr,
- inet4, INET_ADDRSTRLEN);
+ if (NULL ==
+ inet_ntop (AF_INET,
+ &((struct sockaddr_in *) sa)->sin_addr,
+ inet4, INET_ADDRSTRLEN))
+ {
+ GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "inet_ntop");
+ return NULL;
+ }
ret = GNUNET_strdup (inet4);
break;
case AF_INET6:
if (salen != sizeof (struct sockaddr_in6))
return NULL;
- inet_ntop (AF_INET6,
- &((struct sockaddr_in6 *) sa)->sin6_addr,
- inet6, INET6_ADDRSTRLEN);
+ if (NULL ==
+ inet_ntop (AF_INET6,
+ &((struct sockaddr_in6 *) sa)->sin6_addr,
+ inet6, INET6_ADDRSTRLEN))
+ {
+ GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "inet_ntop");
+ return NULL;
+ }
ret = GNUNET_strdup (inet6);
break;
default:
const struct sockaddr *sa;
socklen_t salen;
-
if (msg == NULL)
{
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _("Timeout trying to resolve hostname.\n"));
+ _("Timeout trying to resolve hostname `%s'.\n"),
+ rh->hostname);
rh->addr_callback (rh->cls, NULL, 0);
- GNUNET_CLIENT_disconnect (rh->client);
+ GNUNET_CLIENT_disconnect (rh->client, GNUNET_NO);
GNUNET_free (rh);
return;
}
{
GNUNET_break (0);
rh->addr_callback (rh->cls, NULL, 0);
- GNUNET_CLIENT_disconnect (rh->client);
+ GNUNET_CLIENT_disconnect (rh->client, GNUNET_NO);
GNUNET_free (rh);
return;
}
{
#if DEBUG_RESOLVER
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Received end message resolving hostname.\n"));
+ _("Received end message resolving hostname `%s'.\n"),
+ rh->hostname);
#endif
rh->addr_callback (rh->cls, NULL, 0);
- GNUNET_CLIENT_disconnect (rh->client);
+ GNUNET_CLIENT_disconnect (rh->client, GNUNET_NO);
GNUNET_free (rh);
return;
}
{
GNUNET_break (0);
rh->addr_callback (rh->cls, NULL, 0);
- GNUNET_CLIENT_disconnect (rh->client);
+ GNUNET_CLIENT_disconnect (rh->client, GNUNET_NO);
GNUNET_free (rh);
return;
}
#if DEBUG_RESOLVER
{
char *ips = no_resolve (sa, salen);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Resolver returns `%s'.\n", ips);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Resolver returns `%s' for `%s'.\n", ips,
+ rh->hostname);
GNUNET_free (ips);
}
#endif
/**
* Convert a string to one or more IP addresses.
*
- * @param sched scheduler to use
* @param cfg configuration to use
* @param hostname the hostname to resolve
* @param domain AF_INET or AF_INET6; use AF_UNSPEC for "any"
* @return handle that can be used to cancel the request, NULL on error
*/
struct GNUNET_RESOLVER_RequestHandle *
-GNUNET_RESOLVER_ip_get (struct GNUNET_SCHEDULER_Handle *sched,
- const struct GNUNET_CONFIGURATION_Handle *cfg,
+GNUNET_RESOLVER_ip_get (const struct GNUNET_CONFIGURATION_Handle *cfg,
const char *hostname,
int domain,
struct GNUNET_TIME_Relative timeout,
unsigned int i;
struct in_addr v4;
struct in6_addr v6;
- char buf[GNUNET_SERVER_MAX_MESSAGE_SIZE];
+ char buf[GNUNET_SERVER_MAX_MESSAGE_SIZE - 1];
check_config (cfg);
slen = strlen (hostname) + 1;
- if (slen + sizeof (struct GNUNET_RESOLVER_GetMessage) >
- GNUNET_SERVER_MAX_MESSAGE_SIZE)
+ if (slen + sizeof (struct GNUNET_RESOLVER_GetMessage) >= GNUNET_SERVER_MAX_MESSAGE_SIZE)
{
GNUNET_break (0);
return NULL;
}
rh = GNUNET_malloc (sizeof (struct GNUNET_RESOLVER_RequestHandle) + slen);
- rh->sched = sched;
rh->domain = domain;
rh->addr_callback = callback;
rh->cls = callback_cls;
&v6)) &&
((domain == AF_INET6) || (domain == AF_UNSPEC))))
{
- rh->task = GNUNET_SCHEDULER_add_delayed (sched,
- GNUNET_TIME_UNIT_ZERO,
- &numeric_resolution, rh);
+ rh->task = GNUNET_SCHEDULER_add_now (&numeric_resolution, rh);
return rh;
}
/* then, check if this is a loopback address */
while (loopback[i] != NULL)
if (0 == strcasecmp (loopback[i++], hostname))
{
- rh->task = GNUNET_SCHEDULER_add_delayed (sched,
- GNUNET_TIME_UNIT_ZERO,
- &loopback_resolution, rh);
+ rh->task = GNUNET_SCHEDULER_add_now (&loopback_resolution, rh);
return rh;
}
- client = GNUNET_CLIENT_connect (sched, "resolver", cfg);
+ client = GNUNET_CLIENT_connect ("resolver", cfg);
if (client == NULL)
{
GNUNET_free (rh);
&handle_address_response, rh))
{
GNUNET_free (rh);
- GNUNET_CLIENT_disconnect (client);
+ GNUNET_CLIENT_disconnect (client, GNUNET_NO);
return NULL;
}
return rh;
if (msg == NULL)
{
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _("Timeout trying to resolve IP address.\n"));
+ _("Timeout trying to resolve IP address `%s'.\n"),
+ GNUNET_a2s ((const void*) &rh[1], rh->salen));
rh->name_callback (rh->cls, NULL);
- GNUNET_CLIENT_disconnect (rh->client);
+ GNUNET_CLIENT_disconnect (rh->client, GNUNET_NO);
GNUNET_free (rh);
return;
}
{
#if DEBUG_RESOLVER
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Received end message resolving IP address.\n"));
+ _("Received end message resolving IP address `%s'.\n"),
+ GNUNET_a2s ((const void*) &rh[1], rh->salen));
#endif
rh->name_callback (rh->cls, NULL);
- GNUNET_CLIENT_disconnect (rh->client);
+ GNUNET_CLIENT_disconnect (rh->client, GNUNET_NO);
GNUNET_free (rh);
return;
}
{
GNUNET_break (0);
rh->name_callback (rh->cls, NULL);
- GNUNET_CLIENT_disconnect (rh->client);
+ GNUNET_CLIENT_disconnect (rh->client, GNUNET_NO);
GNUNET_free (rh);
return;
}
#if DEBUG_RESOLVER
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Resolver returns `%s'.\n"), hostname);
+ _("Resolver returns `%s' for IP `%s'.\n"),
+ hostname,
+ GNUNET_a2s ((const void*) &rh[1], rh->salen));
#endif
rh->name_callback (rh->cls, hostname);
GNUNET_CLIENT_receive (rh->client,
/**
* Get an IP address as a string.
*
- * @param sched scheduler to use
* @param cfg configuration to use
* @param sa host address
* @param salen length of host address
* @return handle that can be used to cancel the request
*/
struct GNUNET_RESOLVER_RequestHandle *
-GNUNET_RESOLVER_hostname_get (struct GNUNET_SCHEDULER_Handle *sched,
- const struct GNUNET_CONFIGURATION_Handle *cfg,
+GNUNET_RESOLVER_hostname_get (const struct GNUNET_CONFIGURATION_Handle *cfg,
const struct sockaddr *sa,
socklen_t salen,
int do_resolve,
struct GNUNET_CLIENT_Connection *client;
struct GNUNET_RESOLVER_GetMessage *msg;
struct GNUNET_RESOLVER_RequestHandle *rh;
- char buf[GNUNET_SERVER_MAX_MESSAGE_SIZE];
+ char buf[GNUNET_SERVER_MAX_MESSAGE_SIZE - 1];
check_config (cfg);
rh = GNUNET_malloc (sizeof (struct GNUNET_RESOLVER_RequestHandle) + salen);
rh->name_callback = callback;
rh->cls = cls;
rh->timeout = GNUNET_TIME_relative_to_absolute (timeout);
- rh->sched = sched;
rh->salen = salen;
memcpy (&rh[1], sa, salen);
if (GNUNET_NO == do_resolve)
{
- rh->task = GNUNET_SCHEDULER_add_delayed (sched,
- GNUNET_TIME_UNIT_ZERO,
- &numeric_reverse, rh);
+ rh->task = GNUNET_SCHEDULER_add_now (&numeric_reverse, rh);
return rh;
}
- if (salen + sizeof (struct GNUNET_RESOLVER_GetMessage) >
- GNUNET_SERVER_MAX_MESSAGE_SIZE)
+ if (salen + sizeof (struct GNUNET_RESOLVER_GetMessage) >= GNUNET_SERVER_MAX_MESSAGE_SIZE)
{
GNUNET_break (0);
GNUNET_free (rh);
return NULL;
}
- client = GNUNET_CLIENT_connect (sched, "resolver", cfg);
+ client = GNUNET_CLIENT_connect ("resolver", cfg);
if (client == NULL)
{
GNUNET_free (rh);
GNUNET_YES,
&handle_hostname_response, rh))
{
- GNUNET_CLIENT_disconnect (client);
+ GNUNET_CLIENT_disconnect (client, GNUNET_NO);
GNUNET_free (rh);
return NULL;
}
/**
- * Perform a reverse DNS lookup.
+ * 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.
*
- * @param sched scheduler to use
* @param cfg configuration to use
* @param domain AF_INET or AF_INET6; use AF_UNSPEC for "any"
* @param callback function to call with addresses
* @return handle that can be used to cancel the request, NULL on error
*/
struct GNUNET_RESOLVER_RequestHandle *
-GNUNET_RESOLVER_hostname_resolve (struct GNUNET_SCHEDULER_Handle *sched,
- const struct GNUNET_CONFIGURATION_Handle
+GNUNET_RESOLVER_hostname_resolve (const struct GNUNET_CONFIGURATION_Handle
*cfg, int domain,
struct GNUNET_TIME_Relative timeout,
GNUNET_RESOLVER_AddressCallback callback,
void *cls)
{
- char hostname[MAX_HOSTNAME];
+ char hostname[GNUNET_OS_get_hostname_max_length() + 1];
check_config (cfg);
if (0 != gethostname (hostname, sizeof (hostname) - 1))
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
_("Resolving our hostname `%s'\n"), hostname);
#endif
- return GNUNET_RESOLVER_ip_get (sched,
- cfg, hostname, domain, timeout, callback,
+ return GNUNET_RESOLVER_ip_get (cfg, hostname, domain, timeout, callback,
cls);
}
GNUNET_RESOLVER_request_cancel (struct GNUNET_RESOLVER_RequestHandle *h)
{
if (h->client != NULL)
- GNUNET_CLIENT_disconnect (h->client);
+ GNUNET_CLIENT_disconnect (h->client, GNUNET_NO);
if (h->task != GNUNET_SCHEDULER_NO_TASK)
- GNUNET_SCHEDULER_cancel (h->sched, h->task);
+ GNUNET_SCHEDULER_cancel (h->task);
GNUNET_free (h);
}