Browse Source

more bits from transatlanic flight:

make priv_adjtime() deal with offsets, not peers.
OPENBSD_4_0
henning 18 years ago
parent
commit
1d2ad6e90a
1 changed files with 25 additions and 25 deletions
  1. +25
    -25
      src/usr.sbin/ntpd/ntp.c

+ 25
- 25
src/usr.sbin/ntpd/ntp.c View File

@ -1,4 +1,4 @@
/* $OpenBSD: ntp.c,v 1.69 2006/05/25 19:25:46 henning Exp $ */
/* $OpenBSD: ntp.c,v 1.70 2006/05/25 19:30:45 henning Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -391,10 +391,10 @@ peer_remove(struct ntp_peer *p)
void
priv_adjtime(void)
{
struct ntp_peer *p;
int offset_cnt = 0, i = 0;
struct ntp_peer **peers;
double offset_median;
struct ntp_peer *p;
int offset_cnt = 0, i = 0;
struct ntp_offset **offsets;
double offset_median;
TAILQ_FOREACH(p, &conf->ntp_peers, entry) {
if (p->trustlevel < TRUSTLEVEL_BADPEER)
@ -404,36 +404,36 @@ priv_adjtime(void)
offset_cnt++;
}
if ((peers = calloc(offset_cnt, sizeof(struct ntp_peer *))) == NULL)
if ((offsets = calloc(offset_cnt, sizeof(struct ntp_offset *))) == NULL)
fatal("calloc priv_adjtime");
TAILQ_FOREACH(p, &conf->ntp_peers, entry) {
if (p->trustlevel < TRUSTLEVEL_BADPEER)
continue;
peers[i++] = p;
offsets[i++] = &p->update;
}
qsort(peers, offset_cnt, sizeof(struct ntp_peer *), offset_compare);
qsort(offsets, offset_cnt, sizeof(struct ntp_offset *), offset_compare);
if (offset_cnt > 0) {
if (offset_cnt > 1 && offset_cnt % 2 == 0) {
offset_median =
(peers[offset_cnt / 2 - 1]->update.offset +
peers[offset_cnt / 2]->update.offset) / 2;
(offsets[offset_cnt / 2 - 1]->offset +
offsets[offset_cnt / 2]->offset) / 2;
conf->status.rootdelay =
(peers[offset_cnt / 2 - 1]->update.delay +
peers[offset_cnt / 2]->update.delay) / 2;
(offsets[offset_cnt / 2 - 1]->delay +
offsets[offset_cnt / 2]->delay) / 2;
conf->status.stratum = MAX(
peers[offset_cnt / 2 - 1]->update.status.stratum,
peers[offset_cnt / 2]->update.status.stratum);
offsets[offset_cnt / 2 - 1]->status.stratum,
offsets[offset_cnt / 2]->status.stratum);
} else {
offset_median = peers[offset_cnt / 2]->update.offset;
offset_median = offsets[offset_cnt / 2]->offset;
conf->status.rootdelay =
peers[offset_cnt / 2]->update.delay;
offsets[offset_cnt / 2]->delay;
conf->status.stratum =
peers[offset_cnt / 2]->update.status.stratum;
offsets[offset_cnt / 2]->status.stratum;
}
conf->status.leap = peers[offset_cnt / 2]->update.status.leap;
conf->status.leap = offsets[offset_cnt / 2]->status.leap;
imsg_compose(ibuf_main, IMSG_ADJTIME, 0, 0,
&offset_median, sizeof(offset_median));
@ -443,12 +443,12 @@ priv_adjtime(void)
update_scale(offset_median);
conf->status.refid4 =
peers[offset_cnt / 2]->update.status.refid4;
offsets[offset_cnt / 2]->status.refid4;
conf->status.refid =
peers[offset_cnt / 2]->update.status.send_refid;
offsets[offset_cnt / 2]->status.send_refid;
}
free(peers);
free(offsets);
TAILQ_FOREACH(p, &conf->ntp_peers, entry)
p->update.good = 0;
@ -457,15 +457,15 @@ priv_adjtime(void)
int
offset_compare(const void *aa, const void *bb)
{
const struct ntp_peer * const *a;
const struct ntp_peer * const *b;
const struct ntp_offset * const *a;
const struct ntp_offset * const *b;
a = aa;
b = bb;
if ((*a)->update.offset < (*b)->update.offset)
if ((*a)->offset < (*b)->offset)
return (-1);
else if ((*a)->update.offset > (*b)->update.offset)
else if ((*a)->offset > (*b)->offset)
return (1);
else
return (0);


Loading…
Cancel
Save