On Fri, Dec 28, 2007 at 02:56:35AM +0100, Tiger wrote:
> I'm using lftp 3.6.1 with readline 5.2 and had a problem to upload a
> file with a specific name contains '%' character.
Please try this patch.
--
Alexander.
Index: GetJob.cc
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/GetJob.cc,v
retrieving revision 1.28
diff -u -p -r1.28 GetJob.cc
--- GetJob.cc 23 Apr 2007 07:11:45 -0000 1.28
+++ GetJob.cc 28 Dec 2007 11:12:35 -0000
@@ -99,33 +99,44 @@ bool GetJob::IsRemoteNonURL(const Parsed
// store & put || !store & get
return (!url.proto && (mode==FA::STORE ^ !reverse));
}
+bool GetJob::IsLocalNonURL(const ParsedURL &url,FA::open_mode mode)
+{
+ // store & get || !store & put
+ return (!url.proto && (mode==FA::STORE ^ reverse));
+}
bool GetJob::IsLocal(const ParsedURL &url)
{
return !url.proto || !strcasecmp(url.proto,"file");
}
+// create copy peer from a cloned session
FileCopyPeer *GetJob::CreateCopyPeer(FileAccess *session,const char
*path,FA::open_mode mode)
{
ParsedURL url(path,true);
if(IsRemoteNonURL(url,mode))
return new FileCopyPeerFA(session,path,mode);
Delete(session); // delete cloned session.
- return CreateCopyPeer(url,mode);
+ return CreateCopyPeer(url,path,mode);
}
+// create copy peer using a session reference
FileCopyPeer *GetJob::CreateCopyPeer(const FileAccessRef& session,const char
*path,FA::open_mode mode)
{
ParsedURL url(path,true);
if(IsRemoteNonURL(url,mode))
return new FileCopyPeerFA(session,path,mode);
- return CreateCopyPeer(url,mode);
+ return CreateCopyPeer(url,path,mode);
}
-FileCopyPeer *GetJob::CreateCopyPeer(const ParsedURL &url,FA::open_mode mode)
+FileCopyPeer *GetJob::CreateCopyPeer(const ParsedURL &url,const char
*path,FA::open_mode mode)
{
+ if(IsLocalNonURL(url,mode))
+ return CreateCopyPeer(path,mode);
if(IsLocal(url))
- return (mode==FA::STORE)
- ? DstLocal(url.path)
- : SrcLocal(url.path);
+ return CreateCopyPeer(url.path,mode);
return new FileCopyPeerFA(&url,mode);
}
+FileCopyPeer *GetJob::CreateCopyPeer(const char *path,FA::open_mode mode)
+{
+ return mode==FA::STORE ? DstLocal(path) : SrcLocal(path);
+}
void GetJob::NextFile()
{
Index: GetJob.h
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/GetJob.h,v
retrieving revision 1.15
diff -u -p -r1.15 GetJob.h
--- GetJob.h 23 Apr 2007 07:11:46 -0000 1.15
+++ GetJob.h 28 Dec 2007 11:10:07 -0000
@@ -29,8 +29,10 @@ class GetJob : public CopyJobEnv
{
FileCopyPeer *SrcLocal(const char *src);
FileCopyPeer *DstLocal(const char *dst);
- FileCopyPeer *CreateCopyPeer(const ParsedURL &url,FA::open_mode mode);
+ FileCopyPeer *CreateCopyPeer(const ParsedURL &url,const char
*path,FA::open_mode mode);
+ FileCopyPeer *CreateCopyPeer(const char *path,FA::open_mode mode);
bool IsRemoteNonURL(const ParsedURL &url,FA::open_mode mode);
+ bool IsLocalNonURL(const ParsedURL &url,FA::open_mode mode);
static bool IsLocal(const ParsedURL &url);
protected: