diff options
| author | Andreas Schneider <asn@cryptomilk.org> | 2013-12-04 14:22:10 +0100 |
|---|---|---|
| committer | Andreas Schneider <asn@cryptomilk.org> | 2013-12-04 20:34:13 +0100 |
| commit | d65777b5705aff7b9af969c8210e3f6671dc105d (patch) | |
| tree | 72e37f5182b9ea581dc725e35aa05143e20fbede | |
| parent | 2df00fd84cbef7244325b2467d9e1d652a5c8629 (diff) | |
| download | libssh-d65777b5705aff7b9af969c8210e3f6671dc105d.tar.gz libssh-d65777b5705aff7b9af969c8210e3f6671dc105d.tar.xz libssh-d65777b5705aff7b9af969c8210e3f6671dc105d.zip | |
channels: Add a ssh_channel_read_timeout function.
| -rw-r--r-- | include/libssh/libssh.h | 1 | ||||
| -rw-r--r-- | src/channels.c | 46 |
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 0a8b9f2f..ae977c0f 100644 --- a/src/channels.c +++ b/src/channels.c @@ -2695,7 +2695,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; @@ -2743,8 +2776,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; } |
