void ares_gethostbyname(ares_channel channel, const char *name, int family, ares_host_callback callback, void *arg) { struct host_query *hquery; /* Right now we only know how to look up Internet addresses - and unspec means try both basically. */ switch (family) { case AF_INET: case AF_INET6: case AF_UNSPEC: break; default: callback(arg, ARES_ENOTIMP, 0, NULL); return; } if (fake_hostent(name, family, callback, arg)) return; /* Allocate and fill in the host query structure. */ hquery = ares_malloc(sizeof(struct host_query)); if (!hquery) { callback(arg, ARES_ENOMEM, 0, NULL); return; } hquery->channel = channel; hquery->name = ares_strdup(name); hquery->want_family = family; hquery->sent_family = -1; /* nothing is sent yet */ if (!hquery->name) { ares_free(hquery); callback(arg, ARES_ENOMEM, 0, NULL); return; } hquery->callback = callback; hquery->arg = arg; hquery->remaining_lookups = channel->lookups; hquery->timeouts = 0; /* Start performing lookups according to channel->lookups. */ next_lookup(hquery, ARES_ECONNREFUSED /* initial error code */); }
void ares_gethostbyname(ares_channel channel, const char *name, int family, ares_host_callback callback, void *arg) { struct host_query *hquery; /* See if request can be handled by local pseudo-domain DNS */ if (ares_local_gethostbyname(channel, name, family, callback, arg)) { return; } /* Right now we only know how to look up Internet addresses. */ if (family != AF_INET) { callback(arg, ARES_ENOTIMP, NULL); return; } if (fake_hostent(name, callback, arg)) return; /* Allocate and fill in the host query structure. */ hquery = malloc(sizeof(struct host_query)); if (!hquery) { callback(arg, ARES_ENOMEM, NULL); return; } hquery->channel = channel; hquery->name = strdup(name); if (!hquery->name) { free(hquery); callback(arg, ARES_ENOMEM, NULL); return; } hquery->callback = callback; hquery->arg = arg; hquery->remaining_lookups = channel->lookups; /* Start performing lookups according to channel->lookups. */ next_lookup(hquery); }