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:

Reply via email to