+/* Internal context for async resolving */
+typedef struct {
+ SilcNetResolveCallback completion;
+ void *context;
+ bool prefer_ipv6;
+ SilcSchedule schedule;
+ char *input;
+ char *result;
+} *SilcNetResolveContext;
+
+SILC_TASK_CALLBACK(silc_net_resolve_completion)
+{
+ SilcNetResolveContext r = (SilcNetResolveContext)context;
+
+ /* Call the completion callback */
+ if (r->completion)
+ (*r->completion)(r->result, r->context);
+
+ silc_free(r->input);
+ silc_free(r->result);
+ silc_free(r);
+}
+
+/* Thread function to resolve the address for hostname. */
+
+static void *silc_net_gethostbyname_thread(void *context)
+{
+ SilcNetResolveContext r = (SilcNetResolveContext)context;
+ SilcSchedule schedule = r->schedule;
+ char tmp[64];
+
+ if (silc_net_gethostbyname(r->input, r->prefer_ipv6, tmp, sizeof(tmp)))
+ r->result = strdup(tmp);
+
+ silc_schedule_task_add(schedule, 0, silc_net_resolve_completion, r, 0, 1,
+ SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
+ silc_schedule_wakeup(schedule);
+ return NULL;
+}
+
+/* Thread function to resolve the hostname for address. */
+
+static void *silc_net_gethostbyaddr_thread(void *context)
+{
+ SilcNetResolveContext r = (SilcNetResolveContext)context;
+ SilcSchedule schedule = r->schedule;
+ char tmp[256];
+
+ if (silc_net_gethostbyaddr(r->input, tmp, sizeof(tmp)))
+ r->result = strdup(tmp);
+
+ silc_schedule_task_add(schedule, 0, silc_net_resolve_completion, r, 0, 1,
+ SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
+ silc_schedule_wakeup(schedule);
+ return NULL;
+}
+