I am actually using libssh2_channel_write. I am basically just doing a cd <somedir> and then reading the output. The cd finishes and yet I am stuck in my loop since I never receive an EOF. I can use waitsocket. The Sleep is just test code. waitsocket doesn't imrpove the situation.
On Thu, Apr 12, 2012 at 11:25 AM, Matthew Booth <[email protected]> wrote: > On 04/11/2012 05:55 PM, Zulfiqar Malik wrote: > >> I am trying to write a very small shell client for some automation >> related things and am running into problems with libssh2_channel_read. >> Here are the two scenarios (application has to be single threaded.): >> 1. Blocking mode: libssh2_channel_read blocks if there's no data and >> never returns. Its impossible to use this function reliably. >> 2. Non-blocking mode: libssh2_channel_read doesn't block but keeps on >> returning -37 (LIBSSH2_ERROR_EAGAIN) and I end up with essentially the >> same problem i.e. stuck in an infinite loop. To top it off >> libssh2_channel_eof doesn't work and always returns 0. >> > > You don't say what's happening at the other end. Can we assuming it's > something like: > > libssh2_channel_exec(channel, "cat foo"); > > and that you want to exit when the contents of foo have been returned? Is > is possible, for example, that your channel is not returning eof because it > isn't eof? > > > I don't know what's wrong or what needs to be done but I cannot seem to >> find a way through this problem. I have tried libssh2 v 1.3.1 and the >> latest one 1.4.1 with the same result. Given below is my readOutput >> method which reads the output: >> for (;;count++) >> { >> /* loop until we block */ >> int rc; >> do { >> char buffer[1024]; >> rc = libssh2_channel_read(channel, buffer, sizeof(buffer)); >> if (rc > 0) { >> bytecount += rc; >> buffer[rc] = '\0'; >> > > Probably not related, but ^^^ corrupts the stack if libssh2_channel_read > returns a full buffer. If you're going to explicitly null terminate the > buffer, you need: > > rc = libssh2_channel_read(channel, buffer, sizeof(buffer) - 1); > > > fprintf(stderr, "%s", buffer); >> count = 0; >> } >> else { >> if (rc != LIBSSH2_ERROR_EAGAIN) >> fprintf(stderr, "libssh2_channel_read returned >> %d\n", rc); >> } >> if (libssh2_channel_eof(channel)) { >> rc = 0; >> break; >> } >> } >> while(rc > 0); >> //::Sleep(3); >> /* this is due to blocking that would occur otherwise so we loop >> on >> this condition */ >> if(rc == LIBSSH2_ERROR_EAGAIN) >> { >> ::Sleep(5); >> //waitsocket(sock, sshSession); >> > > I'm assuming this references something like the waitsocket() example at > http://www.libssh2.org/**examples/ssh2_exec.html<http://www.libssh2.org/examples/ssh2_exec.html>. > Why the sleep instead? > > } >> else >> break; >> } >> > > Matt > -- > Matthew Booth, RHCA, RHCSS > Red Hat Engineering, Virtualisation Team > > GPG ID: D33C3490 > GPG FPR: 3733 612D 2D05 5458 8A8A 1600 3441 EA19 D33C 3490 > -- Regards, Zulfiqar Inayat Malik.
_______________________________________________ libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel
