- ServerInstance->Logs->Log("SOCKET",DEBUG,"HandleEvent for Listensoket");
- socklen_t uslen, length; // length of our port number
- int incomingSockfd, in_port;
-
-#ifdef IPV6
- if (this->family == AF_INET6)
- {
- uslen = sizeof(sockaddr_in6);
- length = sizeof(sockaddr_in6);
- }
- else
-#endif
- {
- uslen = sizeof(sockaddr_in);
- length = sizeof(sockaddr_in);
- }
-
- incomingSockfd = ServerInstance->SE->Accept(this, (sockaddr*)client, &length);
-
- if ((incomingSockfd > -1) && (!ServerInstance->SE->GetSockName(this, sock_us, &uslen)))
- {
- char buf[MAXBUF];
- char target[MAXBUF];
-
- *target = *buf = '\0';
-
-#ifdef IPV6
- if (this->family == AF_INET6)
- {
- in_port = ntohs(((sockaddr_in6*)sock_us)->sin6_port);
- inet_ntop(AF_INET6, &((const sockaddr_in6*)client)->sin6_addr, buf, sizeof(buf));
- socklen_t raddrsz = sizeof(sockaddr_in6);
- if (getsockname(incomingSockfd, (sockaddr*) raddr, &raddrsz) == 0)
- inet_ntop(AF_INET6, &((const sockaddr_in6*)raddr)->sin6_addr, target, sizeof(target));
- else
- ServerInstance->Logs->Log("SOCKET", DEBUG, "Can't get peername: %s", strerror(errno));
- }
- else
-#endif
- {
- inet_ntop(AF_INET, &((const sockaddr_in*)client)->sin_addr, buf, sizeof(buf));
- in_port = ntohs(((sockaddr_in*)sock_us)->sin_port);
- socklen_t raddrsz = sizeof(sockaddr_in);
- if (getsockname(incomingSockfd, (sockaddr*) raddr, &raddrsz) == 0)
- inet_ntop(AF_INET, &((const sockaddr_in*)raddr)->sin_addr, target, sizeof(target));
- else
- ServerInstance->Logs->Log("SOCKET", DEBUG, "Can't get peername: %s", strerror(errno));
- }
- ServerInstance->SE->NonBlocking(incomingSockfd);
- ServerInstance->stats->statsAccept++;
- ServerInstance->Users->AddUser(ServerInstance, incomingSockfd, in_port, false, this->family, client, target);
- }
- else
- {
- ServerInstance->SE->Shutdown(incomingSockfd, 2);
- ServerInstance->SE->Close(incomingSockfd);
- ServerInstance->stats->statsRefused++;
- }
+ // recreate as a sockaddr_in using the IPv4 IP
+ uint16_t sport = client.in6.sin6_port;
+ client.in4.sin_family = AF_INET;
+ client.in4.sin_port = sport;
+ memcpy(&client.in4.sin_addr.s_addr, client.in6.sin6_addr.s6_addr + 12, sizeof(uint32_t));
+
+ sport = server.in6.sin6_port;
+ server.in4.sin_family = AF_INET;
+ server.in4.sin_port = sport;
+ memcpy(&server.in4.sin_addr.s_addr, server.in6.sin6_addr.s6_addr + 12, sizeof(uint32_t));