aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2013-12-04 14:22:10 +0100
committerAndreas Schneider <asn@cryptomilk.org>2013-12-04 20:34:52 +0100
commit397be918cd081b05456f28034118e865d061720c (patch)
tree5305b3b3d6fd370fbb3bd2d23b847f26963b861a
parent880fdb4b529f12471f9f8e3b1766fb7be3aa0468 (diff)
downloadlibssh-397be918cd081b05456f28034118e865d061720c.tar.gz
libssh-397be918cd081b05456f28034118e865d061720c.tar.xz
libssh-397be918cd081b05456f28034118e865d061720c.zip
channels: Add a ssh_channel_read_timeout function.
-rw-r--r--include/libssh/libssh.h1
-rw-r--r--src/channels.c46
2 files changed, 44 insertions, 3 deletions
diff --git a/include/libssh/libssh.h b/include/libssh/libssh.h
index f3da1e3c..9a00ea7c 100644
--- a/include/libssh/libssh.h
+++ b/include/libssh/libssh.h
@@ -377,6 +377,7 @@ LIBSSH_API int ssh_channel_open_x11(ssh_channel channel, const char *orig_addr,
LIBSSH_API int ssh_channel_poll(ssh_channel channel, int is_stderr);
LIBSSH_API int ssh_channel_poll_timeout(ssh_channel channel, int timeout, int is_stderr);
LIBSSH_API int ssh_channel_read(ssh_channel channel, void *dest, uint32_t count, int is_stderr);
+LIBSSH_API int ssh_channel_read_timeout(ssh_channel channel, void *dest, uint32_t count, int is_stderr, int timeout);
LIBSSH_API int ssh_channel_read_nonblocking(ssh_channel channel, void *dest, uint32_t count,
int is_stderr);
LIBSSH_API int ssh_channel_request_env(ssh_channel channel, const char *name, const char *value);
diff --git a/src/channels.c b/src/channels.c
index 6412a863..a9226ddb 100644
--- a/src/channels.c
+++ b/src/channels.c
@@ -2670,7 +2670,40 @@ static int ssh_channel_read_termination(void *s){
* @warning The read function using a buffer has been renamed to
* channel_read_buffer().
*/
-int ssh_channel_read(ssh_channel channel, void *dest, uint32_t count, int is_stderr) {
+int ssh_channel_read(ssh_channel channel, void *dest, uint32_t count, int is_stderr)
+{
+ return ssh_channel_read_timeout(channel, dest, count, is_stderr, -1);
+}
+
+/**
+ * @brief Reads data from a channel.
+ *
+ * @param[in] channel The channel to read from.
+ *
+ * @param[in] dest The destination buffer which will get the data.
+ *
+ * @param[in] count The count of bytes to be read.
+ *
+ * @param[in] is_stderr A boolean value to mark reading from the stderr flow.
+ *
+ * @param[in] timeout A timeout in seconds. A value of -1 means infinite
+ * timeout.
+ *
+ * @return The number of bytes read, 0 on end of file or SSH_ERROR
+ * on error. In nonblocking mode it Can return 0 if no data
+ * is available or SSH_AGAIN.
+ *
+ * @warning This function may return less than count bytes of data, and won't
+ * block until count bytes have been read.
+ * @warning The read function using a buffer has been renamed to
+ * channel_read_buffer().
+ */
+int ssh_channel_read_timeout(ssh_channel channel,
+ void *dest,
+ uint32_t count,
+ int is_stderr,
+ int timeout)
+{
ssh_session session;
ssh_buffer stdbuf;
uint32_t len;
@@ -2718,8 +2751,15 @@ int ssh_channel_read(ssh_channel channel, void *dest, uint32_t count, int is_std
ctx.channel = channel;
ctx.buffer = stdbuf;
ctx.count = 1;
- rc = ssh_handle_packets_termination(session, SSH_TIMEOUT_DEFAULT,
- ssh_channel_read_termination, &ctx);
+
+ if (timeout < 0) {
+ timeout = SSH_TIMEOUT_DEFAULT;
+ }
+
+ rc = ssh_handle_packets_termination(session,
+ timeout,
+ ssh_channel_read_termination,
+ &ctx);
if (rc == SSH_ERROR){
return rc;
}