diff options
author | Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> | 2014-01-11 00:33:33 +0100 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2014-01-16 09:13:57 +0100 |
commit | 634671db11a3144f1abd900ee30231d7c9a51064 (patch) | |
tree | 1a52c2ce741bdd119965eb9dc09f8a23f652e038 | |
parent | 1f689261eca006dfe11d7fd220218209a8d4d190 (diff) | |
download | libssh-634671db11a3144f1abd900ee30231d7c9a51064.tar.gz libssh-634671db11a3144f1abd900ee30231d7c9a51064.tar.xz libssh-634671db11a3144f1abd900ee30231d7c9a51064.zip |
channel: Add ssh_channel_accept_forward().
This works same way as ssh_forward_accept() but can return a destination
port of the channel (useful if SSH connection forwarding several TCP/IP
ports).
Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
-rw-r--r-- | include/libssh/libssh.h | 1 | ||||
-rw-r--r-- | src/channels.c | 26 |
2 files changed, 24 insertions, 3 deletions
diff --git a/include/libssh/libssh.h b/include/libssh/libssh.h index 46aafae1..2b125f23 100644 --- a/include/libssh/libssh.h +++ b/include/libssh/libssh.h @@ -406,6 +406,7 @@ LIBSSH_API void ssh_disconnect(ssh_session session); LIBSSH_API char *ssh_dirname (const char *path); LIBSSH_API int ssh_finalize(void); LIBSSH_API ssh_channel ssh_forward_accept(ssh_session session, int timeout_ms); +LIBSSH_API ssh_channel ssh_channel_accept_forward(ssh_session session, int timeout_ms, int *destination_port); LIBSSH_API int ssh_forward_cancel(ssh_session session, const char *address, int port); LIBSSH_API int ssh_forward_listen(ssh_session session, const char *address, int port, int *bound_port); LIBSSH_API void ssh_free(ssh_session session); diff --git a/src/channels.c b/src/channels.c index 14200696..9c9b3c2a 100644 --- a/src/channels.c +++ b/src/channels.c @@ -1964,7 +1964,7 @@ error: } static ssh_channel ssh_channel_accept(ssh_session session, int channeltype, - int timeout_ms) { + int timeout_ms, int *destination_port) { #ifndef _WIN32 static const struct timespec ts = { .tv_sec = 0, @@ -1991,6 +1991,10 @@ static ssh_channel ssh_channel_accept(ssh_session session, int channeltype, ssh_message_subtype(msg) == channeltype) { ssh_list_remove(session->ssh_message_list, iterator); channel = ssh_message_channel_request_open_reply_accept(msg); + if(destination_port) { + *destination_port=msg->channel_request_open.destination_port; + } + ssh_message_free(msg); return channel; } @@ -2021,7 +2025,7 @@ static ssh_channel ssh_channel_accept(ssh_session session, int channeltype, * the server. */ ssh_channel ssh_channel_accept_x11(ssh_channel channel, int timeout_ms) { - return ssh_channel_accept(channel->session, SSH_CHANNEL_X11, timeout_ms); + return ssh_channel_accept(channel->session, SSH_CHANNEL_X11, timeout_ms, NULL); } /** @@ -2275,7 +2279,23 @@ error: * the server */ ssh_channel ssh_forward_accept(ssh_session session, int timeout_ms) { - return ssh_channel_accept(session, SSH_CHANNEL_FORWARDED_TCPIP, timeout_ms); + return ssh_channel_accept(session, SSH_CHANNEL_FORWARDED_TCPIP, timeout_ms, NULL); +} + +/** + * @brief Accept an incoming TCP/IP forwarding channel and get information + * about incomming connection + * @param[in] session The ssh session to use. + * + * @param[in] timeout_ms A timeout in milliseconds. + * + * @param[in] destination_port A pointer to destination port or NULL. + * + * @return Newly created channel, or NULL if no incoming channel request from + * the server + */ +ssh_channel ssh_channel_accept_forward(ssh_session session, int timeout_ms, int* destination_port) { + return ssh_channel_accept(session, SSH_CHANNEL_FORWARDED_TCPIP, timeout_ms, destination_port); } /** |