summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/libssh/session.h5
-rw-r--r--src/channels.c12
-rw-r--r--src/session.c6
3 files changed, 17 insertions, 6 deletions
diff --git a/include/libssh/session.h b/include/libssh/session.h
index 18bc41f..e6bea77 100644
--- a/include/libssh/session.h
+++ b/include/libssh/session.h
@@ -69,8 +69,13 @@ enum ssh_pending_call_e {
#define SSH_SESSION_FLAG_AUTHENTICATED 2
/* codes to use with ssh_handle_packets*() */
+/* Infinite timeout */
#define SSH_TIMEOUT_INFINITE -1
+/* Use the timeout defined by user if any. Mostly used with new connections */
#define SSH_TIMEOUT_USER -2
+/* Use the default timeout, depending on ssh_is_blocking() */
+#define SSH_TIMEOUT_DEFAULT -3
+/* Don't block at all */
#define SSH_TIMEOUT_NONBLOCKING 0
/* members that are common to ssh_session and ssh_bind */
diff --git a/src/channels.c b/src/channels.c
index 6e9b2eb..47fcee0 100644
--- a/src/channels.c
+++ b/src/channels.c
@@ -1222,7 +1222,7 @@ static int ssh_waitsession_unblocked(void *s){
* SSH_AGAIN Timeout elapsed (or in nonblocking mode)
*/
int ssh_channel_flush(ssh_channel channel){
- return ssh_blocking_flush(channel->session, SSH_TIMEOUT_USER);
+ return ssh_blocking_flush(channel->session, SSH_TIMEOUT_DEFAULT);
}
int channel_write_common(ssh_channel channel, const void *data,
@@ -1282,7 +1282,7 @@ int channel_write_common(ssh_channel channel, const void *data,
}
#endif
if (ssh_waitsession_unblocked(session) == 0){
- rc = ssh_handle_packets_termination(session, SSH_TIMEOUT_USER,
+ rc = ssh_handle_packets_termination(session, SSH_TIMEOUT_DEFAULT,
ssh_waitsession_unblocked, session);
if (rc == SSH_ERROR || !ssh_waitsession_unblocked(session))
goto out;
@@ -1298,7 +1298,7 @@ int channel_write_common(ssh_channel channel, const void *data,
/* nothing can be written */
ssh_log(session, SSH_LOG_PROTOCOL,
"Wait for a growing window message...");
- rc = ssh_handle_packets_termination(session, SSH_TIMEOUT_USER,
+ rc = ssh_handle_packets_termination(session, SSH_TIMEOUT_DEFAULT,
ssh_channel_waitwindow_termination,channel);
if (rc == SSH_ERROR || !ssh_channel_waitwindow_termination(channel))
goto out;
@@ -2681,13 +2681,13 @@ int ssh_channel_read(ssh_channel channel, void *dest, uint32_t count, int is_std
}
}
- /* block reading until all bytes are read
+ /* block reading until at least one byte has been read
* and ignore the trivial case count=0
*/
ctx.channel = channel;
ctx.buffer = stdbuf;
- ctx.count = count;
- rc = ssh_handle_packets_termination(session, SSH_TIMEOUT_USER,
+ ctx.count = 1;
+ rc = ssh_handle_packets_termination(session, SSH_TIMEOUT_DEFAULT,
ssh_channel_read_termination, &ctx);
if (rc == SSH_ERROR){
leave_function();
diff --git a/src/session.c b/src/session.c
index 4e71394..1faf0d6 100644
--- a/src/session.c
+++ b/src/session.c
@@ -512,6 +512,7 @@ int ssh_handle_packets(ssh_session session, int timeout) {
* (-1) means an infinite timeout.
* Specifying SSH_TIMEOUT_USER means to use the timeout
* specified in options. 0 means poll will return immediately.
+ * SSH_TIMEOUT_DEFAULT uses blocking parameters of the session.
* This parameter is passed to the poll() function.
*
* @param[in] fct Termination function to be used to determine if it is
@@ -530,6 +531,11 @@ int ssh_handle_packets_termination(ssh_session session, int timeout,
session->opts.timeout_usec);
else
timeout = SSH_TIMEOUT_NONBLOCKING;
+ } else if (timeout == SSH_TIMEOUT_DEFAULT){
+ if(ssh_is_blocking(session))
+ timeout = SSH_TIMEOUT_INFINITE;
+ else
+ timeout = SSH_TIMEOUT_NONBLOCKING;
}
ssh_timestamp_init(&ts);
tm = timeout;