#include <netdb.h>
#include <unistd.h>
#include <stddef.h>
#include <strings.h>
#include <sys/socket.h>
#define LISTENQ 1024
int
tcp_listen(const char *host, const char *serv, socklen_t *addrlenp)
{
int listenfd, n;
const int on = ;
struct addrinfo hints, *res, *ressave;
bzero(&hints, sizeof(struct addrinfo));
hints.ai_flags = AI_PASSIVE;
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if ( (n = getaddrinfo(host, serv, &hints, &res)) != ) {
err_quit (
"tcp_listen error for %s, %s: %s",
host, serv, gai_strerror(n)
);
}
ressave = res;
do {
listenfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (listenfd < ) {
continue; /* error, try next one */
}
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
if (bind(listenfd, res->ai_addr, res->ai_addrlen) == ) {
break; /* success */
}
close(listenfd); /* bind error, close and try next one */
} while ( (res = res->ai_next) != NULL);
if (res == NULL) { /* errno from final socket() or bind() */
err_sys("tcp_listen error for %s, %s", host, serv);
}
listen(listenfd, LISTENQ);
if (addrlenp) {
*addrlenp = res->ai_addrlen; /* return size of protocol address */
}
freeaddrinfo(ressave);
return(listenfd);
}