aboutsummaryrefslogtreecommitdiffstats
path: root/bitlbee.c
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2006-07-14 11:34:56 +0200
committerWilmer van der Gaast <wilmer@gaast.net>2006-07-14 11:34:56 +0200
commiteda02703ff32d461105f0f3ca49264b7c91c5ba3 (patch)
tree0bcc7bd2cd7b8e4f0c92fca9bc651288b0f5f624 /bitlbee.c
parent75a4b85ea060c5b63e9742ee9d1591bd618ba5c2 (diff)
parent639809488bb4ab59a4a4f15ef2d4cd34037a68a4 (diff)
Merging from main.
Diffstat (limited to 'bitlbee.c')
-rw-r--r--bitlbee.c43
1 files changed, 31 insertions, 12 deletions
diff --git a/bitlbee.c b/bitlbee.c
index cbad61dc..5870bbad 100644
--- a/bitlbee.c
+++ b/bitlbee.c
@@ -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" );