/*
    Copyright (C) 1991, Marcus J. Ranum. All rights reserved.
*/

#include    "os.h"

#define STREAMPORT      6889

#define ENVHOST     "MUDWHOSERVER"
#define ENVPORT     "MUDWHOPORT"


int main (int ac, char *av[])
{
  struct sockaddr_in addr;
  struct hostent *hp;
  SOCKET fd;
  char *p;
  int red;
  char rbuf[1024];
  char *srv = (char *) 0;
  int portnum = STREAMPORT;

  /* setup host address */
  if (ac > 1)
    srv = av[1];
  else
    srv = getenv (ENVHOST);


  /* setup port # if we can */
  if (ac > 2) {
    portnum = atoi (av[2]);
  } else {
    if ((p = getenv (ENVPORT)) != (char *) 0)
      portnum = atoi (p);
  }


  if (srv == (char *) 0) {
    fprintf (stderr, "usage: hostname [or envir %s]\n", ENVHOST);
    exit (1);
  }

  p = srv;
  while (*p != '\0' && (*p == '.' || isdigit ((int)*p)))
    p++;

  WIN32STARTUP
  /* not all digits or dots */
  if (*p != '\0') {
#ifndef NO_HUGE_RESOLVER_CODE
    if ((hp = gethostbyname (srv)) == (struct hostent *) 0) {
      fprintf (stderr, "unknown host %s\n", srv);
      exit (1);
    }

    (void) bcopy (hp->h_addr, (char *) &addr.sin_addr, hp->h_length);
#else
    fprintf (stderr, "must use numerical notation for host name\n");
    exit (1);
#endif
  } else {
    unsigned long f;

    if ((f = inet_addr (srv)) == INADDR_NONE) {
      fprintf (stderr, "unknown host %s\n", srv);
      exit (1);
    }
    (void) bcopy ((char *) &f, (char *) &addr.sin_addr, sizeof (f));
  }

  addr.sin_port = htons (portnum);
  addr.sin_family = AF_INET;

  if ((fd = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
    perror ("socket");
    WIN32CLEANUP
    exit (1);
  }

  if (connect (fd, (struct sockaddr*)&addr, sizeof (addr)) == SOCKET_ERROR) {
    perror ("connect");
    WIN32CLEANUP
    exit (1);
  }

  while ((red = recv (fd, rbuf, sizeof (rbuf), 0)) > 0)
    send (1, rbuf, red, 0);
  WIN32CLEANUP
  exit (0);
}