| From 8dbd2b1f2a4aa039c8f6edd1534bf6dea25f7cef Mon Sep 17 00:00:00 2001 |
| From: Avery Pennarun <apenwarr@gmail.com> |
| Date: Tue, 29 May 2012 04:20:19 -0400 |
| Subject: [PATCH 3/6] Fix two bugs preventing DNS re-resolution if resolv.conf |
| changes. |
| |
| First, don't call res_init(); it forces libresolv to do a one-time name |
| resolution and save the settings forever (at least in uClibc). If |
| /etc/resolv.conf doesn't exist at program startup time, this would guarantee |
| all future DNS requests would fail. |
| |
| Second, change error_interval() to use a backoff instead of a hardcoded |
| "very long time plus randomness" timeout. The default timeout to retry |
| initial DNS was 600 seconds, which was *way* too long. Now we start at 2 |
| seconds and work our way up. |
| --- |
| ntp.c | 13 ++++++++++--- |
| ntpd.c | 7 ++++++- |
| 2 files changed, 16 insertions(+), 4 deletions(-) |
| |
| diff --git a/ntp.c b/ntp.c |
| index ac94638..9f83f1a 100644 |
| --- a/ntp.c |
| +++ b/ntp.c |
| @@ -539,10 +539,17 @@ scale_interval(time_t requested) |
| time_t |
| error_interval(void) |
| { |
| - time_t interval, r; |
| + static time_t step = 1; |
| + time_t interval, maxival, r; |
| |
| - interval = INTERVAL_QUERY_PATHETIC * QSCALE_OFF_MAX / QSCALE_OFF_MIN; |
| - r = arc4random() % (interval / 10); |
| + maxival = INTERVAL_QUERY_PATHETIC * QSCALE_OFF_MAX / QSCALE_OFF_MIN; |
| + interval = step * step / 2 + 1; /* quadratic backoff timer */ |
| + if (interval > maxival) |
| + interval = maxival; |
| + else |
| + step++; |
| + r = arc4random() % (interval / 10 + 1); |
| + log_info("retrying in %d", interval + r); |
| return (interval + r); |
| } |
| |
| diff --git a/ntpd.c b/ntpd.c |
| index 37dd862..22db996 100644 |
| --- a/ntpd.c |
| +++ b/ntpd.c |
| @@ -100,7 +100,12 @@ main(int argc, char *argv[]) |
| bzero(&conf, sizeof(conf)); |
| |
| log_init(1); /* log to stderr until daemonized */ |
| - res_init(); /* XXX */ |
| + |
| + /* apenwarr: don't call res_init() here, as it prevents auto-rereading |
| + * of resolv.conf later (at least in uClibc). I don't see any |
| + * advantage to it anyway. And it had a fishy-looking XXX comment. |
| + */ |
| + //res_init(); /* XXX */ |
| |
| |
| while ((ch = getopt(argc, argv, "b:df:sSw:")) != -1) { |
| -- |
| 1.7.7.3 |
| |