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. > +++ 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. //Peter _______________________________________________ libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel