diff options
author | Wilmer van der Gaast <wilmer@gaast.net> | 2010-07-25 00:50:23 +0200 |
---|---|---|
committer | Wilmer van der Gaast <wilmer@gaast.net> | 2010-07-25 00:50:23 +0200 |
commit | f1f7b5e5d7f99419fc9b1a3d3ee3bce6e8602b10 (patch) | |
tree | 9dba333dc27dcab877420e945c54067155ae973b | |
parent | 2945c6ff5d1848f6d8e51a0d804a2d769e6894a7 (diff) |
Take the local address from the IM/IRC connection when setting up a listening
socket for file transfers.
-rw-r--r-- | dcc.c | 2 | ||||
-rw-r--r-- | lib/ftutil.c | 12 | ||||
-rw-r--r-- | lib/ftutil.h | 2 | ||||
-rw-r--r-- | protocols/jabber/s5bytestream.c | 2 |
4 files changed, 14 insertions, 4 deletions
@@ -103,7 +103,7 @@ file_transfer_t *dccs_send_start( struct im_connection *ic, irc_user_t *iu, cons /* listen and request */ - if( ( df->fd = ft_listen( &saddr, host, port, TRUE, &errmsg ) ) == -1 ) + if( ( df->fd = ft_listen( &saddr, host, port, irc->fd, TRUE, &errmsg ) ) == -1 ) { dcc_abort( df, "Failed to listen locally, check your ft_listen setting in bitlbee.conf: %s", errmsg ); return NULL; diff --git a/lib/ftutil.c b/lib/ftutil.c index d59dd4e0..71c09b50 100644 --- a/lib/ftutil.c +++ b/lib/ftutil.c @@ -35,7 +35,7 @@ /* * Creates a listening socket and returns it in saddr_ptr. */ -int ft_listen( struct sockaddr_storage *saddr_ptr, char *host, char *port, int for_bitlbee_client, char **errptr ) +int ft_listen( struct sockaddr_storage *saddr_ptr, char *host, char *port, int copy_fd, int for_bitlbee_client, char **errptr ) { int fd, gret, saddrlen; struct addrinfo hints, *rp; @@ -82,6 +82,15 @@ int ft_listen( struct sockaddr_storage *saddr_ptr, char *host, char *port, int f strncpy( port, colon + 1, 5 ); } } + else if( copy_fd >= 0 && getsockname( copy_fd, (struct sockaddr*) &saddrs, &ssize ) == 0 && + ( saddrs.ss_family == AF_INET || saddrs.ss_family == AF_INET6 ) && + getnameinfo( (struct sockaddr*) &saddrs, ssize, host, HOST_NAME_MAX, + NULL, 0, NI_NUMERICHOST ) == 0 ) + { + /* We just took our local address on copy_fd, which is likely to be a + sensible address from which we can do a file transfer now - the + most sensible we can get easily. */ + } else { ASSERTSOCKOP( gethostname( host, HOST_NAME_MAX + 1 ), "gethostname()" ); @@ -116,6 +125,7 @@ int ft_listen( struct sockaddr_storage *saddr_ptr, char *host, char *port, int f return -1; } + ssize = sizeof( struct sockaddr_storage ); ASSERTSOCKOP( getsockname( fd, ( struct sockaddr *)saddr, &ssize ), "Getting socket name" ); if( saddr->ss_family == AF_INET ) diff --git a/lib/ftutil.h b/lib/ftutil.h index c4a5b02b..09c1104e 100644 --- a/lib/ftutil.h +++ b/lib/ftutil.h @@ -37,4 +37,4 @@ /* This function should be used with care. host should be AT LEAST a char[HOST_NAME_MAX+1] and port AT LEAST a char[6]. */ -int ft_listen( struct sockaddr_storage *saddr_ptr, char *host, char *port, int for_bitlbee_client, char **errptr ); +int ft_listen( struct sockaddr_storage *saddr_ptr, char *host, char *port, int copy_fd, int for_bitlbee_client, char **errptr ); diff --git a/protocols/jabber/s5bytestream.c b/protocols/jabber/s5bytestream.c index 6759b78b..3304d99e 100644 --- a/protocols/jabber/s5bytestream.c +++ b/protocols/jabber/s5bytestream.c @@ -910,7 +910,7 @@ void jabber_si_set_proxies( struct bs_transfer *bt ) *next++ = '\0'; if( strcmp( proxy, "<local>" ) == 0 ) { - if( ( tf->fd = ft_listen( &tf->saddr, host, port, FALSE, &errmsg ) ) != -1 ) { + if( ( tf->fd = ft_listen( &tf->saddr, host, port, jd->fd, FALSE, &errmsg ) ) != -1 ) { sh = g_new0( jabber_streamhost_t, 1 ); sh->jid = g_strdup( tf->ini_jid ); sh->host = g_strdup( host ); |