ntpd: decrease ntpd -q "no response" timeout to 10 sec
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 6 Apr 2011 23:45:20 +0000 (01:45 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 6 Apr 2011 23:45:20 +0000 (01:45 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/ntpd.c

index 3ed05ba290febdcbd5fbc6bd720bb64b48f60ea5..ba2950d8fbc7f90e8d969c6d912e528b8ea893ea 100644 (file)
@@ -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 */