/* Listen on IPv6 and IPv4 addresses */
struct addrinfo *ai, *ai_iter;
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG | AI_NUMERICSERV;
hints.ai_socktype = SOCK_STREAM;
char portstr[6];
sprintf(portstr, "%u", lportn);
logmsg(LOG_DEBUG,"Calling getaddrinfo(NULL,%s)", portstr);
int e = getaddrinfo(NULL, portstr, &hints, &ai);
logmsg(LOG_DEBUG,"got %d from getaddrinfo", e);
if (e)
{
logmsg(LOG_ERR,"Can't getaddrinfo - %s ", gai_strerror(e));
return -1;
}
for (nfds = 0, ai_iter = ai ; ai_iter != NULL && nfds < MAX_SOCKETS; ai_iter = ai_iter->ai_next )
{
#if 1
logmsg(LOG_DEBUG,"getaddrinfo: family %u, next %p", ai_iter->ai_family, ai_iter->ai_next);
logmsg(LOG_DEBUG," : socktype %x, protocol %x, addrlen %u", ai_iter->ai_socktype, ai_iter->ai_protocol, ai_iter->ai_addrlen);
if (ai_iter->ai_family == AF_INET) {
struct sockaddr_in *sin = ai_iter->ai_addr;
logmsg(LOG_DEBUG," : addr %s, port %u", inet_ntoa(sin->sin_addr), ntohs(sin->sin_port));
} else {
struct sockaddr_in6 *sin6 = ai_iter->ai_addr;
char localaddr[64];
inet_ntop(sin6->sin6_family, &sin6->sin6_addr, localaddr, sizeof(localaddr));
logmsg(LOG_DEBUG," : addr %s, port %u", localaddr, ntohs(sin6->sin6_port));
}
#endif
if((SockFDs[nfds].fd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0)
{
logmsg(LOG_ERR,"Error creating socket.");
fatal();
}
logmsg(LOG_DEBUG,"Created socket[%d], fd is %d", nfds, SockFDs[nfds].fd);
if (setsockopt(SockFDs[nfds].fd, SOL_SOCKET, SO_REUSEADDR, (void*)&one, sizeof(one)))
logmsg(LOG_ERR,"Error setting socket options");
void *aptr;
if (ai_iter->ai_family == AF_INET6)
aptr = &(((struct sockaddr_in6 *)ai_iter->ai_addr)->sin6_addr);
else
{
aptr = &(((struct sockaddr_in *)ai_iter->ai_addr)->sin_addr);
}
logmsg(LOG_DEBUG,"Going to bind socket #%d (fd %d): addr %s (len %d)",nfds, SockFDs[nfds].fd, inet_ntop(ai_iter->ai_family, aptr, hbuf, sizeof(hbuf)), ai_iter->ai_addrlen);
if (bind(SockFDs[nfds].fd, ai_iter->ai_addr, ai_iter->ai_addrlen) < 0)
{
logmsg(LOG_ERR,"Error binding socket (%d): %s", nfds, strerror(errno));
fatal();
}
else
{
logmsg(LOG_INFO,"Waiting for connections (%d).", nfds);
if (listen(SockFDs[nfds].fd,5) < 0)
{
logmsg(LOG_ERR,"Error listening socket: %s", strerror(errno));
fatal();
}
++nfds;
}
freeaddrinfo(ai);
}