#!/afs/athena/contrib/perl/p

require 'sys/socket.ph';
$|=1;
socket(ZHM, &AF_INET, &SOCK_DGRAM, 0) || die "socket: $!";
$zhm = pack("S n C4 x8",&AF_INET,$port,127,0,0,1);
$port = `cat /tmp/wg.*`;
chop($port);
print("Using port $port\n");
#bind(ZHM, $zhmsrc = pack("S n C4 x8",&AF_INET,0,127,0,0,1)) || die $!;
#listen(ZHM,5);

#$mysockaddr = getsockname(ZHM);

#($fam, $port, $myaddr) = unpack("S n C4 x8", $mysockaddr);
#print("On port $port from $myaddr\n");

select(ZHM);$|=1;select(STDOUT);

$class = 'message';
$instance = 'personal';
$recip = 'mkgray';
$opcode = '';
$default = "message from \$sender\n\$signature\n\$message";
$sender = "Perl";
$zsig = "foobar";
$msg = "Testing\nblah\n";


$packet ="";			# new notice
$packet .= "ZEPH0.2\0";
$packet .= &zlong(17);
$packet .= &zlong(0);                   # UNSAFE
$packet .= &zascii($uid)."\0";
$packet .= &zascii(pack("n",0))."\0";   # no response port
$packet .= &zlong(0);                   # no auth
$packet .= &zlong(0);                   # authlen = 0
$packet .= "\0";		# no authdata
$packet .= $class."\0";
$packet .= $inst."\0";
$packet .= $opcode."\0";
$packet .= $sender."\0";
$packet .= $recip."\0";
$packet .= $default."\0";
$packet .= &zlong(0);                   # no checksum
$packet .= "\0";                        # no fragmentation
$packet .= &zascii($uid)."\0";
$packet .= "$zsig\0".$msg;


send(ZHM, $packet, 0, $zhmto);


sub zascii {
        local($retval,$data) = ("",$_[0]);
        while (length($data)>=4) {
                $retval .= " " if ($retval);
                ($c1,$c2,$c3,$c4,$data) = unpack("C4a*",$data);
                $retval .= sprintf("0x%02X%02X%02X%02X",$c1,$c2,$c3,$c4);
        }
 
        if ($data) {
                $retval .= " " if ($retval);
                $retval .= "0x";
                while ($data) {
                        ($c1,$data) = unpack("Ca*",$data);
                        $retval .= sprintf("%02X",$c1);
                }
        }
 
        return($retval);
}
 
sub zlong {
        return(&zascii(pack("N",$_[0]))."\0");
}
