Divine Blood
You are not logged in.


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;
}

© 2005 Divine Blood Staff -- Web page by Palrich (palrichatgmail.com)