#! /home/xed/srexx

/*
 * serv_time: waits on port 1521 for time requests from the S/REXX
 *            script 'req_time'
 *
 *  You can use either the OS/2 like function calls, such as SockSocket()
 *  or the S/REXX more simple function calls, such as socket()
 */

signal on novalue

port = 1521
dotdot = gethostid()
sock_in = socket("AF_INET", "SOCK_STREAM", 0)
if sock_in < 0 then
 { say 'serv_time: unable to create a socket, errno = 'errno
   exit 1
 }

rc = setsockopt(sock_in, "SOL_SOCKET", "SO_REUSEADDR", 1);
if rc < 0 then
 { say 'serv_time: unable to setsockopt a socket, errno = 'errno
   exit 1
 }

addr.!family = 'AF_INET'
addr.!port   = port
addr.!addr   = 'INADDR_ANY'
rc = bind(sock_in, 'addr.!')
if rc < 0 then
 { say 'serv_time: unable to bind a socket, errno = 'errno
   say 'serv_time: another instance of serv_time may be running.'
   exit 1
 }


rc = listen(sock_in, 1)
if rc < 0 then
 { say 'serv_time: unable to listen, errno = 'errno
   exit 1
 }

do forever
  reads.0 = 1
  reads.1 = sock_in
  say 'serv_time: waiting for select'
  call select 'reads.'
  do i = 1 to reads.0
     ca = accept(reads.i)
     call setsockopt ca, "SOL_SOCKET", "SO_LINGER", '1 2'
     len = recvfrom(ca, 'data', 1024,,'from_')
     if len = -1 then
        say 'recvfrom --> 'len errno
     else
       { if data = 'time?' then
          { time = date() time()
            rc = send(ca, time)
            if rc < 0 then
             { say 'serv_time: unable to reply, errno = 'errno
               exit 1
             }
          }
       }
    call closesocket ca
  end i
end
