From d4efddfb7d34a8409cf78dd337f3933e0ed11d08 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 7 Apr 2010 03:39:20 +0100 Subject: Unset the IPV6_V6ONLY sockctl so listening on IPv6 will automatically also listen on IPv4 again. This should close #583 (and apparently also fix this assumption on many non-Linux systems). --- bitlbee.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'bitlbee.c') diff --git a/bitlbee.c b/bitlbee.c index 26d12b6c..8f7be698 100644 --- a/bitlbee.c +++ b/bitlbee.c @@ -69,6 +69,15 @@ int bitlbee_daemon_init() if( global.listen_socket < 0 ) continue; +#ifdef IPV6_V6ONLY + if( res->ai_family == AF_INET6 ) + { + i = 0; + setsockopt( global.listen_socket, IPPROTO_IPV6, IPV6_V6ONLY, + (char *) &i, sizeof( i ) ); + } +#endif + /* TIME_WAIT (?) sucks.. */ i = 1; setsockopt( global.listen_socket, SOL_SOCKET, SO_REUSEADDR, &i, sizeof( i ) ); @@ -79,7 +88,6 @@ int bitlbee_daemon_init() log_error( "bind" ); return( -1 ); } - break; } -- cgit v1.2.3 From 40bc82df007cb78b155a098dae86b1d5bc7cda9f Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 14 Apr 2010 00:20:36 +0200 Subject: Run setsid() when daemonizing. (Closes #581) --- bitlbee.c | 1 + 1 file changed, 1 insertion(+) (limited to 'bitlbee.c') diff --git a/bitlbee.c b/bitlbee.c index 8f7be698..c53f7216 100644 --- a/bitlbee.c +++ b/bitlbee.c @@ -114,6 +114,7 @@ int bitlbee_daemon_init() else if( i != 0 ) exit( 0 ); + setsid(); chdir( "/" ); if( getenv( "_BITLBEE_RESTART_STATE" ) == NULL ) -- cgit v1.2.3 From 156bbd7b66cf29220c2ff6a86217c4dec5e33765 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 14 Apr 2010 01:55:30 +0200 Subject: Log to stderr+syslog until daemonized. Current behaviour is too confusing and annoying. --- bitlbee.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'bitlbee.c') diff --git a/bitlbee.c b/bitlbee.c index c53f7216..2d543eba 100644 --- a/bitlbee.c +++ b/bitlbee.c @@ -41,8 +41,8 @@ int bitlbee_daemon_init() int i; FILE *fp; - log_link( LOGLVL_ERROR, LOGOUTPUT_SYSLOG ); - log_link( LOGLVL_WARNING, LOGOUTPUT_SYSLOG ); + log_link( LOGLVL_ERROR, LOGOUTPUT_CONSOLE ); + log_link( LOGLVL_WARNING, LOGOUTPUT_CONSOLE ); memset( &hints, 0, sizeof( hints ) ); hints.ai_family = PF_UNSPEC; @@ -145,6 +145,12 @@ int bitlbee_daemon_init() } #endif + if( !global.conf->nofork ) + { + log_link( LOGLVL_ERROR, LOGOUTPUT_SYSLOG ); + log_link( LOGLVL_WARNING, LOGOUTPUT_SYSLOG ); + } + return( 0 ); } -- cgit v1.2.3 From f9ed3113c4bc5110171295abef9c140e1328aeb1 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 14 Apr 2010 21:08:23 +0200 Subject: getaddrinfo(NULL) may return an IPv4 address first but we should definitely prefer IPv6. --- bitlbee.c | 76 ++++++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 28 deletions(-) (limited to 'bitlbee.c') diff --git a/bitlbee.c b/bitlbee.c index 2d543eba..89e33223 100644 --- a/bitlbee.c +++ b/bitlbee.c @@ -35,6 +35,43 @@ static gboolean bitlbee_io_new_client( gpointer data, gint fd, b_input_condition condition ); +static gboolean try_listen( struct addrinfo *res ) +{ + int i; + + global.listen_socket = socket( res->ai_family, res->ai_socktype, res->ai_protocol ); + if( global.listen_socket < 0 ) + { + log_error( "socket" ); + return FALSE; + } + +#ifdef IPV6_V6ONLY + if( res->ai_family == AF_INET6 ) + { + i = 0; + setsockopt( global.listen_socket, IPPROTO_IPV6, IPV6_V6ONLY, + (char *) &i, sizeof( i ) ); + } +#endif + + /* TIME_WAIT (?) sucks.. */ + i = 1; + setsockopt( global.listen_socket, SOL_SOCKET, SO_REUSEADDR, &i, sizeof( i ) ); + + i = bind( global.listen_socket, res->ai_addr, res->ai_addrlen ); + if( i == -1 ) + { + closesocket( global.listen_socket ); + global.listen_socket = -1; + + log_error( "bind" ); + return FALSE; + } + + return TRUE; +} + int bitlbee_daemon_init() { struct addrinfo *res, hints, *addrinfo_bind; @@ -62,35 +99,18 @@ int bitlbee_daemon_init() } global.listen_socket = -1; - + + /* Try IPv6 first (which will become an IPv6+IPv4 socket). */ for( res = addrinfo_bind; res; res = res->ai_next ) - { - global.listen_socket = socket( res->ai_family, res->ai_socktype, res->ai_protocol ); - if( global.listen_socket < 0 ) - continue; - -#ifdef IPV6_V6ONLY - if( res->ai_family == AF_INET6 ) - { - i = 0; - setsockopt( global.listen_socket, IPPROTO_IPV6, IPV6_V6ONLY, - (char *) &i, sizeof( i ) ); - } -#endif - - /* TIME_WAIT (?) sucks.. */ - i = 1; - setsockopt( global.listen_socket, SOL_SOCKET, SO_REUSEADDR, &i, sizeof( i ) ); - - i = bind( global.listen_socket, res->ai_addr, res->ai_addrlen ); - if( i == -1 ) - { - log_error( "bind" ); - return( -1 ); - } - break; - } - + if( res->ai_family == AF_INET6 && try_listen( res ) ) + break; + + /* The rest (so IPv4, I guess). */ + if( res == NULL ) + for( res = addrinfo_bind; res; res = res->ai_next ) + if( res->ai_family != AF_INET6 && try_listen( res ) ) + break; + freeaddrinfo( addrinfo_bind ); i = listen( global.listen_socket, 10 ); -- cgit v1.2.3