aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Shneyder <o.shneyder@phoca-gmbh.de>2014-01-11 00:33:33 +0100
committerAndreas Schneider <asn@cryptomilk.org>2014-01-16 09:13:57 +0100
commit634671db11a3144f1abd900ee30231d7c9a51064 (patch)
tree1a52c2ce741bdd119965eb9dc09f8a23f652e038
parent1f689261eca006dfe11d7fd220218209a8d4d190 (diff)
downloadlibssh-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.h1
-rw-r--r--src/channels.c26
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);
}
/**