Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

#! @PATH_PERL@

package ntp_wait;
use 5.006_000;
use strict;
use warnings;
use lib "@PERLLIBDIR@";
use NTP::Util qw(ntp_read_vars);

exit run(@ARGV) unless caller;

sub run {
    my $opts;
    if (!processOptions(\@_, $opts)) {
        usage(1);
    };

    my $tries   = $opts->{tries};	# How many tries before we give up? (10 min+)
    my $sleep   = $opts->{sleep};	# Seconds to sleep between tries (6s = 10/min)
    my $verbose = $opts->{verbose};	# Be verbose?

    # Autoflush stdout
    $| = 1;

    print "Waiting for ntpd to synchronize...  " if $verbose;

    for my $i (1 .. $tries) {
        my $info = ntp_read_vars(0, []);

        if (!defined $info) {
            print "\bntpd is not running!\n" if $verbose;
            return 1;
        }

        if (!exists $info->{status_line}{leap}) {
            print "\bLeap status not available\n";
            return 1;
        }

        my $leap   = $info->{status_line}{leap};
        my $sync   = $info->{status_line}{sync};

        if ($leap =~ /(sync|leap)_alarm/) {
            print "\b".(substr "*+:.", $i % 4, 1) if $verbose;
            sleep $sleep if $i < $tries;
            next;
        }

        if ($leap =~ /leap_(none|((add|del)_sec))/) {
            # We could check $sync here to make sure we like the source...
            print "\bOK!\n" if $verbose;
            return 0;
        }

        print "\bUnexpected 'leap' status <$leap>\n";
        return 1;
    }

    print "\bNo!\nntpd did not synchronize.\n" if $verbose;
    return 1;
}

@ntp_wait_opts@

1;
__END__