- /* first, check if this is a numeric address */
- if ( ( (domain == AF_UNSPEC) || (domain == AF_INET) ) &&
- (0 == inet_pton (AF_INET,
- hostname,
- &v4.sin_addr)) )
- {
- callback (callback_cls,
- (const struct sockaddr*) &v4,
- sizeof(v4));
- if ( (domain == AF_UNSPEC) &&
- (0 == inet_pton (AF_INET6,
- hostname,
- &v6.sin6_addr)) )
- {
- /* this can happen on some systems IF "hostname" is "localhost" */
- callback (callback_cls,
- (const struct sockaddr*) &v6,
- sizeof(v6));
- }
- callback (callback_cls, NULL, 0);
- return;
- }
- if ( ( (domain == AF_UNSPEC) ||(domain == AF_INET) ) &&
- (0 == inet_pton (AF_INET6,
- hostname,
- &v6.sin6_addr)) )
- {
- callback (callback_cls,
- (const struct sockaddr*) &v6,
- sizeof(v6));
- callback (callback_cls, NULL, 0);
- return;
- }
- check_config (cfg);
- /* then, check if this is a loopback address */
- i = 0;
- while (loopback[i] != NULL)
- if (0 == strcmp (loopback[i++], hostname))
- {
- v4.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
- v6.sin6_addr = in6addr_loopback;
- switch (domain)
- {
- case AF_INET:
- callback (callback_cls,
- (const struct sockaddr*) &v4,
- sizeof(v4));
- break;
- case AF_INET6:
- callback (callback_cls,
- (const struct sockaddr*) &v6,
- sizeof(v6));
- break;
- case AF_UNSPEC:
- callback (callback_cls,
- (const struct sockaddr*) &v6,
- sizeof(v6));
- callback (callback_cls,
- (const struct sockaddr*) &v4,
- sizeof(v4));
- break;
- }
- callback (callback_cls, NULL, 0);
- return;
- }
- slen = strlen (hostname) + 1;
- if (slen + sizeof (struct GNUNET_RESOLVER_GetMessage) >
- GNUNET_SERVER_MAX_MESSAGE_SIZE)
- {
- GNUNET_break (0);
- callback (callback_cls, NULL, 0);
- return;
- }
- client = GNUNET_CLIENT_connect (sched, "resolver", cfg);
- if (client == NULL)
- {
- callback (callback_cls, NULL, 0);
- return;
- }
- msg = GNUNET_malloc (sizeof (struct GNUNET_RESOLVER_GetMessage) + slen);
- msg->header.size =
- htons (sizeof (struct GNUNET_RESOLVER_GetMessage) + slen);
- msg->header.type = htons (GNUNET_MESSAGE_TYPE_RESOLVER_REQUEST);
- msg->direction = htonl (GNUNET_NO);
- msg->domain = htonl (domain);
- memcpy (&msg[1], hostname, slen);
- actx = GNUNET_malloc (sizeof (struct GetAddressContext));
- actx->callback = callback;
- actx->cls = callback_cls;
- actx->client = client;
- actx->timeout = GNUNET_TIME_relative_to_absolute (timeout);
- actx->msg = msg;
-
-#if DEBUG_RESOLVER
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Resolver requests DNS resolution of hostname `%s'.\n"),
- hostname);
-#endif
- if (NULL ==
- GNUNET_CLIENT_notify_transmit_ready (client,
- slen +
- sizeof (struct
- GNUNET_RESOLVER_GetMessage),
- timeout, &transmit_get_ip, actx))
- {
- GNUNET_free (msg);
- GNUNET_free (actx);
- callback (callback_cls, NULL, 0);
- GNUNET_CLIENT_disconnect (client);
- return;
- }