From e4d62711995840def3a2d51f62923d95cb368cee Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Tue, 27 Dec 2005 15:39:32 +0100 Subject: IPv6 socket improvements. Daemon mode can now also listen on IPv6 sockets. Also, when reverse lookup fails, BitlBee now correctly falls back to an ASCII-formatted IP instead of "localhost.". --- bitlbee.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'bitlbee.c') diff --git a/bitlbee.c b/bitlbee.c index 45cb388d..3d7e4c4f 100644 --- a/bitlbee.c +++ b/bitlbee.c @@ -67,24 +67,41 @@ gboolean bitlbee_io_new_client( GIOChannel *source, GIOCondition condition, gpoi int bitlbee_daemon_init() { +#ifdef IPV6 + struct sockaddr_in6 listen_addr; +#else struct sockaddr_in listen_addr; +#endif int i; GIOChannel *ch; log_link( LOGLVL_ERROR, LOGOUTPUT_SYSLOG ); log_link( LOGLVL_WARNING, LOGOUTPUT_SYSLOG ); - global.listen_socket = socket( AF_INET, SOCK_STREAM, 0 ); + global.listen_socket = socket( AF_INETx, SOCK_STREAM, 0 ); if( global.listen_socket == -1 ) { log_error( "socket" ); return( -1 ); } - listen_addr.sin_family = AF_INET; + +#ifdef IPV6 + listen_addr.sin6_family = AF_INETx; + listen_addr.sin6_port = htons( global.conf->port ); + i = inet_pton( AF_INETx, global.conf->iface, &listen_addr.sin6_addr ); +#else + listen_addr.sin_family = AF_INETx; listen_addr.sin_port = htons( global.conf->port ); - listen_addr.sin_addr.s_addr = inet_addr( global.conf->iface ); + i = inet_pton( AF_INETx, global.conf->iface, &listen_addr.sin_addr ); +#endif + + if( i != 1 ) + { + log_message( LOGLVL_ERROR, "Couldn't parse address `%s'", global.conf->iface ); + return( -1 ); + } - i = bind( global.listen_socket, (struct sockaddr *) &listen_addr, sizeof( struct sockaddr ) ); + i = bind( global.listen_socket, (struct sockaddr *) &listen_addr, sizeof( listen_addr ) ); if( i == -1 ) { log_error( "bind" ); -- cgit v1.2.3