Subject: Re: libssh2_channel_read issues

Re: libssh2_channel_read issues

From: Matthew Booth <mbooth_at_redhat.com>
Date: Thu, 12 Apr 2012 15:28:29 +0100

On 04/12/2012 03:00 PM, Zulfiqar Malik wrote:
> 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.

Can you paste some code? I'm not clear on what you mean here.

Matt

> 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 <mbooth_at_redhat.com
> <mailto:mbooth_at_redhat.com>> 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

-- 
Matthew Booth, RHCA, RHCSS
Red Hat Engineering, Virtualisation Team
GPG ID:  D33C3490
GPG FPR: 3733 612D 2D05 5458 8A8A 1600 3441 EA19 D33C 3490
_______________________________________________
libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel
Received on 2012-04-12