Arkadiusz Miskiewicz
Tue, 27 Jan 2009 06:06:09 -0800
On Tuesday 27 of January 2009, Arkadiusz Miskiewicz wrote: > lftp 3.7.8 > > When connecting to link-local IPv6 addressess we need to specify interface > that's going to be used but lftp doesn't handle this correctly: > > [ar...@tarm ~]$ lftp ftp://fe80::2c0:9fff:feed:33cc%eth0 > lftp fe80::2c0:9fff:feed:33cc%eth0:~> debug 10 > lftp fe80::2c0:9fff:feed:33cc%eth0:~> ls > ---- dns cache hit > ---- Connecting to fe80::2c0:9fff:feed:33cc%eth0 (fe80::2c0:9fff:feed:33cc) > port 21 > **** connect(control_sock): Invalid argument > ---- Closing control socket > ls: Invalid argument > lftp fe80::2c0:9fff:feed:33cc%eth0:~> exit > zsh: exit 1 lftp ftp://fe80::2c0:9fff:feed:33cc%eth0
Patch fixing issue:
diff -ur lftp-3.7.8.org/src/Resolver.cc lftp-3.7.8/src/Resolver.cc
--- lftp-3.7.8.org/src/Resolver.cc 2008-11-27 06:56:26.000000000 +0100
+++ lftp-3.7.8/src/Resolver.cc 2009-01-27 14:47:57.466736403 +0100
@@ -291,7 +291,7 @@
done=true;
}
-void Resolver::AddAddress(int family,const char *address,int len)
+void Resolver::AddAddress(int family,const char *address,int len, unsigned int
scope)
{
sockaddr_u add;
memset(&add,0,sizeof(add));
@@ -315,6 +315,7 @@
return;
memcpy(&add.in6.sin6_addr,address,len);
add.in6.sin6_port=port_number;
+ add.in6.sin6_scope_id=scope;
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
add.sa.sa_len=sizeof(add.in6);
#endif
@@ -693,6 +694,7 @@
struct sockaddr_in6 *inet6_addr;
const char *addr_data;
int addr_len;
+ unsigned int addr_scope;
memset(&a_hint, 0, sizeof(a_hint));
a_hint.ai_flags = AI_PASSIVE;
@@ -717,17 +719,19 @@
case AF_INET:
inet_addr = (sockaddr_in *)sockname;
addr_data = (const char *)&(inet_addr->sin_addr.s_addr);
+ addr_scope = 0;
addr_len = sizeof(inet_addr->sin_addr.s_addr);
break;
case AF_INET6:
inet6_addr = (sockaddr_in6 *)sockname;
addr_data = (const char *)&(inet6_addr->sin6_addr.s6_addr);
+ addr_scope = inet6_addr->sin6_scope_id;
addr_len = sizeof(inet6_addr->sin6_addr.s6_addr);
break;
default:
continue;
}
- AddAddress(a_res->ai_family, addr_data, addr_len);
+ AddAddress(a_res->ai_family, addr_data, addr_len, addr_scope);
}
}
@@ -773,7 +777,7 @@
{
const char * const *a;
for(a=ha->h_addr_list; *a; a++)
- AddAddress(ha->h_addrtype, *a, ha->h_length);
+ AddAddress(ha->h_addrtype, *a, ha->h_length, 0);
retries=0;
af_index++;
# if defined(HAVE_GETIPNODEBYNAME)
diff -ur lftp-3.7.8.org/src/Resolver.h lftp-3.7.8/src/Resolver.h
--- lftp-3.7.8.org/src/Resolver.h 2008-11-27 06:56:27.000000000 +0100
+++ lftp-3.7.8/src/Resolver.h 2009-01-27 14:47:12.017783307 +0100
@@ -47,7 +47,7 @@
xarray<sockaddr_u> addr;
- void AddAddress(int family,const char *a,int len);
+ void AddAddress(int family,const char *a,int len,unsigned int scope);
xstring err_msg;
bool done;
--
Arkadiusz MiĆkiewicz PLD/Linux Team
arekm / maven.pl http://ftp.pld-linux.org/