I created a non-blocking version of libssh2_sftp_readdir(), like  
libssh2_sftp_read() and libssh2_sftp_write().  While these functions  
"set" the mode to non-blocking, it isn't even close.  The  
libssh2_chanel_read() function seems to be non-blocking capable, so I  
started there and migrated the non-blocking up.  In most of the  
places I while loops on PACKET_EAGAIN, which still blocks in non- 
blocking mode just like before, but the code still works.  I have  
been testing between two machines, the target machine is FreeBSD with  
ipfw(8) and traffic shaping.  To test the response on a slow link I  
have the bandwidth limited to 2500bit/s in both directions on tcp/22.

To make libssh2_sftp_packet_requirev() able to be called repeatably  
with out calling flush and still being able to honor the value of  
LIBSSH2_READ_TIMEOUT I added a new variable to the _LIBSSH2_SFTP  
structure to track if this was the first time in or subsequent calls.

My most serious problem is in the bottom while loop in  
libssh2_sftp_packet_read().  If I get PACKET_EAGAIN from  
_libssh2_channel_read() to be non-blocking something has to be done  
with the data that has been read.  My first thought was to just call  
libssh2_sftp_packet_add() with the data and number of bytes that have  
been received.  This crashes nicely, because the header of the packet  
gives a different length then what is there.  My second option is to  
temporarily store the packet in the _LIBSSH_SFTP structure and use  
that to allow the bypassing of the top portion of  
libssh2_sftp_packet_read() and just start reading.  Then the  
temporary storage would need to be removed in case of other errors,  
might be hard to get right.

Attached is my code changes as they stand, edited with TAB for indent  
set a 4 spaces (like the original code in the library).

Jim

Index: include/libssh2_sftp.h
===================================================================
RCS file: /cvsroot/libssh2/libssh2/include/libssh2_sftp.h,v
retrieving revision 1.12
diff -u -r1.12 libssh2_sftp.h
--- include/libssh2_sftp.h      18 Apr 2007 18:51:03 -0000      1.12
+++ include/libssh2_sftp.h      19 Apr 2007 16:44:21 -0000
@@ -191,7 +191,11 @@
LIBSSH2_API ssize_t libssh2_sftp_readnb(LIBSSH2_SFTP_HANDLE *handle,
                                        char *buffer, size_t buffer_maxlen);
-LIBSSH2_API int libssh2_sftp_readdir(LIBSSH2_SFTP_HANDLE *handle,  
char *buffer, size_t buffer_maxlen, LIBSSH2_SFTP_ATTRIBUTES *attrs);
+LIBSSH2_API int libssh2_sftp_readdir(LIBSSH2_SFTP_HANDLE *handle,  
char *buffer,
+                                     size_t buffer_maxlen,  
LIBSSH2_SFTP_ATTRIBUTES *attrs);
+LIBSSH2_API int libssh2_sftp_readdirnb(LIBSSH2_SFTP_HANDLE *handle,  
char *buffer,
+                                       size_t buffer_maxlen,  
LIBSSH2_SFTP_ATTRIBUTES *attrs);
+
LIBSSH2_API ssize_t libssh2_sftp_write(LIBSSH2_SFTP_HANDLE *handle,
                                       const char *buffer, size_t count);
LIBSSH2_API ssize_t libssh2_sftp_writenb(LIBSSH2_SFTP_HANDLE *handle,
@@ -238,6 +242,9 @@
#define libssh2_sftp_readlink(sftp, path, target, maxlen)        
libssh2_sftp_symlink_ex((sftp), (path), strlen(path), (target),  
(maxlen), LIBSSH2_SFTP_READLINK)
#define libssh2_sftp_realpath(sftp, path, target, maxlen)        
libssh2_sftp_symlink_ex((sftp), (path), strlen(path), (target),  
(maxlen), LIBSSH2_SFTP_REALPATH)
+LIBSSH2_API void libssh2_sftp_set_blocking(LIBSSH2_SFTP *session,  
int blocking);
+LIBSSH2_API int libssh2_sftp_get_blocking(LIBSSH2_SFTP *session);
+
#ifdef __cplusplus
} /* extern "C" */
#endif

--

/"\   ASCII Ribbon Campaign  .
\ / - NO HTML/RTF in e-mail  .
  X  - NO Word docs in e-mail .
/ \ -----------------------------------------------------------------
[EMAIL PROTECTED]      http://www.FreeBSD.org     The Power to Serve
[EMAIL PROTECTED]  http://www.TheHousleys.net
---------------------------------------------------------------------
Fortune Not Found:
Abort, Retry, Ignore?




-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
libssh2-devel mailing list
libssh2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libssh2-devel

Reply via email to