#!/usr/bin/perl -w

use strict;

require 5.003;

use Socket;

use Sys::Hostname;



my ( $count, $hisiaddr, $hispaddr, $histime, 

     $host, $iaddr, $paddr, $port, $proto, 

     $rin, $rout, $rtime, $SECS_of_70_YEARS);



$SECS_of_70_YEARS      = 2208988800;



$iaddr = gethostbyname(hostname());

$proto = getprotobyname('udp');

$port = getservbyname('time', 'udp');

$paddr = sockaddr_in(0, $iaddr); # 0 means let kernel pick



socket(SOCKET, PF_INET, SOCK_DGRAM, $proto)   or die "socket: $!";

bind(SOCKET, $paddr)                          or die "bind: $!";



$| = 1;

printf "%-12s %8s %s\n",  "localhost", 0, scalar localtime time;

$count = 0;

for $host (@ARGV) {

    $count++;

    $hisiaddr = inet_aton($host)              or die "unknown host";

    $hispaddr = sockaddr_in($port, $hisiaddr);

    defined(send(SOCKET, 0, 0, $hispaddr))    or die "send $host: $!";

}



$rin = '';

vec($rin, fileno(SOCKET), 1) = 1;



# timeout after 10.0 seconds

while ($count && select($rout = $rin, undef, undef, 10.0)) {

    $rtime = '';

    ($hispaddr = recv(SOCKET, $rtime, 4, 0))  or die "recv: $!";

    ($port, $hisiaddr) = sockaddr_in($hispaddr);

    $host = gethostbyaddr($hisiaddr, AF_INET);

    $histime = unpack("N", $rtime) - $SECS_of_70_YEARS ;

    printf "%-12s ", $host;

    printf "%8d %s\n", $histime - time, scalar localtime($histime);

    $count--;

}

