diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-12-01 02:32:01 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-12-01 02:32:01 +0100 |
commit | fae9f499b2ab3becb8a672d982c50f318114dee9 (patch) | |
tree | 0229761c21de96d2bda7a9be864052532382a028 | |
parent | 8eda4a9005723be93d8f5c0adb33e457e2f54dfe (diff) |
ntpd: make it work w/o -g too :(
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rwxr-xr-x | examples/var_service/fw/run | 8 | ||||
-rw-r--r-- | networking/ntpd.c | 36 |
2 files changed, 23 insertions, 21 deletions
diff --git a/examples/var_service/fw/run b/examples/var_service/fw/run index b8c028a99..396b678ab 100755 --- a/examples/var_service/fw/run +++ b/examples/var_service/fw/run @@ -1,5 +1,8 @@ #!/bin/bash -# (using bashisms: "function", arrays) +# (using bashism: arrays) + +service="${PWD##*/}" +rundir="/var/run/service/$service" user=root extif=if @@ -10,9 +13,6 @@ sv o . # Debug #date '+%Y-%m-%d %H:%M:%S' >>"$0.log" -service=`basename "$PWD"` -rundir="/var/run/service/$service" - ### filter This is the default table (if no -t option is passed). It contains ### the built-in chains INPUT (for packets coming into the box itself), ### FORWARD (for packets being routed through the box), and OUTPUT (for diff --git a/networking/ntpd.c b/networking/ntpd.c index c374120e2..f10a81cee 100644 --- a/networking/ntpd.c +++ b/networking/ntpd.c @@ -180,8 +180,8 @@ struct globals { llist_t *ntp_peers; ntp_status_t status; uint32_t scale; - uint8_t settime; - uint8_t firstadj; + uint8_t time_is_set; + uint8_t first_adj_done; }; #define G (*ptr_to_globals) @@ -454,23 +454,25 @@ adjtime_wrap(void) G.status.leap = peers[middle]->update.status.leap; bb_info_msg("adjusting local clock by %fs", offset_median); - + errno = 0; d_to_tv(offset_median, &tv); - if (adjtime(&tv, &olddelta) == -1) - bb_error_msg("adjtime failed"); - else if (!G.firstadj + if (adjtime(&tv, &olddelta) == -1) { + bb_perror_msg("adjtime failed"); //TODO: maybe _and_die? + } else + if (G.first_adj_done && olddelta.tv_sec == 0 && olddelta.tv_usec == 0 && !G.status.synced ) { bb_info_msg("clock synced"); G.status.synced = 1; - } else if (G.status.synced) { + } else + if (G.status.synced) { bb_info_msg("clock unsynced"); G.status.synced = 0; } - G.firstadj = 0; + G.first_adj_done = 1; G.status.reftime = gettime1900fp(); G.status.stratum++; /* one more than selected peer */ G.scale = updated_scale(offset_median); @@ -495,7 +497,7 @@ adjtime_wrap(void) } static void -settime(double offset) +step_time_once(double offset) { ntp_peer_t *p; llist_t *item; @@ -503,10 +505,9 @@ settime(double offset) char buf[80]; time_t tval; - if (!G.settime) + if (G.time_is_set) goto bail; - - G.settime = 0; + G.time_is_set = 1; /* if the offset is small, don't call settimeofday */ if (offset < SETTIME_MIN_OFFSET && offset > -SETTIME_MIN_OFFSET) @@ -514,6 +515,7 @@ settime(double offset) gettimeofday(&curtime, NULL); /* never fails */ +//isn't it simpler to: offset += curtime.tv_sec; offset += 1.0e-6 * curtime.tv_usec? d_to_tv(offset, &tv); curtime.tv_usec += tv.tv_usec + 1000000; curtime.tv_sec += tv.tv_sec - 1 + (curtime.tv_usec / 1000000); @@ -708,7 +710,7 @@ recv_and_process_peer_pkt(ntp_peer_t *p) offset->offset, offset->delay, (int) interval); update_peer_data(p); - settime(offset->offset); + step_time_once(offset->offset); p->shift++; if (p->shift >= OFFSET_ARRAY_SIZE) @@ -892,8 +894,9 @@ static NOINLINE void ntp_init(char **argv) &peers, &G.verbose); if (!(opts & (OPT_p|OPT_l))) bb_show_usage(); - if (opts & OPT_g) - G.settime = 1; +//WRONG +// if (opts & OPT_g) +// G.time_is_set = 1; while (peers) add_peers(llist_pop(&peers)); if (!(opts & OPT_n)) { @@ -931,7 +934,6 @@ static NOINLINE void ntp_init(char **argv) G.status.precision = prec; } G.scale = 1; - G.firstadj = 1; bb_signals((1 << SIGTERM) | (1 << SIGINT), record_signo); bb_signals((1 << SIGPIPE) | (1 << SIGHUP), SIG_IGN); @@ -1019,7 +1021,7 @@ int ntpd_main(int argc UNUSED_PARAM, char **argv) } if ((trial_cnt > 0 && sent_cnt == 0) || g.peer_cnt == 0) - settime(0); /* no good peers, don't wait */ + step_time_once(0); /* no good peers, don't wait */ timeout = nextaction - cur_time; if (timeout < 0) |