Fixed IRC IPv6.

This commit is contained in:
lotodore
2007-10-08 15:04:02 +00:00
parent d0ccc68d1f
commit 9f698d6adc
+14 -15
View File
@@ -204,7 +204,8 @@ int irc_connect6 (irc_session_t * session,
{ {
#if defined (ENABLE_IPV6) #if defined (ENABLE_IPV6)
struct sockaddr_in6 saddr; struct sockaddr_in6 saddr;
struct addrinfo ainfo, *res; struct addrinfo ainfo, *res = NULL;
char portStr[64];
#if defined (_WIN32) #if defined (_WIN32)
int addrlen = sizeof(saddr); int addrlen = sizeof(saddr);
HMODULE hWsock; HMODULE hWsock;
@@ -212,6 +213,7 @@ int irc_connect6 (irc_session_t * session,
freeaddrinfo_ptr_t freeaddrinfo_ptr; freeaddrinfo_ptr_t freeaddrinfo_ptr;
int resolvesuccess = 0; int resolvesuccess = 0;
#endif #endif
itoa(port, portStr, 10);
// Check and copy all the specified fields // Check and copy all the specified fields
if ( !server || !nick ) if ( !server || !nick )
@@ -241,8 +243,6 @@ int irc_connect6 (irc_session_t * session,
memset( &saddr, 0, sizeof(saddr) ); memset( &saddr, 0, sizeof(saddr) );
saddr.sin6_family = AF_INET6; saddr.sin6_family = AF_INET6;
saddr.sin6_port = htons (port); saddr.sin6_port = htons (port);
saddr.sin6_flowinfo = 0;
saddr.sin6_scope_id = 0;
#if defined (_WIN32) #if defined (_WIN32)
if ( WSAStringToAddressA( (LPSTR)server, AF_INET6, NULL, (struct sockaddr *)&saddr, &addrlen ) == SOCKET_ERROR ) if ( WSAStringToAddressA( (LPSTR)server, AF_INET6, NULL, (struct sockaddr *)&saddr, &addrlen ) == SOCKET_ERROR )
@@ -251,8 +251,8 @@ int irc_connect6 (irc_session_t * session,
if (hWsock) if (hWsock)
{ {
// Determine functions at runtime, because windows systems < XP do not /* Determine functions at runtime, because windows systems < XP do not
// support getaddrinfo. * support getaddrinfo. */
getaddrinfo_ptr = (getaddrinfo_ptr_t)GetProcAddress(hWsock, "getaddrinfo"); getaddrinfo_ptr = (getaddrinfo_ptr_t)GetProcAddress(hWsock, "getaddrinfo");
freeaddrinfo_ptr = (freeaddrinfo_ptr_t)GetProcAddress(hWsock, "freeaddrinfo"); freeaddrinfo_ptr = (freeaddrinfo_ptr_t)GetProcAddress(hWsock, "freeaddrinfo");
@@ -262,13 +262,11 @@ int irc_connect6 (irc_session_t * session,
ainfo.ai_family = AF_INET6; ainfo.ai_family = AF_INET6;
ainfo.ai_socktype = SOCK_STREAM; ainfo.ai_socktype = SOCK_STREAM;
ainfo.ai_protocol = 0; ainfo.ai_protocol = 0;
ainfo.ai_addrlen = sizeof( saddr );
ainfo.ai_addr = (struct sockaddr *) &saddr;
if ( getaddrinfo_ptr(server, 0, &ainfo, &res) == 0); if ( getaddrinfo_ptr(server, portStr, &ainfo, &res) == 0 && res )
{ {
resolvesuccess = 1; resolvesuccess = 1;
memcpy( &saddr.sin6_addr, res->ai_addr, sizeof( saddr.sin6_addr ) ); memcpy( &saddr, res->ai_addr, res->ai_addrlen );
freeaddrinfo_ptr( res ); freeaddrinfo_ptr( res );
} }
} }
@@ -287,16 +285,14 @@ int irc_connect6 (irc_session_t * session,
ainfo.ai_family = AF_INET6; ainfo.ai_family = AF_INET6;
ainfo.ai_socktype = SOCK_STREAM; ainfo.ai_socktype = SOCK_STREAM;
ainfo.ai_protocol = 0; ainfo.ai_protocol = 0;
ainfo.ai_addrlen = sizeof( saddr );
ainfo.ai_addr = (struct sockaddr *) &saddr;
if ( getaddrinfo( server, 0, &ainfo, &res ) ) if ( getaddrinfo( server, portStr, &ainfo, &res ) || !res )
{ {
session->lasterror = LIBIRC_ERR_RESOLV; session->lasterror = LIBIRC_ERR_RESOLV;
return 1; return 1;
} }
memcpy( &saddr.sin6_addr, res->ai_addr, sizeof( saddr.sin6_addr ) ); memcpy( &saddr, res->ai_addr, res->ai_addrlen );
freeaddrinfo( res ); freeaddrinfo( res );
} }
#endif #endif
@@ -718,7 +714,7 @@ int irc_process_select_descriptors (irc_session_t * session, fd_set *in_set, fd_
{ {
// Now we have to determine whether the socket is connected // Now we have to determine whether the socket is connected
// or the connect is failed // or the connect is failed
struct sockaddr_in saddr, laddr; struct sockaddr_storage saddr, laddr;
socklen_t slen = sizeof(saddr); socklen_t slen = sizeof(saddr);
socklen_t llen = sizeof(laddr); socklen_t llen = sizeof(laddr);
@@ -731,7 +727,10 @@ int irc_process_select_descriptors (irc_session_t * session, fd_set *in_set, fd_
return 1; return 1;
} }
memcpy (&session->local_addr, &laddr.sin_addr, sizeof(session->local_addr)); if (saddr.ss_family == AF_INET)
memcpy (&session->local_addr, &((struct sockaddr_in *)&laddr)->sin_addr, sizeof(struct in_addr));
else
memcpy (&session->local_addr, &((struct sockaddr_in6 *)&laddr)->sin6_addr, sizeof(struct in_addr6));
#if defined (ENABLE_DEBUG) #if defined (ENABLE_DEBUG)
if ( IS_DEBUG_ENABLED(session) ) if ( IS_DEBUG_ENABLED(session) )