pdirt/data/
pdirt/data/HELP/
pdirt/data/HELP/0/
pdirt/data/HELP/F/
pdirt/data/HELP/G/
pdirt/data/HELP/H/
pdirt/data/HELP/J/
pdirt/data/HELP/K/
pdirt/data/HELP/O/
pdirt/data/HELP/Q/
pdirt/data/HELP/R/
pdirt/data/HELP/U/
pdirt/data/HELP/V/
pdirt/data/HELP/Y/
pdirt/data/HELP/Z/
pdirt/data/MESSAGES/
pdirt/data/POWERINFO/
pdirt/data/WIZ_ZONES/
pdirt/drv/
pdirt/drv/bin/
pdirt/drv/compiler/converter/
pdirt/drv/compiler/libs/
pdirt/drv/compiler/scripts/
pdirt/drv/include/AberChat/
pdirt/drv/include/InterMud/
pdirt/drv/include/machine/
pdirt/drv/src/InterMud/
pdirt/drv/src/Players/
pdirt/drv/utils/UAFPort/
pdirt/drv/utils/dnsresolv/
pdirt/drv/utils/gdbm/
#define S_SOCKET_C

#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
#include <fcntl.h>
#include "kernel.h"
#include "config.h"
#include "s_socket.h"
#include "log.h"
#include <unistd.h>
#include <string.h>

int make_service (short unsigned int port,
		  char *my_hostname,
		  int my_hostnamelen,
		  struct hostent **hp,
		  struct sockaddr_in *sin)
{
  int s, i;
  struct hostent *h;
  
  if (gethostname (my_hostname, my_hostnamelen) < 0)
    {
      return -1;		/* Error in hostname? */
    }
  if ((*hp = h = gethostbyname (my_hostname)) == NULL)
    {
      return -2;		/* Error in gethostbyname */
    }
  bzero (sin, sizeof (struct sockaddr_in));
  sin->sin_family = AF_INET;
  sin->sin_port = htons (port);
  bcopy ((char *) h->h_addr_list[0], (char *) (&(sin->sin_addr)), h->h_length);
  if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0)
    {
      return -3;		/* Error in socket call */
    }
  i = 2;
  if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR, &i, sizeof (i)) == -1)
  {
      progerror ("setsockopt(reuseaddr)");
  }
#if 0
  /* Make service addition */
  i = 58000;
  if (setsockopt (s, SOL_SOCKET, SO_SNDBUF, &i, sizeof(i)) == -1)
  {   progerror("setsockopt(sndbuf)");
  }
#endif
  if (bind (s, (struct sockaddr *)sin, sizeof (*sin)) < 0)
    {
      close (s);
      return -4;		/* Error in bind. */
    }
  if (listen (s, 5) != 0)
    {
      close (s);
      return -5;		/* Error in listen */
    }
  if (fcntl (s, F_SETFL, O_NDELAY) == -1)
    {
      close (s);
      return -6;		/* Error in fcntl */
    }
  return s;
}

int makesock(char *addr, int port)
{
  int s, opt = 1;
  struct hostent *host;
  struct sockaddr_in client;

  host = gethostbyname(addr);
  if (!host) return(-1);

  client.sin_family = AF_INET;
  client.sin_port = htons(port);
  client.sin_addr = (*(struct in_addr*)host->h_addr_list[0]);

  if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    return -1;

  if (setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)) < 0)
  {  close(s);
     return -1;
  }

  if (connect(s, (struct sockaddr *) &client, sizeof(client)) == -1)
  {  close(s);
    return(-1);
  }

  if (fcntl(s, F_SETFL, O_NONBLOCK) == -1)
  {  close(s);
     return -1;
  }
  return(s);
}