diff --git a/lftp-3.3.5-bz173276.patch b/lftp-3.3.5-bz173276.patch new file mode 100644 index 0000000..d84aa5d --- /dev/null +++ b/lftp-3.3.5-bz173276.patch @@ -0,0 +1,163 @@ +--- lftp-3.3.5/doc/lftp.1.bz173276 2005-12-02 02:23:31.000000000 -0500 ++++ lftp-3.3.5/doc/lftp.1 2005-12-16 20:07:19.000000000 -0500 +@@ -919,6 +919,27 @@ + .BR dns:use-fork \ (boolean) + if true, lftp will fork before resolving host address. Default is true. + .TP ++.BR dns:use-first-address \ (boolean) ++If true (the default), lftp will use the first address returned by a host name lookup; ++if false, lftp will continue trying to find addresses of each address family ++in dns:order until an address of each family is found, is authoritatively ++known not to exist (as opposed to servers not being contactable), or the ++dns:fatal-timeout (if any) expires. ++Setting this to true will make lftp use the first available address for a name. ++.TP ++.BR dns:try-again \ (boolean) ++If true (the default), lftp will continue to try to lookup a dns name while ++no servers are contactable, until the dns-fatal-timeout expires or an address ++is found (of each family in dns:order if dns:use-first-address is false). ++If false, lftp will not retry dns name lookups . ++.TP ++.BR dns:n-attempts \ (number) ++If zero, (the default), there is no limit on the number of times lftp will try ++to lookup an address if dns:try-again is true. ++If > 0, lftp will try only this number of times to look up an address of each ++address family in dns:order . ++If dns:try-again is not true, this variable has no effect. ++.TP + .BR file:charset \ (string) + local character set. It is set from current locale initially. + .TP +--- lftp-3.3.5/src/resource.cc.bz173276 2005-11-08 02:21:19.000000000 -0500 ++++ lftp-3.3.5/src/resource.cc 2005-12-16 20:02:48.000000000 -0500 +@@ -341,7 +341,10 @@ + res_timeout ("dns:fatal-timeout","0", ResMgr::UNumberValidate,0), + res_order ("dns:order", DEFAULT_ORDER, OrderValidate,0), + res_query_srv ("dns:SRV-query", "no", ResMgr::BoolValidate,0), +- res_use_fork ("dns:use-fork", "yes", ResMgr::BoolValidate,ResMgr::NoClosure); ++ res_use_fork ("dns:use-fork", "yes", ResMgr::BoolValidate,ResMgr::NoClosure), ++ res_use_first ("dns:use-first-address", "yes", ResMgr::BoolValidate,ResMgr::NoClosure), ++ res_try_again ("dns:try-again", "yes", ResMgr::BoolValidate,ResMgr::NoClosure), ++ res_n_attempts ("dns:n-attempts", "0", ResMgr::UNumberValidate,ResMgr::NoClosure); + + static ResDecl + fish_shell ("fish:shell", "/bin/sh", 0,0), +--- lftp-3.3.5/src/Resolver.cc.bz173276 2005-11-08 01:17:11.000000000 -0500 ++++ lftp-3.3.5/src/Resolver.cc 2005-12-16 20:20:09.000000000 -0500 +@@ -682,6 +682,11 @@ + time_t try_time; + int af_index=0; + int af_order[16]; ++ int af_tries[16]; ++ int af_try=0, af_tried=-1, try_afs_again=0; ++ int dns_use_first =ResMgr::QueryBool("dns:use-first-address",0), ++ dns_n_attempts=ResMgr::Query("dns:n-attempts",0), ++ dns_try_again =ResMgr::QueryBool("dns:try-again",0); + + const char *order=ResMgr::Query("dns:order",name); + +@@ -698,6 +703,8 @@ + } + + ParseOrder(order,af_order); ++ ++ memset(af_tries, 0, sizeof(af_tries)); + + for(;;) + { +@@ -778,8 +785,32 @@ + #else // !HAVE_GETADDRINFO + + int af=af_order[af_index]; ++ + if(af==-1) +- break; ++ { ++ if( (timeout == 0) ++ && (dns_try_again == 0) ++ && ((dns_n_attempts == 0) || (af_tried == 0)) ++ ) ++ break; ++ else ++ { /* tried all afs at least once */ ++ if( ( dns_try_again == 0 ) || (try_afs_again == 0)) ++ break; ++ ++ af_index = 0; ++ af = af_order[af_index]; ++ af_tried = 0; ++ try_afs_again = 0; ++ } ++ } ++ ++ if ( af_tries [ af_index ] != -1 ) ++ { ++ af_tries[ af_index ]++; ++ ++ if( (dns_n_attempts > 0) && ( af_tries [ af_index ] > dns_n_attempts) ) ++ break; + + struct hostent *ha; + # if defined(HAVE_GETIPNODEBYNAME) +@@ -801,12 +832,19 @@ + } + # endif + +- if(ha) ++ af_tried = 1; ++ ++ if ( ha ) + { + const char * const *a; + for(a=ha->h_addr_list; *a; a++) +- AddAddress(ha->h_addrtype, *a, ha->h_length); +- af_index++; ++ { ++ AddAddress(ha->h_addrtype, *a, ha->h_length); ++ af_tries[ af_index ] = -1; ++ if ( dns_use_first ) ++ return; ++ } ++ af_index++; + # if defined(HAVE_GETIPNODEBYNAME) + freehostent(ha); + # endif +@@ -825,14 +863,33 @@ + error=_("Host name lookup failure"); + # endif + } +- af_index++; +- continue; // try other address families ++ af_tries[ af_index ] = -1; + } ++ } /* af_tries[ af_index ] != -1 */ ++ ++ if( af_tries[ af_index ] != -1 ) ++ try_afs_again = 1; ++ + #endif /* HAVE_GETADDRINFO */ + +- time_t t; +- if((t=time(0))-try_time<5) +- sleep(5-(t-try_time)); ++ time_t t = time(0); ++ if( timeout && (( t - start_time ) >= (timeout - 1)) ) ++ { ++ return; ++ }else ++ { ++ af_try = (af_order[af_index+1] == -1) ? 0 : ((af_index + 1) & 0xf); ++ if( (af_tries[ af_try ] != 0) || (af_tried == 0)) ++ { ++ if( timeout == 0 ) ++ { ++ if((t-try_time)<5) ++ sleep(5-(t-try_time)); ++ }else ++ sleep(1); ++ } ++ af_index++; ++ } + } + } +