aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2005-12-27 15:39:32 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2005-12-27 15:39:32 +0100
commite4d62711995840def3a2d51f62923d95cb368cee (patch)
treeb53c3762820dc54aa997a05be8da33bdf2340b2f
parent238f828cb3524a2a09337d7502cc6db9556fc67a (diff)
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.".
-rw-r--r--bitlbee.c25
-rw-r--r--irc.c50
-rw-r--r--protocols/http_client.c2
-rw-r--r--protocols/oscar/oscar.c2
-rw-r--r--sock.h7
5 files changed, 59 insertions, 27 deletions
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" );
diff --git a/irc.c b/irc.c
index 7453093d..9cba7f6e 100644
--- a/irc.c
+++ b/irc.c
@@ -39,14 +39,17 @@ static char *passchange (irc_t *irc, void *set, char *value)
irc_t *irc_new( int fd )
{
- irc_t *irc = g_new0( irc_t, 1 );
-
- struct sockaddr_in sock[1];
+ irc_t *irc;
+ struct hostent *peer;
+ unsigned int i;
+ char buf[128];
#ifdef IPV6
- struct sockaddr_in6 sock6[1];
+ struct sockaddr_in6 sock[1];
+#else
+ struct sockaddr_in sock[1];
#endif
- struct hostent *peer;
- unsigned int i, j;
+
+ irc = g_new0( irc_t, 1 );
irc->fd = fd;
irc->io_channel = g_io_channel_unix_new( fd );
@@ -70,38 +73,43 @@ irc_t *irc_new( int fd )
irc->channel = g_strdup( ROOT_CHAN );
i = sizeof( *sock );
-#ifdef IPV6
- j = sizeof( *sock6 );
-#endif
+
if( global.conf->hostname )
irc->myhost = g_strdup( global.conf->hostname );
- else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INET )
+#ifdef IPV6
+ else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin6_family == AF_INETx )
{
- if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INET ) ) )
+ if( ( peer = gethostbyaddr( (char*) &sock->sin6_addr, sizeof( sock->sin6_addr ), AF_INETx ) ) )
irc->myhost = g_strdup( peer->h_name );
+ else if( inet_ntop( AF_INETx, &sock->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL )
+ irc->myhost = g_strdup( buf );
}
-#ifdef IPV6
- else if( getsockname( irc->fd, (struct sockaddr*) sock6, &j ) == 0 && sock6->sin6_family == AF_INET6 )
+#else
+ else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INETx )
{
- if( ( peer = gethostbyaddr( (char*) &sock6->sin6_addr, sizeof( sock6->sin6_addr ), AF_INET6 ) ) )
+ if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INETx ) ) )
irc->myhost = g_strdup( peer->h_name );
+ else if( inet_ntop( AF_INETx, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL )
+ irc->myhost = g_strdup( buf );
}
#endif
i = sizeof( *sock );
#ifdef IPV6
- j = sizeof( *sock6 );
-#endif
- if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INET )
+ if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin6_family == AF_INETx )
{
- if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INET ) ) )
+ if( ( peer = gethostbyaddr( (char*) &sock->sin6_addr, sizeof( sock->sin6_addr ), AF_INETx ) ) )
irc->host = g_strdup( peer->h_name );
+ else if( inet_ntop( AF_INETx, &sock->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL )
+ irc->host = g_strdup( buf );
}
-#ifdef IPV6
- else if( getpeername( irc->fd, (struct sockaddr*) sock6, &j ) == 0 && sock6->sin6_family == AF_INET6 )
+#else
+ if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INETx )
{
- if( ( peer = gethostbyaddr( (char*) &sock6->sin6_addr, sizeof( sock6->sin6_addr ), AF_INET6 ) ) )
+ if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INETx ) ) )
irc->host = g_strdup( peer->h_name );
+ else if( inet_ntop( AF_INETx, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL )
+ irc->host = g_strdup( buf );
}
#endif
diff --git a/protocols/http_client.c b/protocols/http_client.c
index 51424e1c..9417e200 100644
--- a/protocols/http_client.c
+++ b/protocols/http_client.c
@@ -26,9 +26,9 @@
#include <string.h>
#include <stdio.h>
-#include "sock.h"
#include "http_client.h"
#include "url.h"
+#include "sock.h"
static void http_connected( gpointer data, int source, GaimInputCondition cond );
diff --git a/protocols/oscar/oscar.c b/protocols/oscar/oscar.c
index 5f19f12b..b4bfb220 100644
--- a/protocols/oscar/oscar.c
+++ b/protocols/oscar/oscar.c
@@ -20,7 +20,6 @@
*
*/
-#include "sock.h"
#include <errno.h>
#include <ctype.h>
#include <string.h>
@@ -32,6 +31,7 @@
#include "nogaim.h"
#include "bitlbee.h"
#include "proxy.h"
+#include "sock.h"
#include "aim.h"
#include "icq.h"
diff --git a/sock.h b/sock.h
index 23a08bb4..28d31de9 100644
--- a/sock.h
+++ b/sock.h
@@ -1,6 +1,13 @@
#include <errno.h>
#include <fcntl.h>
+/* To cut down on the ifdef stuff a little bit in other places */
+#ifdef IPV6
+#define AF_INETx AF_INET6
+#else
+#define AF_INETx AF_INET
+#endif
+
#ifndef _WIN32
#include <unistd.h>
#include <sys/socket.h>