diff options
-rw-r--r-- | include/libssh/misc.h | 1 | ||||
-rw-r--r-- | src/misc.c | 48 | ||||
-rw-r--r-- | src/session.c | 13 |
3 files changed, 40 insertions, 22 deletions
diff --git a/include/libssh/misc.h b/include/libssh/misc.h index c05a5870..eb6c1afa 100644 --- a/include/libssh/misc.h +++ b/include/libssh/misc.h @@ -78,6 +78,7 @@ const void *_ssh_list_pop_head(struct ssh_list *list); #define ssh_list_pop_head(type, ssh_list)\ ((type)_ssh_list_pop_head(ssh_list)) +int ssh_make_milliseconds(long sec, long usec); void ssh_timestamp_init(struct ssh_timestamp *ts); int ssh_timeout_elapsed(struct ssh_timestamp *ts, int timeout); int ssh_timeout_update(struct ssh_timestamp *ts, int timeout); @@ -921,6 +921,24 @@ static int ssh_timestamp_difference(struct ssh_timestamp *old, /** * @internal + * @brief turn seconds and microseconds pair (as provided by user-set options) + * into millisecond value + * @param[in] sec number of seconds + * @param[in] usec number of microseconds + * @returns milliseconds, or 10000 if user supplied values are equal to zero + */ +int ssh_make_milliseconds(long sec, long usec) { + int res = usec ? (usec / 1000) : 0; + res += (sec * 1000); + if (res == 0) { + res = 10 * 1000; /* use a reasonable default value in case + * SSH_OPTIONS_TIMEOUT is not set in options. */ + } + return res; +} + +/** + * @internal * @brief Checks if a timeout is elapsed, in function of a previous * timestamp and an assigned timeout * @param[in] ts pointer to an existing timestamp @@ -930,17 +948,27 @@ static int ssh_timestamp_difference(struct ssh_timestamp *old, * 0 otherwise */ int ssh_timeout_elapsed(struct ssh_timestamp *ts, int timeout) { - struct ssh_timestamp now; - if(timeout < 0) - return 0; // -1 means infinite timeout - if(timeout == SSH_TIMEOUT_NONBLOCKING) - return 1; // 0 means no timeout - ssh_timestamp_init(&now); + struct ssh_timestamp now; + + switch(timeout) { + case -2: /* + * -2 means user-defined timeout as available in + * session->timeout, session->timeout_usec. + */ + fprintf(stderr, "ssh_timeout_elapsed called with -2. this needs to " + "be fixed. please set a breakpoint on %s:%d and " + "fix the caller\n", __FILE__, __LINE__); + case -1: /* -1 means infinite timeout */ + return 0; + case 0: /* 0 means no timeout */ + return 1; + default: + break; + } - if(ssh_timestamp_difference(ts,&now) >= timeout) - return 1; - else - return 0; + ssh_timestamp_init(&now); + + return (ssh_timestamp_difference(ts,&now) >= timeout); } /** diff --git a/src/session.c b/src/session.c index b3ee193e..2160ffea 100644 --- a/src/session.c +++ b/src/session.c @@ -306,7 +306,7 @@ static int ssh_flush_termination(void *c){ * @brief Blocking flush of the outgoing buffer * @param[in] session The SSH session * @param[in] timeout Set an upper limit on the time for which this function - * will block, in milliseconds. Specifying a negative value + * will block, in milliseconds. Specifying -1 * means an infinite timeout. This parameter is passed to * the poll() function. * @returns SSH_OK on success, SSH_AGAIN if timeout occurred, @@ -403,17 +403,6 @@ void ssh_set_fd_except(ssh_session session) { ssh_socket_set_except(session->socket); } -static int ssh_make_milliseconds(long sec, long usec) { - int res = usec ? (usec / 1000) : 0; - res += (sec * 1000); - if (res == 0) { - res = 10 * 1000; /* use a reasonable default value in case - * SSH_OPTIONS_TIMEOUT is not set in options. */ - } - - return res; -} - /** * @internal * |