;;; -*- Mode:Lisp; Readtable:CL; Package:USER; Base:10; Patch-File:T -*-
;;; Patch file for System version 123.139
;;; Reason:
;;;  UDP RWHO Server process no longer just dies when it's UDP socket is
;;;  closed -- it waits for UDP to be enabled and opens it again.
;;; Written 4-Dec-87 11:44:30 by pld at site Gigamos Cambridge
;;; while running on Jack Flanders from band 2
;;; with Experimental System 123.138, Experimental Local-File 73.3, Experimental FILE-Server 22.1, Experimental Unix-Interface 11.0, Experimental Tape 18.0, Experimental KERMIT 34.0, Experimental ZMail 71.0, Experimental Lambda-Diag 15.0, microcode 1754, SDU Boot Tape 3.12, SDU ROM 8.



; From modified file DJ: L.NETWORK.IP-TCP.SERVER; UDP-RWHO-SERVER.LISP#29 at 4-Dec-87 11:44:31
#10R TCP-APPLICATION#: 
(COMPILER-LET ((*PACKAGE* (GLOBAL:PKG-FIND-PACKAGE "TCP-APPLICATION")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; IP-TCP; SERVER; UDP-RWHO-SERVER  "

(defun udp-rwho-server-process ()
  (loop
    (process-wait "UDP Enable" #'(lambda ()
				   (and udp:*udp-stream* (udp:udp-enabled udp:*udp-stream*))))
    (with-open-stream (stream (send (make-instance 'udp:udp-stream)
				    :open "RWHO Server" :local-port (sym ipport-whoserver)))
      (broadcast-rwho-packet stream)
      (loop
	(unless (time-lessp (zl:time) *udp-rwho-server-next-broadcast-time*)
	  (broadcast-rwho-packet stream))
	(when (send stream :listen)
	  (multiple-value-bind (packet length remote-port remote-address)
	      (send stream :read-packet (udp:get-udp-buffer))
	    (declare (ignore remote-port))
	    (unless packet
	      ;;socket closed, UDP shut down, whatever...
	      (return nil))
	    (setf (rwho-recv-time packet) (fudge-ut-to-unix (get-universal-time)))
	    (setf (fill-pointer packet) length)
	    (let ((buffer (make-array length :element-type '(unsigned-byte 8))))
	      (copy-array-contents packet buffer)
	      (insert-rwho-packet remote-address buffer))))
	(process-wait "RWHO Packet Send/Recv"
		      #'(lambda (s)
			  (or (send s :listen)
			      (not (time-lessp (zl:time) *udp-rwho-server-next-broadcast-time*))))
		      stream)))))

))

; From modified file DJ: L.NETWORK.IP-TCP.SERVER; UDP-RWHO-SERVER.LISP#29 at 4-Dec-87 11:44:46
#10R TCP-APPLICATION#: 
(COMPILER-LET ((*PACKAGE* (GLOBAL:PKG-FIND-PACKAGE "TCP-APPLICATION")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; IP-TCP; SERVER; UDP-RWHO-SERVER  "

  (send *udp-rwho-server-process* :reset)

))
