diff -Naur ./lib/ssh.c ../new/lib/ssh.c
--- ./lib/ssh.c	Wed Aug 20 04:02:46 2008
+++ ../new/lib/ssh.c	Fri Sep 26 16:35:29 2008
@@ -437,7 +437,7 @@
   const char *fingerprint;
 #endif /* CURL_LIBSSH2_DEBUG */
   const char *host_public_key_md5;
-  int rc,i;
+  int rc = LIBSSH2_ERROR_NONE, i;
   int err;
 
   switch(sshc->state) {
@@ -524,6 +524,7 @@
     if(!sshc->authlist) {
       if((err = libssh2_session_last_errno(sshc->ssh_session)) ==
          LIBSSH2_ERROR_EAGAIN) {
+        rc = LIBSSH2_ERROR_EAGAIN;
         break;
       }
       else {
@@ -734,6 +735,7 @@
     if(!sshc->sftp_session) {
       if(libssh2_session_last_errno(sshc->ssh_session) ==
          LIBSSH2_ERROR_EAGAIN) {
+        rc = LIBSSH2_ERROR_EAGAIN;
         break;
       }
       else {
@@ -1238,6 +1240,7 @@
     if(!sshc->sftp_handle) {
       if(libssh2_session_last_errno(sshc->ssh_session) ==
          LIBSSH2_ERROR_EAGAIN) {
+        rc = LIBSSH2_ERROR_EAGAIN;
         break;
       }
       else {
@@ -1392,6 +1395,7 @@
     if(!sshc->sftp_handle) {
       if(libssh2_session_last_errno(sshc->ssh_session) ==
          LIBSSH2_ERROR_EAGAIN) {
+        rc = LIBSSH2_ERROR_EAGAIN;
         break;
       }
       else {
@@ -1426,6 +1430,7 @@
                                                 PATH_MAX,
                                                 &sshc->readdir_attrs);
     if(sshc->readdir_len == LIBSSH2_ERROR_EAGAIN) {
+      rc = LIBSSH2_ERROR_EAGAIN;
       break;
     }
     if(sshc->readdir_len > 0) {
@@ -1526,6 +1531,7 @@
                                               sshc->readdir_filename,
                                               PATH_MAX);
     if(sshc->readdir_len == LIBSSH2_ERROR_EAGAIN) {
+      rc = LIBSSH2_ERROR_EAGAIN;
       break;
     }
     Curl_safefree(sshc->readdir_linkPath);
@@ -1583,6 +1589,7 @@
   case SSH_SFTP_READDIR_DONE:
     if(libssh2_sftp_closedir(sshc->sftp_handle) ==
        LIBSSH2_ERROR_EAGAIN) {
+      rc = LIBSSH2_ERROR_EAGAIN;
       break;
     }
     sshc->sftp_handle = NULL;
@@ -1606,6 +1613,7 @@
     if(!sshc->sftp_handle) {
       if(libssh2_session_last_errno(sshc->ssh_session) ==
          LIBSSH2_ERROR_EAGAIN) {
+        rc = LIBSSH2_ERROR_EAGAIN;
         break;
       }
       else {
@@ -1783,6 +1791,7 @@
     if(!sshc->ssh_channel) {
       if(libssh2_session_last_errno(sshc->ssh_session) ==
          LIBSSH2_ERROR_EAGAIN) {
+        rc = LIBSSH2_ERROR_EAGAIN;
         break;
       }
       else {
@@ -1829,6 +1838,7 @@
     if(!sshc->ssh_channel) {
       if(libssh2_session_last_errno(sshc->ssh_session) ==
          LIBSSH2_ERROR_EAGAIN) {
+        rc = LIBSSH2_ERROR_EAGAIN;
         break;
       }
       else {
@@ -1978,6 +1988,23 @@
     sshc->nextstate = SSH_NO_STATE;
     state(conn, SSH_STOP);
     break;
+  }
+
+  if(LIBSSH2_ERROR_EAGAIN == rc) {
+    int dir = libssh2_session_block_direction(sshc->ssh_session);
+    curl_socket_t fd_read;
+    curl_socket_t fd_write;
+    if (LIBSSH2_SOCKET_BLOCK_INBOUND == dir)
+    {
+      fd_read = sock;
+      fd_write = CURL_SOCKET_BAD;
+    } else
+    if (LIBSSH2_SOCKET_BLOCK_OUTBOUND == dir)
+    {
+      fd_read = CURL_SOCKET_BAD;
+      fd_write = sock;
+    }
+    Curl_socket_ready(fd_read, fd_write, 1000); /* ignore result */
   }
 
   return result;
