diff options
author | Wilmer van der Gaast <wilmer@gaast.net> | 2006-07-14 11:34:56 +0200 |
---|---|---|
committer | Wilmer van der Gaast <wilmer@gaast.net> | 2006-07-14 11:34:56 +0200 |
commit | eda02703ff32d461105f0f3ca49264b7c91c5ba3 (patch) | |
tree | 0bcc7bd2cd7b8e4f0c92fca9bc651288b0f5f624 /bitlbee.c | |
parent | 75a4b85ea060c5b63e9742ee9d1591bd618ba5c2 (diff) | |
parent | 639809488bb4ab59a4a4f15ef2d4cd34037a68a4 (diff) |
Merging from main.
Diffstat (limited to 'bitlbee.c')
-rw-r--r-- | bitlbee.c | 43 |
1 files changed, 31 insertions, 12 deletions
@@ -38,17 +38,25 @@ static gboolean bitlbee_io_new_client( gpointer data, gint fd, b_input_condition int bitlbee_daemon_init() { #ifdef IPV6 - struct sockaddr_in6 listen_addr; -#else - struct sockaddr_in listen_addr; + int use_ipv6 = 1; + struct sockaddr_in6 listen_addr6; #endif + struct sockaddr_in listen_addr; int i; FILE *fp; log_link( LOGLVL_ERROR, LOGOUTPUT_SYSLOG ); log_link( LOGLVL_WARNING, LOGOUTPUT_SYSLOG ); - global.listen_socket = socket( AF_INETx, SOCK_STREAM, 0 ); +#ifdef IPV6 + if( ( global.listen_socket = socket( AF_INET6, SOCK_STREAM, 0 ) ) == -1 ) + { + use_ipv6 = 0; +#endif + global.listen_socket = socket( AF_INET, SOCK_STREAM, 0 ); +#ifdef IPV6 + } +#endif if( global.listen_socket == -1 ) { log_error( "socket" ); @@ -60,13 +68,21 @@ int bitlbee_daemon_init() setsockopt( global.listen_socket, SOL_SOCKET, SO_REUSEADDR, &i, sizeof( i ) ); #ifdef IPV6 - listen_addr.sin6_family = AF_INETx; - listen_addr.sin6_port = htons( global.conf->port ); - i = inet_pton( AF_INETx, ipv6_wrap( global.conf->iface ), &listen_addr.sin6_addr ); -#else - listen_addr.sin_family = AF_INETx; - listen_addr.sin_port = htons( global.conf->port ); - i = inet_pton( AF_INETx, global.conf->iface, &listen_addr.sin_addr ); + listen_addr6.sin6_family = AF_INET6; + listen_addr6.sin6_port = htons( global.conf->port ); + if( ( i = inet_pton( AF_INET6, ipv6_wrap( global.conf->iface ), &listen_addr6.sin6_addr ) ) != 1 ) + { + /* Forget about IPv6 in this function. */ + use_ipv6 = 0; +#endif + listen_addr.sin_family = AF_INET; + listen_addr.sin_port = htons( global.conf->port ); + if( strcmp( global.conf->iface, "::" ) == 0 ) + i = inet_pton( AF_INET, "0.0.0.0", &listen_addr.sin_addr ); + else + i = inet_pton( AF_INET, global.conf->iface, &listen_addr.sin_addr ); +#ifdef IPV6 + } #endif if( i != 1 ) @@ -75,7 +91,10 @@ int bitlbee_daemon_init() return( -1 ); } - i = bind( global.listen_socket, (struct sockaddr *) &listen_addr, sizeof( listen_addr ) ); +#ifdef IPV6 + if( !use_ipv6 || ( i = bind( global.listen_socket, (struct sockaddr *) &listen_addr6, sizeof( listen_addr6 ) ) ) == -1 ) +#endif + i = bind( global.listen_socket, (struct sockaddr *) &listen_addr, sizeof( listen_addr ) ); if( i == -1 ) { log_error( "bind" ); |