On Mon, Dec 04, 2006 at 01:39:53PM +0100, [EMAIL PROTECTED] wrote:
> between them :-( In fact, the lftp client doesn't even wait for a
> confirmation, moreover, it catches a timeout immediately, so there is no
> chance for the server to confirm successful transfer.

Please try attached patch.

--
   Alexander.
Index: ftpclass.cc
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/ftpclass.cc,v
retrieving revision 1.396
diff -u -p -r1.396 ftpclass.cc
--- ftpclass.cc 30 Nov 2006 11:59:08 -0000      1.396
+++ ftpclass.cc 5 Dec 2006 14:01:20 -0000
@@ -2210,6 +2210,7 @@ int   Ftp::Do()
            // prevent infinite NOOP's
            if(nop_offset==pos && 
timeout_timer.GetLastSetting()<nop_count*nop_interval)
            {
+              DebugPrint("**** ","NOOP timeout",1);
               HandleTimeout();
               return MOVED;
            }
@@ -2262,7 +2263,7 @@ int   Ftp::Do()
         if(conn->data_iobuf->Size()>=rate_limit->BytesAllowedToGet())
         {
            conn->data_iobuf->Suspend();
-           Timeout(1000);
+           TimeoutS(1);
         }
         else if(conn->data_iobuf->Size()>=max_buf)
         {
@@ -2321,19 +2322,23 @@ int   Ftp::Do()
         return MOVED;
       }
 
-      if(expect->IsEmpty() && conn->data_sock==-1 && conn->data_iobuf && 
!conn->data_iobuf->Eof())
+      if(conn->data_iobuf)
       {
-        conn->data_iobuf->PutEOF();
-        m=MOVED;
-      }
-      if(conn->data_iobuf && conn->data_iobuf->Eof() && 
conn->data_iobuf->Size()==0)
-      {
-        state=EOF_STATE;
-        DataAbort();
-        DataClose();
-        idle_timer.Reset();
-        eof=true;
-        return MOVED;
+        if(expect->IsEmpty() && conn->data_sock==-1 && 
!conn->data_iobuf->Eof())
+        {
+           conn->data_iobuf->PutEOF();
+           m=MOVED;
+        }
+        timeout_timer.Reset(conn->data_iobuf->EventTime());
+        if(conn->data_iobuf->Eof() && conn->data_iobuf->Size()==0)
+        {
+           state=EOF_STATE;
+           DataAbort();
+           DataClose();
+           idle_timer.Reset();
+           eof=true;
+           return MOVED;
+        }
       }
 
       if(copy_mode==COPY_DEST && !copy_allow_store)
@@ -3057,7 +3062,6 @@ int  Ftp::FlushSendQueue(bool all)
    if(!conn || !conn->control_send)
       return m;
 
-   timeout_timer.Reset(conn->control_send->EventTime());
    if(conn->control_send->Error())
    {
       DebugPrint("**** ",conn->control_send->ErrorText(),0);
@@ -3072,6 +3076,13 @@ int  Ftp::FlushSendQueue(bool all)
       return MOVED;
    }
 
+   if(!conn->send_cmd_buffer || conn->send_cmd_buffer->Size()==0)
+      return m;
+
+   // prevent timeout after some idle time
+   if(conn->control_send->Size()==0)
+      timeout_timer.Reset();
+
    while(conn->sync_wait<=0 || all || !(flags&SYNC_MODE))
    {
       int res=conn->FlushSendQueueOneCmd();
@@ -3082,6 +3093,7 @@ int  Ftp::FlushSendQueue(bool all)
 
    if(m==MOVED)
       Roll(conn->control_send);
+   timeout_timer.Reset(conn->control_send->EventTime());
 
    return m;
 }
@@ -3405,7 +3417,7 @@ int   Ftp::Write(const void *buf,int siz
       return DO_AGAIN;
 
    IOBuffer *iobuf=conn->data_iobuf;
-   if(!buf)
+   if(!iobuf)
       return DO_AGAIN;
 
    {
Index: Timer.cc
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/Timer.cc,v
retrieving revision 1.16
diff -u -p -r1.16 Timer.cc
--- Timer.cc    4 Aug 2006 07:11:49 -0000       1.16
+++ Timer.cc    5 Dec 2006 13:57:27 -0000
@@ -60,6 +60,8 @@ void Timer::Set(const TimeInterval &i)
 }
 void Timer::Reset(const Time &t)
 {
+   if(start>=t)
+      return;
    start=t;
    stop=t;
    stop+=last_setting;

Reply via email to