;;; -*- Mode:LISP; Package:TCP-APPLICATION; Base:10; Readtable:CL -*-

#|

  Copyright LISP Machine, Inc. 1985, 1986, 1987
   See filename "Copyright.Text" for
  licensing and release information.

|#

(define-network-service *tcp-finger-service* :finger :tcp "RFC 742"
  :listen-port (sym ipport-finger)
  :toplevel-function 'finger-server-function
  :auto-enable? t)

(defun finger-server-function (stream)
  (let ((arg (make-array 80 :element-type 'string-char :fill-pointer 0))
	(ascii-output (ftp:make-ascii-translating-output-stream stream nil)))
    (do ((j 0 (1+ j))
	 (c))
	((or (= j 80)
	     (null (setq c (send stream :tyi)))
	     (= c #o15)))
      (vector-push-extend c arg))
    (cond ((or (zerop (length arg))
	       (string-equal arg si:user-id))
	   (finger-server-info ascii-output)
	   (terpri ascii-output)
	   (send stream :force-output))
	  (t
	   (format ascii-output "?????????~%")))))
    

(defun finger-server-info (&optional (stream *standard-output*))
  (let ((idle (floor (time-difference (zl:time) tv:kbd-last-activity-time) 3600)))
    (format stream
	    "~6A ~C ~22A ~6A ~:[    ~3*~;~:[~D:~2,48D~;  ~*~D~]~]     ~A"
	    si:user-id
	    fs:user-group-affiliation
	    fs:user-personal-name-first-name-first
	    (chaos:user-activity-string)
	    (not (zerop idle))
	    (zerop (floor idle 60.))
	    (floor idle 60.)
	    (rem idle 60.)
	    si:local-finger-location)))

(define-network-function (net:finger-host :internet) (host user stream style)
  (finger-internet-host host user stream style))
  

(defun finger-internet-host (host user &optional (ostream *standard-output*) style)
  (let ((tcp:*tcp-stream-whostate* "Close Connection"))
    (with-open-stream (stream (let ((tcp:*tcp-stream-whostate* "Open Connection"))
				(open-easy-tcp-stream (send (si:parse-host host) :name)
						      (sym-value 'ipport-finger)
						      nil
						      :keyword "FINGER User"
						      :input-buffers 1
						      :output-buffers 1)))
      (let ((ascii-output (ftp:make-ascii-translating-output-stream stream nil))
	    (ascii-input (ftp:make-ascii-translating-input-stream stream nil))
	    (tcp:*tcp-stream-whostate* "Finger"))
	(when (and user (> (string-length user) 0))
	  (princ user ascii-output))
	(terpri ascii-output)
	(send stream :force-output)
	(format ostream "~2&")
	(when (eq style :brackets)
	  (format ostream "[~A]~%" (send (si:parse-host host) :name)))
	(global:stream-copy-until-eof ascii-input ostream)))))
