git: 16a235f23c06 - main - dhclient: Switch timeouts from time_t to timespec
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 10 Aug 2024 00:00:30 UTC
The branch main has been updated by cperciva:
URL: https://cgit.FreeBSD.org/src/commit/?id=16a235f23c066d27b3a53c66cf6aa329be07cdb9
commit 16a235f23c066d27b3a53c66cf6aa329be07cdb9
Author: Isaac Cilia Attard <icattard@FreeBSD.org>
AuthorDate: 2024-07-08 05:43:09 +0000
Commit: Colin Percival <cperciva@FreeBSD.org>
CommitDate: 2024-08-09 21:45:06 +0000
dhclient: Switch timeouts from time_t to timespec
Introduce a new function, add_timeout_timespec(), to use timespec
structs to handle timeouts. Make add_timeout() into a wrapper for the
latter function to retain compatibility with the rest of the codebase.
No functional change intended.
Sponsored by: Google LLC (GSoC 2024)
Signed-off-by: Isaac Cilia Attard <icattard@FreeBSD.org>
MFC after: 10 days
Reviwed by: cperciva, brooks, Tom Hukins, Alexander Ziaee
Pull Request: https://github.com/freebsd/freebsd-src/pull/1368
---
sbin/dhclient/dhcpd.h | 3 ++-
sbin/dhclient/dispatch.c | 28 +++++++++++++++++++---------
2 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/sbin/dhclient/dhcpd.h b/sbin/dhclient/dhcpd.h
index a80c5bd8f23e..5d3c6aa6c990 100644
--- a/sbin/dhclient/dhcpd.h
+++ b/sbin/dhclient/dhcpd.h
@@ -218,7 +218,7 @@ struct interface_info {
struct timeout {
struct timeout *next;
- time_t when;
+ struct timespec when;
void (*func)(void *);
void *what;
};
@@ -320,6 +320,7 @@ void reinitialize_interfaces(void);
void dispatch(void);
void got_one(struct protocol *);
void add_timeout(time_t, void (*)(void *), void *);
+void add_timeout_timespec(struct timespec, void (*)(void *), void *);
void cancel_timeout(void (*)(void *), void *);
void add_protocol(const char *, int, void (*)(struct protocol *), void *);
void remove_protocol(struct protocol *);
diff --git a/sbin/dhclient/dispatch.c b/sbin/dhclient/dispatch.c
index 3108fe4365d1..8a0f1406afc7 100644
--- a/sbin/dhclient/dispatch.c
+++ b/sbin/dhclient/dispatch.c
@@ -154,7 +154,8 @@ dispatch(void)
int count, live_interfaces, i, to_msec, nfds = 0;
struct protocol *l;
struct pollfd *fds;
- time_t howlong;
+ struct timespec howlong;
+ struct timespec time_now = { .tv_sec = cur_time, .tv_nsec = 0 };
for (l = protocols; l; l = l->next)
nfds++;
@@ -172,7 +173,7 @@ another:
if (timeouts) {
struct timeout *t;
- if (timeouts->when <= cur_time) {
+ if (timespeccmp(&timeouts->when, &time_now, <=)) {
t = timeouts;
timeouts = timeouts->next;
(*(t->func))(t->what);
@@ -187,10 +188,10 @@ another:
* int for poll, while not polling with a
* negative timeout and blocking indefinitely.
*/
- howlong = timeouts->when - cur_time;
- if (howlong > INT_MAX / 1000)
- howlong = INT_MAX / 1000;
- to_msec = howlong * 1000;
+ timespecsub(&timeouts->when, &time_now, &howlong);
+ if (howlong.tv_sec > INT_MAX / 1000)
+ howlong.tv_sec = INT_MAX / 1000;
+ to_msec = howlong.tv_sec * 1000;
} else
to_msec = -1;
@@ -218,6 +219,7 @@ another:
if (count == -1) {
if (errno == EAGAIN || errno == EINTR) {
time(&cur_time);
+ time_now.tv_sec = cur_time;
continue;
} else
error("poll: %m");
@@ -225,6 +227,7 @@ another:
/* Get the current time... */
time(&cur_time);
+ time_now.tv_sec = cur_time;
i = 0;
for (l = protocols; l; l = l->next) {
@@ -355,7 +358,14 @@ active:
}
void
-add_timeout(time_t when, void (*where)(void *), void *what)
+add_timeout(time_t when_s, void (*where)(void *), void *what)
+{
+ struct timespec when = { .tv_sec = when_s, .tv_nsec = 0 };
+ add_timeout_timespec(when, where, what);
+}
+
+void
+add_timeout_timespec(struct timespec when, void (*where)(void *), void *what)
{
struct timeout *t, *q;
@@ -394,7 +404,7 @@ add_timeout(time_t when, void (*where)(void *), void *what)
/* Now sort this timeout into the timeout list. */
/* Beginning of list? */
- if (!timeouts || timeouts->when > q->when) {
+ if (!timeouts || timespeccmp(&timeouts->when, &q->when, >)) {
q->next = timeouts;
timeouts = q;
return;
@@ -402,7 +412,7 @@ add_timeout(time_t when, void (*where)(void *), void *what)
/* Middle of list? */
for (t = timeouts; t->next; t = t->next) {
- if (t->next->when > q->when) {
+ if (timespeccmp(&t->next->when, &q->when, >)) {
q->next = t->next;
t->next = q;
return;