memset(&saddr, 0, sizeof(saddr));
if (use_ipv6) {
struct sockaddr_in6 *sin6ptr = (struct sockaddr_in6 *)&saddr;
+ int v6only = 1;
/* Initialize sockaddr for bind */
sin6ptr->sin6_family = family;
sin6ptr->sin6_addr = in6addr_any;
sin6ptr->sin6_port = htons(*port);
+ /* Make sure we only listen to IPv6 addresses */
+ setsockopt(server_fd, IPPROTO_IPV6, IPV6_V6ONLY,
+ (char *) &v6only, sizeof(v6only));
+
socklen = sizeof(*sin6ptr);
ret = bind(server_fd, (struct sockaddr *)sin6ptr, socklen);
if (ret == -1) {
length = -1;
for (ptr=result; ptr!=NULL; ptr=ptr->ai_next) {
- if (family == ptr->ai_family && dstlen >= ptr->ai_addrlen) {
+ if (family == ptr->ai_family && (unsigned int)dstlen >= ptr->ai_addrlen) {
memcpy(dst, ptr->ai_addr, ptr->ai_addrlen);
length = ptr->ai_addrlen;
break;