Skip to content

Commit

Permalink
dhclient: Switch timeouts from time_t to timespec
Browse files Browse the repository at this point in the history
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:	#1368

(cherry picked from commit 16a235f)
  • Loading branch information
ica574 authored and cperciva committed Aug 20, 2024
1 parent 1ff3118 commit 99c5c0c
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 10 deletions.
3 changes: 2 additions & 1 deletion sbin/dhclient/dhcpd.h
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ struct interface_info {

struct timeout {
struct timeout *next;
time_t when;
struct timespec when;
void (*func)(void *);
void *what;
};
Expand Down Expand Up @@ -321,6 +321,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 *);
Expand Down
28 changes: 19 additions & 9 deletions sbin/dhclient/dispatch.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,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++;
Expand All @@ -173,7 +174,7 @@ dispatch(void)
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);
Expand All @@ -188,10 +189,10 @@ dispatch(void)
* 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;

Expand Down Expand Up @@ -219,13 +220,15 @@ dispatch(void)
if (count == -1) {
if (errno == EAGAIN || errno == EINTR) {
time(&cur_time);
time_now.tv_sec = cur_time;
continue;
} else
error("poll: %m");
}

/* Get the current time... */
time(&cur_time);
time_now.tv_sec = cur_time;

i = 0;
for (l = protocols; l; l = l->next) {
Expand Down Expand Up @@ -356,7 +359,14 @@ interface_status(struct interface_info *ifinfo)
}

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;

Expand Down Expand Up @@ -395,15 +405,15 @@ 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;
}

/* 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;
Expand Down

0 comments on commit 99c5c0c

Please sign in to comment.