Daniel Stenberg wrote: > On Fri, 20 Mar 2009, Heiner Steven wrote: > >>> Are you using a blocking or non-blocking socket? >> I tried both. As a default I used a blocking socket, resulting in the >> symptom decribed. When I modified the code to use a non-blocking socket >> (libssh2_session_set_blocking(session, 0)) the function returns several >> times (maybe 10, 20 times) with >> >> LIBSSH2SFTP_EAGAIN == LIBSSH2_ERROR_EAGAIN == -37 >> >> and blocks afterwards. > > Why does it return that 10-20 times? Do you call it immediately in a > busy-loop? > > What function blocks with a non-blocking socket? That surely can't hang on > the > recv() then at least...
well, it "hangs" on recvfrom(3: The relevant part of the code: -------------------------------------------------------------------------- [...] /* No SFTP session: create a new one */ if (!(session = getsession(conn, url))) { return NULL; } libssh2_session_set_blocking(cp->session, 0); while (!(cp->sftp = libssh2_sftp_init(cp->session))) { errmsg("DEBUG: libssh2_sftp_init failed: %d\n", libssh2_session_last_errno(cp->session)); if (libssh2_session_last_errno(cp->session) != LIBSSH2SFTP_EAGAIN) break; sleep(1); } if (!cp->sftp) { ssherrmsg(cp->session, "ERROR: could not initiate SFTP session"); return NULL; } -------------------------------------------------------------------------- The output of the program: scopy: DEBUG: getsession: authenticate_session succeeded; session=0xa486b0 scopy: DEBUG: libssh2_sftp_init failed: -37 scopy: DEBUG: libssh2_sftp_init failed: -37 scopy: DEBUG: libssh2_sftp_init failed: -37 [The program "hangs" here] The accompanying "strace" output: -------------------------------------------------------------------------- write(2, "DEBUG: getsession: authenticate_s"..., 68) = 68 write(2, "\n"..., 1) = 1 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 sendto(3, "\t'\34\361\33i\212\22\222-\200\3661\20...@$qa\320\254\300i\331\323\5h\17\233\30o\374"..., 68, MSG_NOSIGNAL, NULL, 0) = 68 recvfrom(3, 0x164c8b0, 16384, 16384, 0, 0) = -1 EAGAIN (Resource temporarily unavailable) select(4, [3], NULL, NULL, {60, 0}) = 1 (in [3], left {59, 901096}) write(2, "scopy: "..., 7) = 7 write(2, "DEBUG: libssh2_sftp_init failed: "..., 36) = 36 write(2, "\n"..., 1) = 1 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 nanosleep({1, 0}, {1, 0}) = 0 recvfrom(3, "\315?:U\224+\322\374\351\220\224\271zt{h\330+\242\374\257\365\236\362\335+\3534yHb\365Q"..., 16384, MSG_NOSIGNAL, NULL, NULL) = 52 sendto(3, "#\237\367\230\0\317\310\2521n\16Ul\221i([\271\f\363JC^\352F\374\320u\244\256\277\347\233"..., 68, MSG_NOSIGNAL, NULL, 0) = 68 recvfrom(3, 0x164c8b0, 16384, 16384, 0, 0) = -1 EAGAIN (Resource temporarily unavailable) select(4, [3], NULL, NULL, {60, 0}) = 1 (in [3], left {59, 999431}) write(2, "scopy: "..., 7) = 7 write(2, "DEBUG: libssh2_sftp_init failed: "..., 36) = 36 write(2, "\n"..., 1) = 1 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 nanosleep({1, 0}, {1, 0}) = 0 recvfrom(3, "8I\302\"/k\\<Eb\342\35\246<\36Z\377z\221\314\243\23Bu\32f\304T\203\345|%\225"..., 16384, MSG_NOSIGNAL, NULL, NULL) = 88 sendto(3, "dz\223\376\212k\336\346\272\276\3553\333\222F\16]n\16\322]\31\305n\t\222\213\274\276:\344p\241"..., 52, MSG_NOSIGNAL, NULL, 0) = 52 recvfrom(3, 0x164c8b0, 16384, 16384, 0, 0) = -1 EAGAIN (Resource temporarily unavailable) write(2, "scopy: "..., 7) = 7 write(2, "DEBUG: libssh2_sftp_init failed: "..., 36) = 36 write(2, "\n"..., 1) = 1 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 nanosleep({1, 0}, {1, 0}) = 0 recvfrom(3, "br\0366[5\33\312\271\17\253\3313c\211\305%\262\246\242\214A\264\332:`\tq\227}\342H\270"..., 16384, MSG_NOSIGNAL, NULL, NULL) = 148 recvfrom(3, 0x164c8b0, 16384, 16384, 0, 0) = -1 EAGAIN (Resource temporarily unavailable) sendto(3, "\233\373\310\356Oe2\312|\3 @\234\343z1\242\365z\303\323\204\262\1...@\303a\321\255x\243"..., 52, MSG_NOSIGNAL, NULL, 0) = 52 recvfrom(3, 0x164c8b0, 16384, 16384, 0, 0) = -1 EAGAIN (Resource temporarily unavailable) fcntl(3, F_GETFL) = 0x802 (flags O_RDWR|O_NONBLOCK) fcntl(3, F_SETFL, O_RDWR) = 0 sendto(3, "Ld\10\244;n>\1\202<\6YsYG\"Dd\242\1*\360\3723\236\267\305\357\204E\374o;"..., 68, MSG_NOSIGNAL, NULL, 0) = 68 recvfrom(3, "\217'\37\245\234\301\314\3\227\247U\202] \4t\367tpQDN\224zK>9tx\354TA\334"..., 16384, MSG_NOSIGNAL, NULL, NULL) = 84 recvfrom(3, 0x164c8b0, 16384, 16384, 0, 0) = ? ERESTARTSYS (To be restarted) [The program hangs here] --- SIGINT (Interrupt) @ 0 (0) --- -------------------------------------------------------------------------- Here is a stack backtrace I got after compiling the program with "-g" and aborting it using SIGQUIT: -------------------------------------------------------------------------- scopy: DEBUG: getsession: authenticate_session succeeded; session=0xa486b0 scopy: DEBUG: libssh2_sftp_init failed: -37 scopy: DEBUG: libssh2_sftp_init failed: -37 scopy: DEBUG: libssh2_sftp_init failed: -37 ^\Quit(coredump) $ gdb scopy core [...] (gdb) bt #0 0x00007fbbefe3e0d5 in recv () from /lib/libc.so.6 #1 0x0000000000428416 in _libssh2_packet_read (session=0xa486b0) at transport.c:362 #2 0x000000000040f504 in libssh2_channel_read_ex (channel=0xa50a20, stream_id=0, buf=0xa4def0 "à\b¥", buflen=37) at channel.c:1526 #3 0x000000000041b56b in sftp_packet_read (sftp=0xa51770) at sftp.c:188 #4 0x000000000041ba07 in sftp_packet_requirev (sftp=0xa51770, num_valid_responses=2, valid_responses=0x4354a1 "ieLStatting", request_id=0, data=0x7ffff8f07538, data_len=0x7ffff8f07540) at sftp.c:354 #5 0x0000000000421aba in libssh2_sftp_stat_ex (sftp=0xa51770, path=0xa46ff0 "/tmp", path_len=4, stat_type=0, attrs=0xa46f40) at sftp.c:2175 #6 0x0000000000409079 in remote_fstat (connp=<value optimized out>, url=0xa46e80, mustexist=false) at smove/remoteops.c:965 #7 0x000000000040537b in main (argc=4, argv=0x7ffff8f08148) at smove/smove.c:850 (gdb) -------------------------------------------------------------------------- >>> No it isn't, but I'll admit I don't do a lot of tests with blocking >>> sockets. >> The problem also exists with non-blocking sockets. > > I've done quite a lot of tests with non-blocking and I've not seen this, and > I've also got reports from others who've done the libcurl-based (~30) tests > without experiencing this. It might indicate that the problem happens only in > more specific situations, like with a particular server on a particular OS or > something else... This could be the case, but on the other hand version 0.18 and 1.0 both run without problems on the same system. I wonder what the error code "ERESTARTSYS" means, which recvfrom() returns on the SIGQUIT signal. Shouldn't the system call return with EINTR? Both are different: 85 ERESTART Interrupted system call should be restarted 4 EINTR Interrupted system call The errno result code does not change even when I catch the signal SIGQUIT and install a signal handler without SA_RESTART flags. Heiner ------------------------------------------------------------------------------ Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are powering Web 2.0 with engaging, cross-platform capabilities. Quickly and easily build your RIAs with Flex Builder, the Eclipse(TM)based development software that enables intelligent coding and step-through debugging. Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com _______________________________________________ libssh2-devel mailing list libssh2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libssh2-devel