#!/usr/bin/perl -w

use FindBin;

# Create startup script in ramdisk
my $S99 = "$FindBin::Bin/initramfs/etc/init.d/S99benchmark";
system("rm -f $S99");
system("cat > $S99; chmod +x $S99") unless -t STDIN;

# Boot gateway
my $boot;
my $pid = &run_boot;
$|=1;

my $ready;
while (<$boot>){
    last if ($ready = m/Welcome to Buildroot/ ||
		      m/UGW started/ ||
		      m/t...a...s...k...s... ...s...t...a...r...t...e...d/); # RTEMS has bug - it sends 4 characters instead of just one
}
die "Boot failed" unless $ready;

# Measure latencies
my $latester=<<'EOF';
rm -f tmp-stat.txt
echo "Starting latester"
sudo ip l set eth0 down
sudo ~/bin/latester -d can0 -d can1 -d can2 -c 3200 -q --oneattime -n tmp
r=$?
sudo ip l set eth0 up
set -e
source tmp-stat.txt
for i in sent lost enobufs $(seq -f percentile%g 0 10 100); do keyval="$keyval $i=$((i))"; done
echo "! PERF: gw_latency $avg µs $keyval ok"
test $avg -eq 0 || exit 1
exit $r
EOF

my $status = system((qw(ssh -T glab), $latester));
kill('TERM', -$pid);
exit($status >> 8);

# Helper functions
sub kill_boot() { kill('TERM', -$pid) if defined $pid; }
sub run_boot()
{
    # die("No boot command") if ($#ARGV eq -1);
    my $bootcmd = scalar @ARGV ? "'".join("' '", @ARGV)."'" : "$FindBin::Bin/boot";

    $SIG{INT} = sub { kill_boot(); exit; };
    $SIG{HUP} = sub { kill_boot(); exit; };
    $SIG{ALRM} = sub { kill_boot(); exit; };
    $SIG{TERM} = sub { kill_boot(); exit; };
    $SIG{QUIT} = sub { kill_boot(); exit; };

    pipe($boot, $wh) || die("pipe: $!");
    my $pid = fork() // die("fork: $!");
    if ($pid == 0) {
	setpgrp(); # Start new process group so that we can kill all
                   # background processes at once
	close($boot);
	open(STDERR, ">&", $wh) || die "Can't dup STDERR: $!";
	my $cmd = "$bootcmd 2>&1 | tee /dev/stderr";
	exec($cmd) || die "Can't exec $cmd: $!";
    }
    close($wh);
    return $pid;
}

END { kill_boot(); }
