#include <stdio.h>
#include <descrip.h>
#include <lnmdef.h>
#include <stdarg.h>
#ifdef __GNUC__
#define PSL$C_USER 3
#else
#include <psldef.h>
#endif
#include <string.h>
#include <stdlib.h>
#include <lib$routines.h>
#include "nstype.h"
#include "debug.h"
#include "types.h"
#include "qio.h"

#ifndef FALSE
#define FALSE 0
#define TRUE (!FALSE)
#endif

extern int find_server(char *, DOMAIN, int), nslookup();

#if 1
void say(char *format, char *p1, char *p2, char *p3, char *p4, char *p5,
         char *p6, char *p7, char *p8)
{
  char str[240];
  printf(format, p1, p2, p3, p4, p5, p6, p7, p8);
  printf("\n");
}

#else

void say(char *format, ...)
{
  va_list arglist;
  va_start(arglist, format);
  vprintf(format, arglist);
  va_end(arglist);
}
#endif

int get_logical(name, translation)
  char *name, *translation;
{
  $DESCRIPTOR(table_d, "LNM$SYSTEM");
  struct dsc$descriptor_s name_d;
  struct itemlistcell il[2];
  char buffer[255];
  unsigned status, len=0;
  int flag1 = LNM$M_CASE_BLIND, flag2 = PSL$C_USER;
  extern int sys$trnlnm();

  name_d.dsc$b_dtype = DSC$K_DTYPE_T;
  name_d.dsc$b_class = DSC$K_CLASS_S;
  name_d.dsc$a_pointer = name;

  il[0].buffer_length = sizeof(buffer)-1;
  il[0].item_code = LNM$_STRING;
  il[0].buffer_addr = (unsigned)buffer;
  il[0].return_addr = (unsigned)(&len);
  il[1].buffer_length = 0;
  il[1].item_code = 0;
  il[1].buffer_length = 0;
  il[1].buffer_length = 0;
  name_d.dsc$w_length = strlen(name);
  status = sys$trnlnm(&flag1, &table_d, &name_d, &flag2, il);
  if (!(status&1)) return FALSE;
  if (len==0) return FALSE;
  buffer[len] = 0;
  (void)strcpy(translation, buffer);
  return TRUE;
}

#ifdef USE_RELOC_QIO
extern int setup_qio_hooks();
#endif

int main(argc, argv)
  int argc;
  char *argv[];
{
  DOMAIN ip;
  $DESCRIPTOR(sym_d, "NAME_SERVER");
  int loop, passed = 0, count = 0;
  char str2[80];
  char str[80], host[80], domain[80], *host_ptr;
  struct dsc$descriptor_s ip_d;
  unsigned status, len=0;

#ifdef USE_RELOC_QIO
  if (!setup_qio_hooks("disk$userdisk1:[mas0.masdough.irc]"))
    exit(0);
#endif
  ip_d.dsc$a_pointer = str;
  ip_d.dsc$b_dtype = DSC$K_DTYPE_T;
  ip_d.dsc$b_class = DSC$K_CLASS_S;
  if (argc>1) {
    strcpy(host, argv[1]);
    passed = 1;
  } else {
    if (tcp_gethostname(host)==-1)
    {
      printf("Enter your hostname: ");
      gets(host);
    }
    else printf("You hostname is [%s]\n", host);
  }

  while (!find_server(host, ip, !passed) && (count++ < 10)) {
    printf("Enter your full hostname: ");
    if (!gets(host))
    {
      printf("not running at a terminal??\n");
      exit(0);
    }
  }
  (void)sprintf(str, "%d.%d.%d.%d\0", ip[0], ip[1], ip[2], ip[3]);
  ip_d.dsc$w_length = strlen(str);
  if (nslookup(str, host, ip)) 
    sprintf(str2, "%u.%u.%u.%u\0", ip[0], ip[1], ip[2], ip[3]);
  else strcpy(str2, "*unknown*");
  (void)printf("Default nameserver for %s (%s) is %s\n", host, str2, str);
  (void)lib$set_symbol(&sym_d, &ip_d, 0);
}
