diff options
-rw-r--r-- | networking/ntpd.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/networking/ntpd.c b/networking/ntpd.c index 3ed05ba29..ba2950d8f 100644 --- a/networking/ntpd.c +++ b/networking/ntpd.c @@ -238,6 +238,8 @@ enum { OPT_p = (1 << 5), OPT_S = (1 << 6), OPT_l = (1 << 7) * ENABLE_FEATURE_NTPD_SERVER, + /* We hijack some bits for other purposes */ + OPT_qq = (1 << 8), }; struct globals { @@ -1930,15 +1932,18 @@ static NOINLINE void ntp_init(char **argv) setpriority(PRIO_PROCESS, 0, -15); /* If network is up, syncronization occurs in ~10 seconds. - * We give "ntpd -q" a full minute to finish, then we exit. + * We give "ntpd -q" 10 seconds to get first reply, + * then another 50 seconds to finish syncing. * * I tested ntpd 4.2.6p1 and apparently it never exits * (will try forever), but it does not feel right. * The goal of -q is to act like ntpdate: set time * after a reasonably small period of polling, or fail. */ - if (opts & OPT_q) - alarm(60); + if (opts & OPT_q) { + option_mask32 |= OPT_qq; + alarm(10); + } bb_signals(0 | (1 << SIGTERM) @@ -2065,6 +2070,15 @@ int ntpd_main(int argc UNUSED_PARAM, char **argv) #endif for (; nfds != 0 && j < i; j++) { if (pfd[j].revents /* & (POLLIN|POLLERR)*/) { + /* + * At init, alarm was set to 10 sec. + * Now we did get a reply. + * Increase timeout to 50 seconds to finish syncing. + */ + if (option_mask32 & OPT_qq) { + option_mask32 &= ~OPT_qq; + alarm(50); + } nfds--; recv_and_process_peer_pkt(idx2peer[j]); gettime1900d(); /* sets G.cur_time */ |