static int prepareInetQueue (int socket) { if (setSocketReuseAddress(socket)) return 1; return 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); } }