aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dcc.c2
-rw-r--r--lib/ftutil.c12
-rw-r--r--lib/ftutil.h2
-rw-r--r--protocols/jabber/s5bytestream.c2
4 files changed, 14 insertions, 4 deletions
diff --git a/dcc.c b/dcc.c
index a9e5b5f1..794b3613 100644
--- a/dcc.c
+++ b/dcc.c
@@ -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 );