Peter, On Sat, Mar 17, 2012 at 10:31 AM, Peter Stuge <pe...@stuge.se> wrote: > Mitchell Hashimoto wrote: >> +int >> +libssh2_channel_request_auth_agent(LIBSSH2_CHANNEL *channel); >> + >> +.SH DESCRIPTION >> +Request that agent forwarding be enabled for this SSH session. This sends >> the >> +request over this specific channel, which causes the agent listener to be >> +started on the remote side upon success. This agent listener will then run >> +for the duration of the SSH session. >> + >> +\fIchannel\fP - Previously opened channel instance such as returned by >> +.BR libssh2_channel_open_ex(3) > > This doesn't make any sense to me. Model like the existing API which > create a special purpose channel, and reuse their infrastructure, > specifically libssh2_channel_process_startup(). See libssh2.h about > libssh2_channel_subsystem. >
Thanks I'll take a look at that. > >> +++ b/example/ssh2_agent_forwarding.c >> @@ -0,0 +1,331 @@ > .. >> +int main(int argc, char *argv[]) >> +{ >> + const char *hostname = "127.0.0.1"; >> + const char *commandline = "uptime"; > > Suggest commandline "ssh-add -l" which will actually show the agent > forwarding being used. > > >> + /* tell libssh2 we want it all done non-blocking */ >> + libssh2_session_set_blocking(session, 0); > > Move this call to much later.. > > >> + while ((rc = libssh2_session_handshake(session, sock)) == >> + LIBSSH2_ERROR_EAGAIN); > .. >> + while ((rc = libssh2_userauth_password(session, username, >> password)) == >> + LIBSSH2_ERROR_EAGAIN); > .. >> + while ((rc = libssh2_userauth_publickey_fromfile(session, username, >> + "/home/user/" >> + ".ssh/id_rsa.pub", >> + "/home/user/" >> + ".ssh/id_rsa", >> + password)) == >> + LIBSSH2_ERROR_EAGAIN); > .. >> + while( (channel = libssh2_channel_open_session(session)) == NULL && >> + libssh2_session_last_error(session,NULL,NULL,0) == >> + LIBSSH2_ERROR_EAGAIN ) >> + { >> + waitsocket(sock, session); >> + } > .. >> + while( (rc = libssh2_channel_request_auth_agent(channel)) == >> + LIBSSH2_ERROR_EAGAIN ) >> + { >> + waitsocket(sock, session); >> + } > .. >> + while( (rc = libssh2_channel_exec(channel, commandline)) == >> + LIBSSH2_ERROR_EAGAIN ) >> + { >> + waitsocket(sock, session); >> + } > .. > > So that you do not need these very ugly loops! > > >> + for( ;; ) >> + { >> + /* loop until we block */ >> + int rc; >> + do >> + { >> + char buffer[0x4000]; >> + rc = libssh2_channel_read( channel, buffer, sizeof(buffer) ); >> + if( rc > 0 ) >> + { >> + int i; >> + bytecount += rc; >> + fprintf(stderr, "We read:\n"); >> + for( i=0; i < rc; ++i ) >> + fputc( buffer[i], stderr); >> + fprintf(stderr, "\n"); >> + } >> + else { >> + if( rc != LIBSSH2_ERROR_EAGAIN ) >> + /* no need to output this for the EAGAIN case */ >> + fprintf(stderr, "libssh2_channel_read returned %d\n", >> rc); >> + } >> + } >> + while( rc > 0 ); >> + >> + /* this is due to blocking that would occur otherwise so we loop on >> + this condition */ >> + if( rc == LIBSSH2_ERROR_EAGAIN ) >> + { >> + waitsocket(sock, session); >> + } >> + else >> + break; >> + } > > In fact, there is no reason at all to set non-blocking in this > example. It makes the code very ugly and is completely unneccessary. > > >> + while( (rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN ) >> + waitsocket(sock, session); > > Another ugly loop. Please get rid of all of them. Sorry, I really just copied the ssh2_exec.c example, which has all these same problems. I'll fix man and perhaps in the future I'll send another patch to fix up ssh2_exec as well. I'll address the things you pointed out. Thanks! Mitchell > > > //Peter > _______________________________________________ > libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel _______________________________________________ libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel