The new code in sftp.c gets the current blocking state of libssh2 to restore it afterwards, then sets the state to what is desired. However, libssh2_sftp_read() will set the blocking state to 1, do it's business and then restore the state (probably to 0). Since the blocking/non-blocking state is setup before it is passed to libssh2, libssh2 doesn't know what the current state is.
We can require all new programs to explicitly call libssh2_channel_set_blocking() to ensure libssh2 knows the proper state of the socket. But existing program my show strange behavior. What I would like to add is a routine that is always called from within libssh2_channel_open_session() so the libssh2 blocking variable can be set to the same as the socket. I have started to modify _libssh2_nonblock(), but have limited access to other systems, so a lot default to blocking = 1. This is the code I would like to add: /* * _libssh2_get_socket_blocking() gets the given blocking or non- blocking * state of the socket. */ static int _libssh2_get_socket_blocking(int sockfd) /* operate on this */ { #undef SETBLOCK #define SETBLOCK 0 #ifdef HAVE_O_NONBLOCK /* most recent unix versions */ int flags; if ((flags = fcntl(sockfd, F_GETFL, 0)) == -1) { /* Assume blocking on error */ return 1; } return (flags & O_NONBLOCK); #undef SETBLOCK #define SETBLOCK 1 #endif #if 0 #if defined(HAVE_FIONBIO) && (SETBLOCK == 0) /* older unix versions */ int flags; flags = nonblock; return ioctl(sockfd, FIONBIO, &flags); #undef SETBLOCK #define SETBLOCK 2 #endif #if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0) /* Windows? */ unsigned long flags; flags = nonblock; return ioctlsocket(sockfd, FIONBIO, &flags); #undef SETBLOCK #define SETBLOCK 3 #endif #if defined(HAVE_IOCTLSOCKET_CASE) && (SETBLOCK == 0) /* presumably for Amiga */ return IoctlSocket(sockfd, FIONBIO, (long)nonblock); #undef SETBLOCK #define SETBLOCK 4 #endif #if defined(HAVE_SO_NONBLOCK) && (SETBLOCK == 0) /* BeOS */ long b = nonblock ? 1 : 0; return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); #undef SETBLOCK #define SETBLOCK 5 #endif #endif /* 0 */ #ifdef HAVE_DISABLED_NONBLOCKING return 1; /* returns blocking */ #undef SETBLOCK #define SETBLOCK 6 #endif #if (SETBLOCK == 0) #error "no non-blocking method was found/used/get" #endif } And then add to libssh2_channel_open_ex() @@ -226,6 +295,8 @@ channel->remote.window_size = window_size; channel->remote.window_size_initial = window_size; channel->remote.packet_size = packet_size; + + channel->blocking = _libssh2_get_socket_blocking(session- >socket_fd); libssh2_channel_add(session, channel); Jim -- /"\ 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 --------------------------------------------------------------------- "Eagles may soar, but weasels don't get sucked into jet engines" -- Anon ------------------------------------------------------------------------- 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