ntpd: with -q, exit after 60 seconds even if time is not synced.
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 27 Aug 2010 00:15:01 +0000 (02:15 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 27 Aug 2010 00:15:01 +0000 (02:15 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/ntpd.c

index fb3ef2e3c3e25e4a41f3532dbf3a51002dbf98f9..6707e9bdb9faa0952507971630d20445613bc279 100644 (file)
@@ -1920,9 +1920,28 @@ static NOINLINE void ntp_init(char **argv)
        if (opts & OPT_N)
                setpriority(PRIO_PROCESS, 0, -15);
 
-       bb_signals((1 << SIGTERM) | (1 << SIGINT), record_signo);
-       /* Removed SIGHUP here: */
-       bb_signals((1 << SIGPIPE) | (1 << SIGCHLD), SIG_IGN);
+       /* If network is up, syncronization occurs in ~10 seconds.
+        * We give "ntpd -q" a full minute to finish, then we exit.
+        *
+        * 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);
+
+       bb_signals(0
+               | (1 << SIGTERM)
+               | (1 << SIGINT)
+               | (1 << SIGALRM)
+               , record_signo
+       );
+       bb_signals(0
+               | (1 << SIGPIPE)
+               | (1 << SIGCHLD)
+               , SIG_IGN
+       );
 }
 
 int ntpd_main(int argc UNUSED_PARAM, char **argv) MAIN_EXTERNALLY_VISIBLE;