%include "Moose:Mouse.Inc"
%include "INet:INet.Inc"

%include "INet:INetaddrs"

%externalpredicatespec FS lookup(%string(31) what, %integername value)
%systemroutinespec phex(%integer x)

{} %routine print INet address(%integer addr)
{}    write(addr >> 24 & 255, 0);  print symbol('.')
{}    write(addr >> 16 & 255, 0);  print symbol('.')
{}    write(addr >>  8 & 255, 0);  print symbol('.')
{}    write(addr       & 255, 0)
{} %end

%begin
   %ownrecord(semaphore fm) s = 0
   %ownrecord(mailbox fm) m = 0
   %record(mailbox fm)%name i
   %ownrecord(INet user request fm) r = 0
   %record(INet user request fm)%name reply
   %string(31) target
   %integer x, a
      setup semaphore(s)
      setup mailbox(m, s)
      setup message(r, size of(r))
      %if FS lookup(INet mailbox name, x) %start
         i == record(x)
         !! printstring("INet mailbox at ");  phex(addr(i));  newline
      %else
         printstring("No INet mailbox?");  newline
         %stop
      %finish
      r_code = ICMP timestamp request
      target = CLI param
      %if target = "" %start
         prompt("Target: ");  read(target)
      %finish
      a = INet name to address(target)
      %if a = 0 %start
         printstring(target);  printstring(" unknown")
         newline
         %stop
      %finish
      {} printstring(target);  printstring(" is at ")
      {} print INet address(a);  newline
      r_buffer == byteinteger(addr(a))
      r_bytes = 4
      send message(r, i, m)
      reply == receive message(m)
      printstring("Ping status: ");  write(reply_status, 0)
      newline
%end %of %program
