- /* 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));
- 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);
+ v6.sin6_addr = in6addr_loopback;
+ switch (rh->af)
+ {
+ case AF_INET:
+ rh->addr_callback (rh->cls, (const struct sockaddr *) &v4, sizeof (v4));
+ break;
+ case AF_INET6:
+ rh->addr_callback (rh->cls, (const struct sockaddr *) &v6, sizeof (v6));
+ break;
+ case AF_UNSPEC:
+ rh->addr_callback (rh->cls, (const struct sockaddr *) &v6, sizeof (v6));
+ rh->addr_callback (rh->cls, (const struct sockaddr *) &v4, sizeof (v4));
+ break;
+ default:
+ GNUNET_break (0);
+ break;
+ }
+ rh->addr_callback (rh->cls, NULL, 0);
+ GNUNET_free (rh);
+}
+
+
+/**
+ * Task executed on system shutdown.
+ */
+static void
+shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ s_task = GNUNET_SCHEDULER_NO_TASK;
+ GNUNET_RESOLVER_disconnect ();
+}
+
+
+/**
+ * Process pending requests to the resolver.
+ */
+static void
+process_requests ()
+{
+ struct GNUNET_RESOLVER_GetMessage *msg;
+ char buf[GNUNET_SERVER_MAX_MESSAGE_SIZE - 1] GNUNET_ALIGN;
+ struct GNUNET_RESOLVER_RequestHandle *rh;
+
+ if (NULL == client)
+ {
+ reconnect ();
+ return;
+ }
+ rh = req_head;
+ if (NULL == rh)
+ {
+ /* nothing to do, release socket really soon if there is nothing
+ * else happening... */
+ s_task =
+ GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MILLISECONDS,
+ &shutdown_task, NULL);
+ return;
+ }
+ if (GNUNET_YES == rh->was_transmitted)
+ return; /* waiting for reply */
+ msg = (struct GNUNET_RESOLVER_GetMessage *) buf;