myserver-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[myserver-commit] [3037] allow ftp sockets to be nonblocking


From: Alexandru IANCU
Subject: [myserver-commit] [3037] allow ftp sockets to be nonblocking
Date: Sun, 29 Mar 2009 18:03:43 +0000

Revision: 3037
          http://svn.sv.gnu.org/viewvc/?view=rev&root=myserver&revision=3037
Author:   andu
Date:     2009-03-29 18:03:43 +0000 (Sun, 29 Mar 2009)
Log Message:
-----------
allow ftp sockets to be nonblocking

Modified Paths:
--------------
    trunk/myserver/src/base/socket/socket.cpp
    trunk/myserver/src/server/clients_thread.cpp

Modified: trunk/myserver/src/base/socket/socket.cpp
===================================================================
--- trunk/myserver/src/base/socket/socket.cpp   2009-03-29 09:27:44 UTC (rev 
3036)
+++ trunk/myserver/src/base/socket/socket.cpp   2009-03-29 18:03:43 UTC (rev 
3037)
@@ -31,6 +31,7 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #endif
+#include <errno.h>
 }
 
 #include <sstream>
@@ -654,6 +655,14 @@
 #endif
 #ifdef NOT_WIN
   err = ::recv((int)socketHandle, buffer, len, flags);
+  if ( err < 0 && errno == EAGAIN )
+    {// if temporarily unavailable ...
+      int flags = fcntl((int)socketHandle, F_GETFL, 0);
+      if ( (flags >= 0) && ((flags & O_NONBLOCK) != 0) )
+       {// ... and nonblocking it's allright
+         return 0;
+       }
+    }
 
   if(err == 0)
     err = -1;

Modified: trunk/myserver/src/server/clients_thread.cpp
===================================================================
--- trunk/myserver/src/server/clients_thread.cpp        2009-03-29 09:27:44 UTC 
(rev 3036)
+++ trunk/myserver/src/server/clients_thread.cpp        2009-03-29 18:03:43 UTC 
(rev 3037)
@@ -315,12 +315,26 @@
   busy = 1;
   dataRead = c->connectionBuffer.getLength();
 
+  bool bSocketChanged = false;
+  if ( strcmp(c->host->getProtocolName(), "ftp") == 0 )
+    {
+      FileHandle sh = c->socket->getHandle();
+      int flags = fcntl((int)sh, F_GETFL, 0);
+      if ( (flags >= 0) && ((flags & O_NONBLOCK) == 0) )
+       {
+         c->socket->setNonBlocking(1);
+         bSocketChanged = true;
+       }
+    }
   err = c->socket->recv(&((char*)(buffer.getBuffer()))[dataRead],
                         MYSERVER_KB(8) - dataRead - 1, 0);
 
   if(err == -1 && !server->deleteConnection(c))
     return 0;
 
+  if ( bSocketChanged )
+       c->socket->setNonBlocking(0);
+
   buffer.setLength(dataRead + err);    
 
   c->setForceControl(0);





reply via email to

[Prev in Thread] Current Thread [Next in Thread]