Annotation of embedaddon/ntp/scripts/freq_adj.in, revision 1.1

1.1     ! misho       1: #! @PATH_PERL@ -w
        !             2: 
        !             3: die "perl5 needed\n" unless ($] > 5);
        !             4: 
        !             5: use Getopt::Std;
        !             6: use vars qw($opt_n);
        !             7: 
        !             8: getopts('d:nt:');
        !             9: 
        !            10: #chop($ncpu = `sysctl -n hw.ncpu`);
        !            11: #die "Found $ncpu CPUs; can only be run on systems with 1 CPU.\n" if ($ncpu > 1);
        !            12: 
        !            13: $driftfile = "/etc/ntp.drift";
        !            14: $driftfile = $opt_d if defined($opt_d);
        !            15: 
        !            16: chop($timer = `sysctl -n kern.timecounter.hardware 2> /dev/null`);
        !            17: 
        !            18: $timer =~ tr/\U/\L/;
        !            19: 
        !            20: if ($timer eq '') {
        !            21:   open(DM, "/var/run/dmesg.boot");
        !            22:   while(<DM>) {
        !            23:     # Timecounter "i8254"  frequency 1193182 Hz
        !            24:     if (/^Timecounter "(\w+)"\s+/) {
        !            25:       $timer = $1;
        !            26:       last;
        !            27:     }
        !            28:   }
        !            29:   close(DM);
        !            30: }
        !            31: 
        !            32: $opt_t = $timer if !defined($opt_t);
        !            33: 
        !            34: if ($timer ne '') {            # $timer found...
        !            35:   if ($opt_t ne  '') {         # - and $opt_t found
        !            36:     if ($timer ne $opt_t) {    # - - and they differ
        !            37:       warn "You specified a $opt_t timer but I detected a $timer timer.\n";
        !            38:       usage();
        !            39:       exit 1;
        !            40:     } else {                   # - - and they are the same
        !            41:       ;
        !            42:     }
        !            43:   } else {                     # - but no $opt_t specified; this is OK
        !            44:     ;
        !            45:   }
        !            46: } else {                       # No $timer found...
        !            47:   if ($opt_t ne '') {          # - but $opt_t was specified
        !            48:     $timer = $opt_t;           # - - so use it.
        !            49:   } else {                     # - and neither was $opt_t
        !            50:     warn "I can't tell what timer you have.  Please specify one.\n";
        !            51:     usage();
        !            52:     exit 1;
        !            53:   }
        !            54: }
        !            55: 
        !            56: open(DF, $driftfile) || die "Can't open driftfile ($driftfile): $!\n";
        !            57: while(<DF>) {
        !            58:     chop;
        !            59:     if (/^(-?\d+\.\d+)(\s\d)?$/) {
        !            60:        $drift = $1;
        !            61:     } else {
        !            62:        die "Bogus value in driftfile $driftfile: <$_>\n";
        !            63:     }
        !            64: }
        !            65: close(DF);
        !            66: 
        !            67: print "NTP drift is <$drift>\n";
        !            68: 
        !            69: # Convert from NTP's idea of PPM to a decimal equivalent
        !            70: $freq_adj = int ( $drift * ( 10 ** 6 / 2 ** 20) );
        !            71: print "normalized freq_adj  is <$freq_adj>\n";
        !            72: 
        !            73: $freq_adj = int ( ( $freq_adj - 1 ) / 2 );
        !            74: print "Applying freq_adj of <".-$freq_adj.">\n";
        !            75: 
        !            76: $sysctl = "machdep.".$timer."_freq";
        !            77: 
        !            78: chop($mach_freq = `sysctl -n $sysctl`);
        !            79: 
        !            80: print "$sysctl is <$mach_freq>\n";
        !            81: 
        !            82: $n_mach_freq = $mach_freq - $freq_adj;
        !            83: 
        !            84: if (defined($opt_n)) {
        !            85:   print "$sysctl $mach_freq -> $n_mach_freq\n";
        !            86: } else {
        !            87:   print "i8254: ".`sysctl -w $sysctl=$n_mach_freq`;
        !            88: }
        !            89: 
        !            90: sub usage {
        !            91:   print STDERR <<EOUsage
        !            92: Usage: $0 [-d drift_file] [-n] [-t timer]
        !            93: where "drift_file" defaults to /etc/ntp.drift
        !            94: and "timer" is usually "tsc" or "i8254"
        !            95: and "-n" says "don't really change anything, just say what would happen".
        !            96: EOUsage
        !            97: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>