#include #include #include #include #include #include #include #include "merc.h" typedef struct dns_lookup { char *ip; char *domain; struct dns_lookup *next; } dns_lookup; dns_lookup *dns_list = NULL; void *thread_body(void *arg) { int h_errnop = 0; struct in_addr address; struct hostent result, *from; char buf[4192]; dns_lookup *dns = (dns_lookup *)arg; inet_aton(dns->ip, &address); gethostbyaddr_r(&address, sizeof(address), AF_INET, &result, buf, sizeof(buf), &from, &h_errnop); if (from) dns->domain = strdup(result.h_name); return 0; } char *host_lookup(char *ip) { dns_lookup *dnsl; pthread_attr_t attr; pthread_t thread; while (isspace(*ip)) ip++; for (dnsl = dns_list; dnsl; dnsl = dnsl->next) if (!str_cmp(dnsl->ip, ip)) { return dnsl->domain ? dnsl->domain : dnsl->ip; } pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); dnsl = (dns_lookup *)malloc(sizeof(dns_lookup)); dnsl->ip = strdup(ip); dnsl->domain = NULL; dnsl->next = dns_list; dns_list = dnsl; pthread_create(&thread, &attr, thread_body, dnsl); return ip; }