summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWolfgang Hommel <wolf@code-wizards.com>2022-04-02 13:47:04 +0200
committerWolfgang Hommel <wolf@code-wizards.com>2022-04-02 13:47:04 +0200
commit98e3d3f36feea8550e12b02f07414643cbfcd5e0 (patch)
tree420d9f3959a0df325ac59f9e65f902bb74fb92e1
parent0ca35dd8c4532075d6805133a8f2f319f54c26ff (diff)
downloadlibfaketime-98e3d3f36feea8550e12b02f07414643cbfcd5e0.tar.gz
select(): Scale timeout parameter by user rate on return (addresses #382)
-rw-r--r--src/libfaketime.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/libfaketime.c b/src/libfaketime.c
index 0c28e5f..684f153 100644
--- a/src/libfaketime.c
+++ b/src/libfaketime.c
@@ -1725,6 +1725,21 @@ int select(int nfds, fd_set *readfds,
#else
DONT_FAKE_TIME(ret = (*real_select)(nfds, readfds, writefds, errorfds, timeout == NULL ? timeout : &timeout_real));
#endif
+
+ /* scale timeout back if user rate is set, #382 */
+ if (user_rate_set && (timeout != NULL))
+ {
+ struct timespec ts;
+
+ ts.tv_sec = timeout_real.tv_sec;
+ ts.tv_nsec = timeout_real.tv_usec * 1000;
+
+ timespecmul(&ts, user_rate, &ts);
+
+ timeout->tv_sec = ts.tv_sec;
+ timeout->tv_usec = ts.tv_nsec / 1000;
+ }
+
return ret;
}