cdirt/ascii/
cdirt/data/BULL/
cdirt/data/ZONES/PENDING/
cdirt/pending/
cdirt/src/utils/
cdirt/utils/
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include "kernel.h"

#define NSERV_PORT 9001

int dnsfd = -1;
extern Boolean dns_output;
extern int unres_hosts;

void dnsboot(void) {
  dnsfd = makesock(_IPNAME_, NSERV_PORT);  
}

void send_dns(int fd) {
  static char dnsbuff[100];
  static char *bufloc = dnsbuff;
  int plx, nwrote, num_rslv;

  if (bufloc == dnsbuff) {                       /* grab next plr for dns */
    for (plx = 0 ; plx < max_players ; plx++)
      if (is_conn(plx) && !resolved(plx))
        break;

    sprintf(dnsbuff, "%-3d%-96s", plx, ip_addr(plx));
  }

  nwrote = write(fd, bufloc, 100 - (bufloc - dnsbuff));

  if (nwrote + (bufloc - dnsbuff) == 100) {     /* wrote 1 record */
    bufloc = dnsbuff;
    num_rslv = 0;

    for (plx = 0 ; plx < max_players ; plx++)   /* more to resolve? */
      if (is_conn(plx) && !resolved(plx))
        num_rslv++;

    if (num_rslv == 1)
      dns_output = False;
  }
  else
    bufloc += nwrote;
}

#ifdef IO_STATS
Boolean is_ipaddr(char *str) {
  char *p;

  for (p = str ; *p ; p++)
    if (!isdigit(*p) && *p != '.')
      return(False);

  return(True);
}
#endif

void read_dns(int fd)  {
  static char readbuff[100];
  static char *bufloc = readbuff;
  char hostbuff[100];
  int plx, n_read;

  if ((n_read = read(fd, bufloc, 100 - (bufloc - readbuff))) < 1) {
    close(dnsfd);
    dnsfd = -1;
    return;
  }

  if (n_read + (bufloc - readbuff) == 100) { 
    sscanf(readbuff, "%d %s", &plx, hostbuff);
    strcpy(hostname(plx), hostbuff);
    if (!strcmp(username(plx), ip_addr(plx)))
      strcpy(username(plx), hostbuff);

  #ifdef IO_STATS
    if (is_ipaddr(hostname(plx)))
      unres_hosts++;
  #endif

    resolved(plx) = True;
    bufloc = readbuff;
  }
  else
    bufloc += n_read;
}