diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c5664b6..62503237 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -313,19 +313,14 @@ if (LWS_WITH_SQLITE3) endif() -# FIXME: This must be runtime-only option. # The base dir where the test-apps look for the SSL certs. set(LWS_OPENSSL_CLIENT_CERTS ../share CACHE PATH "Server SSL certificate directory") if (WIN32) set(LWS_OPENSSL_CLIENT_CERTS . CACHE PATH "Client SSL certificate directory") - if (LWS_IPV6) - set(LWS_IPV6 OFF) - message(WARNING "IPv6 does not currently work on Windows!") - endif() - if (LWS_UNIX_SOCK) + if (LWS_UNIX_SOCK) set(LWS_UNIX_SOCK OFF) - message(WARNING "Windows does not support UNIX domain sockets") + message(WARNING "Windows does not support UNIX domain sockets") endif() else() set(LWS_OPENSSL_CLIENT_CERTS /etc/pki/tls/certs/ CACHE PATH "Client SSL certificate directory") diff --git a/lib/client-handshake.c b/lib/client-handshake.c index acb8044b..5da5c219 100644 --- a/lib/client-handshake.c +++ b/lib/client-handshake.c @@ -101,6 +101,8 @@ lws_client_connect_2(struct lws *wsi) memcpy(&server_addr6.sin6_addr, &((struct sockaddr_in6 *)result->ai_addr)->sin6_addr, sizeof(struct in6_addr)); + server_addr6.sin6_scope_id = ((struct sockaddr_in6 *)result->ai_addr)->sin6_scope_id; + server_addr6.sin6_flowinfo = ((struct sockaddr_in6 *)result->ai_addr)->sin6_flowinfo; break; default: lwsl_err("Unknown address family\n"); diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c index 560219f9..3bd48fbd 100755 --- a/lib/libwebsockets.c +++ b/lib/libwebsockets.c @@ -1769,10 +1769,10 @@ lws_socket_bind(struct lws_vhost *vhost, lws_sockfd_type sockfd, int port, #endif struct sockaddr_in serv_addr4; #ifndef LWS_PLAT_OPTEE - socklen_t len = sizeof(struct sockaddr); + socklen_t len = sizeof(struct sockaddr_storage); #endif int n; - struct sockaddr_in sin; + struct sockaddr_storage sin; struct sockaddr *v; #ifdef LWS_USE_UNIX_SOCK @@ -1804,6 +1804,7 @@ lws_socket_bind(struct lws_vhost *vhost, lws_sockfd_type sockfd, int port, return -1; } +#ifndef WIN32 if (iface) { struct ifaddrs *addrs, *addr; char ip[NI_MAXHOST]; @@ -1835,6 +1836,7 @@ lws_socket_bind(struct lws_vhost *vhost, lws_sockfd_type sockfd, int port, } freeifaddrs(addrs); } +#endif serv_addr6.sin6_family = AF_INET6; serv_addr6.sin6_port = htons(port); @@ -1877,7 +1879,13 @@ lws_socket_bind(struct lws_vhost *vhost, lws_sockfd_type sockfd, int port, lwsl_warn("getsockname: %s\n", strerror(LWS_ERRNO)); else #endif - port = ntohs(sin.sin_port); +#if defined(LWS_USE_IPV6) + port = (sin.ss_family == AF_INET6) ? + ntohs(((struct sockaddr_in6 *) &sin)->sin6_port) : + ntohs(((struct sockaddr_in *) &sin)->sin_port); +#else + port = ntohs(((struct sockaddr_in *) &sin)->sin_port); +#endif #endif return port; diff --git a/lib/server.c b/lib/server.c index 89730415..c93877ec 100644 --- a/lib/server.c +++ b/lib/server.c @@ -2004,7 +2004,7 @@ lws_server_socket_service(struct lws_context *context, struct lws *wsi, lws_sockfd_type accept_fd = LWS_SOCK_INVALID; struct allocated_headers *ah; #if LWS_POSIX - struct sockaddr_in cli_addr; + struct sockaddr_storage cli_addr; socklen_t clilen; #endif int n, len; @@ -2251,8 +2251,17 @@ try_pollout: lws_plat_set_socket_options(wsi->vhost, accept_fd); - lwsl_debug("accepted new conn port %u on fd=%d\n", - ntohs(cli_addr.sin_port), accept_fd); +#if defined(LWS_USE_IPV6) + lwsl_debug("accepted new conn port %u on fd=%d\n", + ((cli_addr.ss_family == AF_INET6) ? + ntohs(((struct sockaddr_in6 *) &cli_addr)->sin6_port) : + ntohs(((struct sockaddr_in *) &cli_addr)->sin_port)), + accept_fd); +#else + lwsl_debug("accepted new conn port %u on fd=%d\n", + ntohs(((struct sockaddr_in *) &cli_addr)->sin_port), + accept_fd); +#endif #else /* not very beautiful... */