Browse Source

Some IPv6 fixes for the client

bel 10 years ago
parent
commit
01a890f9bb
1 changed files with 13 additions and 2 deletions
  1. 13 2
      src/civetweb.c

+ 13 - 2
src/civetweb.c

@@ -4973,6 +4973,7 @@ static int connect_socket(struct mg_context *ctx /* may be null */,
 	if ((ip_ver == 4) &&
 	    (connect(*sock, (struct sockaddr *)&sa->sin, sizeof(sa->sin)) == 0)) {
 		/* connected with IPv4 */
+		sa->sin.sin_port = port;
 		return 1;
 	}
 
@@ -4980,6 +4981,7 @@ static int connect_socket(struct mg_context *ctx /* may be null */,
 	if ((ip_ver == 6) &&
 	    (connect(*sock, (struct sockaddr *)&sa->sin6, sizeof(sa->sin6)) == 0)) {
 		/* connected with IPv6 */
+		sa->sin6.sin6_port = port;
 		return 1;
 	}
 #endif
@@ -9507,17 +9509,26 @@ struct mg_connection *mg_connect_client(
 		conn = NULL;
 #endif /* NO_SSL */
 	} else {
-		socklen_t len = sizeof(struct sockaddr);
+		socklen_t len = (sa.sa.sa_family == AF_INET)
+		                    ? sizeof(conn->client.rsa.sin)
+		                    : sizeof(conn->client.rsa.sin6);
+		struct sockaddr *psa =
+		    (sa.sa.sa_family == AF_INET)
+		        ? (struct sockaddr *)&(conn->client.rsa.sin)
+		        : (struct sockaddr *)&(conn->client.rsa.sin6);
 		conn->buf_size = MAX_REQUEST_SIZE;
 		conn->buf = (char *)(conn + 1);
 		conn->ctx = &fake_ctx;
 		conn->client.sock = sock;
-		if (getsockname(sock, &conn->client.rsa.sa, &len) != 0) {
+		conn->client.lsa = sa;
+
+		if (getsockname(sock, psa, &len) != 0) {
 			mg_cry(conn,
 			       "%s: getsockname() failed: %s",
 			       __func__,
 			       strerror(ERRNO));
 		}
+
 		conn->client.is_ssl = use_ssl ? 1 : 0;
 		(void)pthread_mutex_init(&conn->mutex, NULL);
 #ifndef NO_SSL