Source Code: http://www.divineblood.org/snippets/dnslookup.c
Last Modified: Fri Dec 17, 2004 1:03pm
Download without markup
Download as zipfile
#include <pthread.h>
#include <netdb.h>
#include <malloc.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#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;
}