57 #include <sys/socket.h>
58 #include <netinet/in.h>
59 #include <arpa/inet.h>
61 #ifndef MAXHOSTNAMELEN
62 #include <sys/param.h>
82 int inet_listen(
const char *addr,
int backlog,
int block_mode)
85 struct addrinfo *res0;
92 const char *parse_err;
101 if ((parse_err =
host_port(buf, &host,
"", &port, (
char *) 0)) != 0)
111 for (res = res0; ; res = res->ai_next) {
117 msg_fatal(
"%s: host found but no usable address", addr);
122 if (strchr((
char *) proto_info->
sa_family_list, res->ai_family) != 0)
125 msg_info(
"skipping address family %d for %s", res->ai_family, addr);
133 &hostaddr, &portnum, 0);
140 if ((sock = socket(res->ai_family, res->ai_socktype, 0)) < 0)
143 #if defined(IPV6_V6ONLY) && !defined(BROKEN_AI_PASSIVE_NULL_HOST)
144 if (res->ai_family == AF_INET6
145 && setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY,
146 (
void *) &on,
sizeof(on)) < 0)
147 msg_fatal(
"setsockopt(IPV6_V6ONLY): %m");
150 if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
151 (
void *) &on,
sizeof(on)) < 0)
152 msg_fatal(
"setsockopt(SO_REUSEADDR): %m");
153 if (bind(sock, res->ai_addr, res->ai_addrlen) < 0) {
155 &hostaddr, &portnum, 0);
162 if (listen(sock, backlog) < 0)
171 struct sockaddr_storage ss;
174 return (
sane_accept(fd, (
struct sockaddr *) &ss, &ss_len));
void freeaddrinfo(struct addrinfo *ai)
char * mystrdup(const char *str)
int inet_listen(const char *addr, int backlog, int block_mode)
#define inet_proto_info()
#define hostname_to_sockaddr(host, serv, sock, res)
#define SOCKADDR_TO_HOSTADDR(sa, salen, host, port, sock)
void set_inet_windowsize(int sock, int windowsize)
char buf[MAI_HOSTADDR_STRSIZE]
unsigned char * sa_family_list
int sane_accept(int sock, struct sockaddr *sa, SOCKADDR_SIZE *len)
NORETURN msg_fatal(const char *fmt,...)
int non_blocking(int, int)
const char * host_port(char *buf, char **host, char *def_host, char **port, char *def_service)
char buf[MAI_SERVPORT_STRSIZE]
void msg_info(const char *fmt,...)