freebsd-dev/contrib/ntp/scripts/calc_tickadj/calc_tickadj.in
Cy Schubert 2b15cb3d09 MFV ntp 4.2.8p1 (r258945, r275970, r276091, r276092, r276093, r278284)
Thanks to roberto for providing pointers to wedge this into HEAD.

Approved by:	roberto
2015-03-30 13:30:15 +00:00

60 lines
1.2 KiB
Plaintext

#! @PATH_PERL@ -w
#
# drift of 104.8576 -> +1 tick. Base of 10000 ticks.
#
# 970306 HMS Deal with nanoseconds. Fix sign of adjustments.
package calc_tickadj;
use strict;
exit run(@ARGV) unless caller;
sub run {
my $opts;
if (!processOptions(\@_, $opts)) {
usage(1);
};
my $drift_file = $opts->{'drift-file'};
my $tick = $opts->{'tick'};
if (!$tick) {
my ($fl) = `tickadj`;
if (defined $fl && $fl =~ /(?:KERNEL|PRESET)?\s*tick\s+=\s+(\d+)/) {
$tick = $1;
}
else {
die "Could not get tick value, try manually with -t/--tick\n";
}
}
# Drift file is in PPM where Milion is actually 2**20
my $cvt = (2 ** 20) / $tick;
my $drift = 0.;
open my $dfh, $drift_file or die "Could not open $drift_file: $!\n";
$drift = <$dfh>;
close $dfh;
die "Invalid drift file value <$drift>" if $drift !~ /[+-]?\d+\.?[0-9]+/;
while ($drift < 0) {
$drift += $cvt;
$tick--;
}
while ($drift > $cvt) {
$drift -= $cvt;
$tick++;
}
printf "%.3f (drift)\n", $drift;
printf "%d usec; %d nsec\n", $tick, ($tick + ($drift/$cvt)) * 1000;
return 0;
}
@calc_tickadj_opts@
1;
__END__