#include <stdio.h>
#include <descrip.h>
#include <lnmdef.h>
#include <psldef.h>
#include "nstype.h"

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

int strlen(), sys$trnlnm(), find_server(), nslookup(), lib$set_symbol();
char *strcpy();

struct itemlistcell {
  unsigned short buffer_length;
  unsigned short item_code;
  unsigned buffer_addr;
  unsigned return_addr;
};

say(format, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)
  char *format, *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9, *p10;
{
  printf(format, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
}

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

extern void exit(int);
extern int setup_qio_hooks(char *);

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

  if (!setup_qio_hooks("disk$userdisk1:[mas0.masdough.irc]"))
    exit(0);
  ip_d.dsc$a_pointer = str;
  ip_d.dsc$b_dtype = DSC$K_DTYPE_T;
  ip_d.dsc$b_class = DSC$K_CLASS_S;
#ifdef MULTINET
  if (!(get_logical("UCX$INET_HOST", host) ||
        get_logical("ARPANET_HOST_NAME", host) ||
        get_logical("TCPIP_HOSTNAME", host) ))
  {
    (void)say("Enter your hostname: ");
    (void)gets(host);
  }
  else (void)say("You hostname is [%s]\n", host);
#else
#ifdef UCX
  if (!(get_logical("UCX$INET_HOST", host1) &&
        get_logical("UCX$BIND_DOMAIN", domain)))
  {
    (void)say("Enter your hostname: ");
    (void)gets(host);
  }
  else {
    if (!strstr(host1, "."))
      (void)sprintf(host, "%s.%s\0", host1, domain);
    else
      (void)strcpy(host, host1);
    (void)say("You hostname is [%s]\n", host);
  }
#endif
#endif

  while (!find_server(host, ip)) {
    (void)say("Enter your full hostname: ");
    (void)gets(host);
  }
  (void)sprintf(str, "%d.%d.%d.%d\0", ip[0], ip[1], ip[2], ip[3]);

  ip_d.dsc$w_length = strlen(str);
  while (!nslookup(str, host, ip)) {
    (void)say("Please enter your full host *name*.\n");
    (void)say("Hostname [ex. ubvms.cc.buffalo.edu]? ");
    (void)gets(host);
  }
  (void)sprintf(str2, "%u.%u.%u.%u\0", ip[0], ip[1], ip[2], ip[3]);
  (void)say("Default nameserver for %s (%s) is %s\n", host, str2, str);
  (void)lib$set_symbol(&sym_d, &ip_d, 0);
}
