idirt-1.82d/
idirt-1.82d/bin/
idirt-1.82d/data/LOGS/
idirt-1.82d/data/POLICY/
idirt-1.82d/data/WIZ_ZONES/
idirt-1.82d/doc/
idirt-1.82d/doc/info/
idirt-1.82d/doc/manual/
idirt-1.82d/src/Ident/
idirt-1.82d/src/utils/
idirt-1.82d/utils/
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
#include <fcntl.h>
#include <string.h>
#include "kernel.h"
#include "s_socket.h"

#ifndef NULL
#define NULL ((void *) 0)
#endif

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 (h->h_addr_list[0], &(sin->sin_addr), h->h_length);

  if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
    return -3;			/* Error in socket call */
  }
  /* Bug fix for hanging sockets. Socket options need to be set before
   * the bind takes place or they dont do ANY good.
   */
  i = 2;
  setsockopt (s, SOL_SOCKET, SO_REUSEADDR, &i, sizeof (i));

  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 */
  }
  /* Set non-blocking IO: */

  if (fcntl (s, F_SETFL, O_NDELAY) == -1) {
    close (s);
    return -6;			/* Error in fcntl */
  }
  return s;
}