[packages/lftp] - rel 2; fixes https://github.com/lavv17/lftp/issues/74
arekm
arekm at pld-linux.org
Tue Jun 24 09:58:11 CEST 2014
commit e8ea6214c7eb2fdf43b00c5d2b09fc0fed765f7b
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date: Tue Jun 24 09:58:08 2014 +0200
- rel 2; fixes https://github.com/lavv17/lftp/issues/74
lftp-git.patch | 398 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
lftp.spec | 4 +-
2 files changed, 401 insertions(+), 1 deletion(-)
---
diff --git a/lftp.spec b/lftp.spec
index f6f3b9a..cf2dacb 100644
--- a/lftp.spec
+++ b/lftp.spec
@@ -23,7 +23,7 @@ Summary(pt_BR.UTF-8): Sofisticado programa de transferência de arquivos (client
Summary(zh_CN.UTF-8): lftp 客户端程序
Name: lftp
Version: 4.5.2
-Release: 1
+Release: 2
License: GPL v3+
Group: Applications/Networking
Source0: http://lftp.yar.ru/ftp/%{name}-%{version}.tar.xz
@@ -32,6 +32,7 @@ Source1: http://www.mif.pg.gda.pl/homepages/ankry/man-PLD/%{name}-man-pages.tar.
# Source1-md5: cdad8fb5342eebd9916eccefc98a855b
Source2: %{name}.desktop
Source3: %{name}-icon.png
+Patch100: %{name}-git.patch
Patch0: %{name}-makefile.patch
Patch1: %{name}-m4.patch
Patch2: aliases.patch
@@ -90,6 +91,7 @@ o arquivo FEATURES para uma lista mais detalhada.
%prep
%setup -q
+%patch100 -p1
%patch0 -p1
%patch1 -p1
%patch2 -p1
diff --git a/lftp-git.patch b/lftp-git.patch
new file mode 100644
index 0000000..93d8f10
--- /dev/null
+++ b/lftp-git.patch
@@ -0,0 +1,398 @@
+diff --git a/NEWS b/NEWS
+index 70ab658..e0198df 100644
+--- a/NEWS
++++ b/NEWS
+@@ -2,7 +2,7 @@ Version 4.5.2 - 2014-06-11
+
+ * fixed a coredump on startup when compiled with certain gcc versions.
+ * mkdir -q option for quiet operation.
+-* glob --exists and --not-exist options.
++* glob --exist and --not-exist options.
+ * improved torrent status, show piece availability statistics.
+ * remove unconnectable torrent peers on trackerless torrents.
+
+diff --git a/src/DHT.cc b/src/DHT.cc
+index dc7fdf7..069257e 100644
+--- a/src/DHT.cc
++++ b/src/DHT.cc
+@@ -119,7 +119,7 @@ int DHT::Do()
+ if(nodes.count()>MAX_NODES) {
+ // remove some nodes.
+ int to_remove=nodes.count()-MAX_NODES;
+- for(Node *n=nodes.each_begin(); n; n=nodes.each_next()) {
++ for(Node *n=nodes.each_begin(); n && to_remove>0; n=nodes.each_next()) {
+ if(!n->IsGood() && !n->in_routes) {
+ LogNote(9,"removing node %s (not good)",n->GetName());
+ RemoveNode(n);
+@@ -518,6 +518,10 @@ void DHT::HandlePacket(BeNode *p,const sockaddr_u& src)
+ LogError(2,"got DHT reply with unknown `t' from %s",src.to_string());
+ return;
+ }
++ if(req->addr!=src) {
++ LogError(2,"got DHT reply from %s instead of %s",src.to_string(),req->addr.to_string());
++ return;
++ }
+
+ const xstring& q=req->data->lookup_str("q");
+ if(y.eq("r")) {
+@@ -747,10 +751,6 @@ DHT::Node *DHT::FoundNode(const xstring& id,const sockaddr_u& a,bool responded,S
+ void DHT::RemoveNode(Node *n)
+ {
+ RemoveRoute(n);
+- for(const Request *r=sent_req.each_begin(); r; r=sent_req.each_next()) {
+- if(r->addr==n->addr)
+- sent_req.remove(sent_req.each_key());
+- }
+ node_by_addr.remove(n->addr.compact());
+ nodes.remove(n->id);
+ }
+diff --git a/src/Http.cc b/src/Http.cc
+index bcf5961..dffb1c2 100644
+--- a/src/Http.cc
++++ b/src/Http.cc
+@@ -869,11 +869,6 @@ void Http::HandleHeaderLine(const char *name,const char *value)
+ if(bs<0) // try to workaround broken servers
+ bs+=0x100000000LL;
+ body_size=bs;
+- if(pos==0 && mode!=STORE && mode!=MAKE_DIR && !inflate)
+- entity_size=body_size;
+- if(pos==0 && opt_size && H_2XX(status_code) && !inflate)
+- *opt_size=body_size;
+-
+ if(mode==ARRAY_INFO && H_2XX(status_code)
+ && xstrcmp(last_method,"PROPFIND"))
+ {
+@@ -967,19 +962,7 @@ void Http::HandleHeaderLine(const char *name,const char *value)
+ return;
+
+ case_hh("Content-Encoding",'C')
+- if(!QueryBool("decode",hostname))
+- return;
+- if(!strcmp(value,"deflate")
+- || !strcmp(value,"gzip") || !strcmp(value,"compress")
+- || !strcmp(value,"x-gzip") || !strcmp(value,"x-compress")) {
+- // inflated size if unknown beforehand
+- entity_size=NO_SIZE;
+- if(opt_size)
+- *opt_size=NO_SIZE;
+- // start the inflation
+- inflate=new DirectedBuffer(DirectedBuffer::GET);
+- inflate->SetTranslator(new DataInflator());
+- }
++ content_encoding.set(value);
+ return;
+
+ case_hh("Accept-Ranges",'A')
+@@ -1712,6 +1695,26 @@ int Http::Do()
+ return MOVED;
+ }
+
++ // Many servers send application/x-gzip with x-gzip encoding,
++ // don't decode in such a case.
++ if(CompressedContentEncoding() && !CompressedContentType()
++ && QueryBool("decode",hostname)) {
++ // inflated size is unknown beforehand
++ entity_size=NO_SIZE;
++ if(opt_size)
++ *opt_size=NO_SIZE;
++ // start the inflation
++ inflate=new DirectedBuffer(DirectedBuffer::GET);
++ inflate->SetTranslator(new DataInflator());
++ }
++ // sometimes it's possible to derive entity size from body size.
++ if(entity_size==NO_SIZE && body_size!=NO_SIZE
++ && pos==0 && mode!=STORE && mode!=MAKE_DIR && !inflate) {
++ entity_size=body_size;
++ if(opt_size && H_2XX(status_code))
++ *opt_size=body_size;
++ }
++
+ LogNote(9,_("Receiving body..."));
+ rate_limit=new RateLimit(hostname);
+ if(real_pos<0) // assume Range: did not work
+@@ -2580,6 +2583,27 @@ Http::atotm (const char *time_string)
+ return ut;
+ }
+
++bool Http::IsCompressed(const char *s)
++{
++ static const char *const values[] = {
++ "x-gzip", "gzip", "deflate", "compress", "x-compress", NULL
++ };
++ for(const char *const *v=values; *v; v++)
++ if(!strcmp(s,*v))
++ return true;
++ return false;
++}
++
++bool Http::CompressedContentEncoding() const
++{
++ return content_encoding && IsCompressed(content_encoding);
++}
++bool Http::CompressedContentType() const
++{
++ static const char app[]="application/";
++ return entity_content_type && entity_content_type.begins_with(app)
++ && IsCompressed(entity_content_type+sizeof(app)-1);
++}
+
+ #include "modconfig.h"
+ #ifdef MODULE_PROTO_HTTP
+diff --git a/src/Http.h b/src/Http.h
+index 131254d..c481ec9 100644
+--- a/src/Http.h
++++ b/src/Http.h
+@@ -140,6 +140,10 @@ class Http : public NetAccess
+
+ Ref<DirectedBuffer> inflate;
+ SMTaskRef<IOBuffer> propfind;
++ xstring_c content_encoding;
++ static bool IsCompressed(const char *s);
++ bool CompressedContentEncoding() const;
++ bool CompressedContentType() const;
+
+ bool no_ranges;
+ bool seen_ranges_bytes;
+diff --git a/src/Torrent.cc b/src/Torrent.cc
+index 50b1049..ffe6433 100644
+--- a/src/Torrent.cc
++++ b/src/Torrent.cc
+@@ -1565,7 +1565,7 @@ void Torrent::ScanPeers() {
+ const char *blacklist_time="2h";
+ if(peer->Failed()) {
+ LogError(2,"peer %s failed: %s",peer->GetName(),peer->ErrorText());
+- } else if(peer->Disconnected()) {
++ } else if(peer->Disconnected() && peer->ActivityTimedOut()) {
+ LogNote(4,"peer %s disconnected",peer->GetName());
+ } else if(peer->myself) {
+ LogNote(4,"removing myself-connected peer %s",peer->GetName());
+@@ -1574,6 +1574,7 @@ void Torrent::ScanPeers() {
+ LogNote(4,"removing duplicate peer %s",peer->GetName());
+ } else if(complete && peer->Seed()) {
+ LogNote(4,"removing unneeded peer %s (%s)",peer->GetName(),peers[i]->Status());
++ blacklist_time="1d";
+ } else {
+ // keep the peer.
+ continue;
+@@ -3548,8 +3549,7 @@ void Torrent::Dispatch(const xstring& info_hash,int sock,const sockaddr_u *remot
+ {
+ Torrent *t=FindTorrent(info_hash);
+ if(!t) {
+- LogError(3,"peer %s sent unknown info_hash=%s in handshake",
+- remote_addr->to_string(),info_hash.hexdump());
++ LogError(3,_("peer sent unknown info_hash=%s in handshake"),info_hash.hexdump());
+ close(sock);
+ Delete(recv_buf);
+ return;
+@@ -3560,7 +3560,8 @@ void Torrent::Dispatch(const xstring& info_hash,int sock,const sockaddr_u *remot
+ TorrentDispatcher::TorrentDispatcher(int s,const sockaddr_u *a)
+ : sock(s), addr(*a),
+ recv_buf(new IOBufferFDStream(new FDStream(sock,"<input-socket>"),IOBuffer::GET)),
+- timeout_timer(60)
++ timeout_timer(60),
++ peer_name(addr.to_xstring())
+ {
+ }
+ TorrentDispatcher::~TorrentDispatcher()
+diff --git a/src/Torrent.h b/src/Torrent.h
+index 0015311..a9943c6 100644
+--- a/src/Torrent.h
++++ b/src/Torrent.h
+@@ -785,11 +785,12 @@ class TorrentDispatcher : public SMTask, protected ProtoLog
+ const sockaddr_u addr;
+ SMTaskRef<IOBuffer> recv_buf;
+ Timer timeout_timer;
++ xstring_c peer_name;
+ public:
+ TorrentDispatcher(int s,const sockaddr_u *a);
+ ~TorrentDispatcher();
+ int Do();
+- const char *GetLogContext() { return "torrent"; }
++ const char *GetLogContext() { return peer_name; }
+ };
+
+ #include "Job.h"
+diff --git a/src/ftpclass.cc b/src/ftpclass.cc
+index aa4cf6a..51114b5 100644
+--- a/src/ftpclass.cc
++++ b/src/ftpclass.cc
+@@ -952,6 +952,7 @@ Ftp::Connection::Connection(const char *c)
+ : closure(c), send_cmd_buffer(DirectedBuffer::PUT)
+ {
+ control_sock=-1;
++ telnet_layer_send=0;
+ data_sock=-1;
+ aborted_data_sock=-1;
+ #if USE_SSL
+@@ -1559,6 +1560,7 @@ int Ftp::Do()
+ TuneConnectionAfterFEAT();
+ SendSiteGroup();
+ SendSiteIdle();
++ SendSiteCommands();
+
+ if(!home_auto)
+ {
+@@ -2648,6 +2650,23 @@ void Ftp::SendSiteGroup()
+ conn->SendCmd2("SITE GROUP",group);
+ expect->Push(Expect::IGNORE);
+ }
++void Ftp::SendSiteCommands()
++{
++ const char *site_commands=QueryStringWithUserAtHost("site");
++ if(!site_commands)
++ return;
++ char *cmd=alloca_strdup(site_commands);
++ for(;;) {
++ char *sep=strstr(cmd," ");
++ if(sep)
++ *sep=0;
++ conn->SendCmd2("SITE",cmd);
++ expect->Push(Expect::IGNORE);
++ if(!sep)
++ break;
++ cmd=sep+2;
++ }
++}
+
+ void Ftp::SendArrayInfoRequests()
+ {
+diff --git a/src/ftpclass.h b/src/ftpclass.h
+index c83c208..d762086 100644
+--- a/src/ftpclass.h
++++ b/src/ftpclass.h
+@@ -327,6 +327,7 @@ private:
+ void SendSiteIdle();
+ void SendAcct();
+ void SendSiteGroup();
++ void SendSiteCommands();
+ void SendUTimeRequest();
+ void SendAuth(const char *auth);
+ void TuneConnectionAfterFEAT();
+diff --git a/src/network.h b/src/network.h
+index 441f3ef..22af2e9 100644
+--- a/src/network.h
++++ b/src/network.h
+@@ -74,9 +74,12 @@ union sockaddr_u
+ #endif
+ return sizeof(*this);
+ }
+- int operator==(const sockaddr_u &o) const {
++ bool operator==(const sockaddr_u &o) const {
+ return !memcmp(this,&o,addr_len());
+ }
++ bool operator!=(const sockaddr_u &o) const {
++ return memcmp(this,&o,addr_len());
++ }
+ const char *address() const;
+ int port() const;
+ int bind_to(int s) const { return bind(s,&sa,addr_len()); }
+diff --git a/src/resource.cc b/src/resource.cc
+index 6f63ed7..4aa071a 100644
+--- a/src/resource.cc
++++ b/src/resource.cc
+@@ -181,6 +181,7 @@ static ResType lftp_vars[] = {
+ {"ftp:fxp-passive-source", "no", ResMgr::BoolValidate,ResMgr::NoClosure},
+ {"ftp:fxp-passive-sscn", "yes", ResMgr::BoolValidate,ResMgr::NoClosure},
+ {"ftp:home", "", 0,0},
++ {"ftp:site" "", 0,0},
+ {"ftp:site-group", "", 0,0},
+ {"ftp:lang", "", 0,0},
+ {"ftp:list-empty-ok", "no", 0,0},
+diff --git a/src/xstring.cc b/src/xstring.cc
+index 76f6d40..9eadeca 100644
+--- a/src/xstring.cc
++++ b/src/xstring.cc
+@@ -24,37 +24,6 @@
+ #include "trio.h"
+ #include "c-ctype.h"
+
+-int xstrcmp(const char *s1,const char *s2)
+-{
+- if(s1==s2)
+- return 0;
+- if(s1==0 || s2==0)
+- return 1;
+- return strcmp(s1,s2);
+-}
+-int xstrncmp(const char *s1,const char *s2,size_t len)
+-{
+- if(s1==s2 || len==0)
+- return 0;
+- if(s1==0 || s2==0)
+- return 1;
+- return strncmp(s1,s2,len);
+-}
+-int xstrcasecmp(const char *s1,const char *s2)
+-{
+- if(s1==s2)
+- return 0;
+- if(s1==0 || s2==0)
+- return 1;
+- return strcasecmp(s1,s2);
+-}
+-size_t xstrlen(const char *s)
+-{
+- if(s==0)
+- return 0;
+- return strlen(s);
+-}
+-
+ void xstring::get_space(size_t s)
+ {
+ get_space2(s,32);
+diff --git a/src/xstring.h b/src/xstring.h
+index 4dee3fb..264baf6 100644
+--- a/src/xstring.h
++++ b/src/xstring.h
+@@ -62,10 +62,36 @@ CDECL int vsnprintf(char *,size_t,const char *,va_list);
+ CDECL int snprintf(char *,size_t,const char *,...);
+ #endif
+
+-int xstrcmp(const char *s1,const char *s2);
+-int xstrncmp(const char *s1,const char *s2,size_t len);
+-int xstrcasecmp(const char *s1,const char *s2);
+-size_t xstrlen(const char *s);
++static inline int xstrcmp(const char *s1,const char *s2)
++{
++ if(s1==s2)
++ return 0;
++ if(s1==0 || s2==0)
++ return 1;
++ return strcmp(s1,s2);
++}
++static inline int xstrncmp(const char *s1,const char *s2,size_t len)
++{
++ if(s1==s2 || len==0)
++ return 0;
++ if(s1==0 || s2==0)
++ return 1;
++ return strncmp(s1,s2,len);
++}
++static inline int xstrcasecmp(const char *s1,const char *s2)
++{
++ if(s1==s2)
++ return 0;
++ if(s1==0 || s2==0)
++ return 1;
++ return strcasecmp(s1,s2);
++}
++static inline size_t xstrlen(const char *s)
++{
++ if(s==0)
++ return 0;
++ return strlen(s);
++}
+
+ #include <stdarg.h>
+ #include "xmalloc.h"
+@@ -112,8 +138,8 @@ public:
+ void truncate(size_t n=0) { if(buf) buf[n]=0; }
+ char *borrow() { return replace_value(buf,(char*)0); }
+ bool begins_with(const char *s) const { return !strncmp(buf,s,strlen(s)); };
+- bool eq(const char *s) { return !xstrcmp(buf,s); }
+- bool ne(const char *s) { return !eq(s); }
++ bool eq(const char *s) const { return !xstrcmp(buf,s); }
++ bool ne(const char *s) const { return !eq(s); }
+ size_t length() const { return xstrlen(buf); }
+ void set_length(size_t n) { if(buf) buf[n]=0; }
+
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/lftp.git/commitdiff/e8ea6214c7eb2fdf43b00c5d2b09fc0fed765f7b
More information about the pld-cvs-commit
mailing list