diff --git a/include/libssh/libssh.h b/include/libssh/libssh.h index 20e87595..958ff57b 100644 --- a/include/libssh/libssh.h +++ b/include/libssh/libssh.h @@ -362,6 +362,7 @@ LIBSSH_API int ssh_channel_is_closed(ssh_channel channel); LIBSSH_API int ssh_channel_is_eof(ssh_channel channel); LIBSSH_API int ssh_channel_is_open(ssh_channel channel); LIBSSH_API ssh_channel ssh_channel_new(ssh_session session); +LIBSSH_API int ssh_channel_open_auth_agent(ssh_channel channel); LIBSSH_API int ssh_channel_open_forward(ssh_channel channel, const char *remotehost, int remoteport, const char *sourcehost, int localport); LIBSSH_API int ssh_channel_open_session(ssh_channel channel); diff --git a/src/channels.c b/src/channels.c index dd0f0ff1..0e514324 100644 --- a/src/channels.c +++ b/src/channels.c @@ -948,6 +948,40 @@ int ssh_channel_open_session(ssh_channel channel) { NULL); } +/** + * @brief Open an agent authentication forwarding channel. This type of channel + * can be opened by a server towards a client in order to provide SSH-Agent services + * to the server-side process. This channel can only be opened if the client + * claimed support by sending a channel request beforehand. + * + * @param[in] channel An allocated channel. + * + * @return SSH_OK on success, + * SSH_ERROR if an error occurred, + * SSH_AGAIN if in nonblocking mode and call has + * to be done again. + * + * @see channel_open_forward() + */ +int ssh_channel_open_auth_agent(ssh_channel channel){ + if(channel == NULL) { + return SSH_ERROR; + } + +#ifdef WITH_SSH1 + if (channel->session->version == 1) { + return SSH_ERROR; + } +#endif + + return channel_open(channel, + "auth-agent", + CHANNEL_INITIAL_WINDOW, + CHANNEL_MAX_PACKET, + NULL); +} + + /** * @brief Open a TCP/IP forwarding channel. *