Exemplo n.º 1
0
static int
prepareInetQueue (int socket) {
  if (setSocketReuseAddress(socket)) return 1;
  return 0;
}
Exemplo n.º 2
0
static void setupServerSockets(
  const struct LinkedList* serverAddrInfoList,
  struct PollState* pollState)
{
  struct LinkedListNode* nodePtr;

  for (nodePtr = serverAddrInfoList->head;
       nodePtr;
       nodePtr = nodePtr->next)
  {
    const struct addrinfo* listenAddrInfo = nodePtr->data;
    struct AddrPortStrings serverAddrPortStrings;
    struct ServerSocketInfo* serverSocketInfo =
      checkedMalloc(sizeof(struct ServerSocketInfo));

    if (addressToNameAndPort(listenAddrInfo->ai_addr,
                             listenAddrInfo->ai_addrlen,
                             &serverAddrPortStrings) < 0)
    {
      proxyLog("error resolving server listen address");
      exit(1);
    }

    serverSocketInfo->socket = socket(listenAddrInfo->ai_family,
                                      listenAddrInfo->ai_socktype,
                                      listenAddrInfo->ai_protocol);
    if (serverSocketInfo->socket < 0)
    {
      proxyLog("error creating server socket %s:%s",
               serverAddrPortStrings.addrString,
               serverAddrPortStrings.portString);
      exit(1);
    }

    if (setSocketReuseAddress(serverSocketInfo->socket) < 0)
    {
      proxyLog("setSocketReuseAddress error on server socket %s:%s",
               serverAddrPortStrings.addrString,
               serverAddrPortStrings.portString);
      exit(1);
    }

    if (bind(serverSocketInfo->socket,
             listenAddrInfo->ai_addr,
             listenAddrInfo->ai_addrlen) < 0)
    {
      proxyLog("bind error on server socket %s:%s",
               serverAddrPortStrings.addrString,
               serverAddrPortStrings.portString);
      exit(1);
    }

    if (setSocketListening(serverSocketInfo->socket) < 0)
    {
      proxyLog("listen error on server socket %s:%s",
               serverAddrPortStrings.addrString,
               serverAddrPortStrings.portString);
      exit(1);
    }

    if (setFDNonBlocking(serverSocketInfo->socket) < 0)
    {
      proxyLog("error setting non-blocking on server socket %s:%s",
               serverAddrPortStrings.addrString,
               serverAddrPortStrings.portString);
      exit(1);
    }

    proxyLog("listening on %s:%s (fd=%d)", 
             serverAddrPortStrings.addrString,
             serverAddrPortStrings.portString,
             serverSocketInfo->socket);

    addPollFDToPollState(
      pollState,
      serverSocketInfo->socket,
      serverSocketInfo,
      INTERESTED_IN_READ_EVENTS,
      NOT_INTERESTED_IN_WRITE_EVENTS);
  }
}