;;; -*- Mode:LISP; Package:USER; Base:10; Readtable:ZL -*- ;;; use this server if the keyboard on a machine is broken. ;;; to load it, use TELNET, or the function LOAD-THIS-FILE (uses the EVAL server) ;;; which are defaulty loaded/enabled. (DEFUN LOAD-THIS-FILE (ON-HOST &OPTIONAL (OF-FUNCTION 'LOAD-THIS-FILE)) (LET ((PATHNAME (SEND (SEND (SI:GET-SOURCE-FILE-NAME OF-FUNCTION) :new-pathname :type nil :version nil) :translated-pathname))) (format t "~&; Connecting to EVAL server on ~S~%; to load ~S" (si:parse-host on-host) pathname) (WITH-OPEN-STREAM (X (CHAOS:OPEN-STREAM ON-HOST "EVAL")) ;; note: does ascii->lispm translation, so we make sure no funny ;; characters are used here. (format x " (LET ((SI:USER-ID ~S)) (LOAD ~S :SET-DEFAULT-PATHNAME NIL)) CHAOS:QUIT " ;; bind si:user-id so that the LOAD doesnt force user login. "LUSER" (send pathname :string-for-printing)) (send x :force-output) (do ((c)) ((null (setq c (send x :tyi)))) (setq c (fs:ascii-to-lispm c)) (and c (send standard-output :tyo c)))))) (DEFUN VANILLA-CHAOS-SERVER (NAME FUNCTION) (ADD-INITIALIZATION NAME `(PROCESS-RUN-FUNCTION ,(FORMAT NIL "~A SERVER" NAME) 'VANILLA-CHAOS-SERVER-FUNCTION ',FUNCTION ',NAME) NIL 'CHAOS:SERVER-ALIST)) (DEFUN VANILLA-CHAOS-SERVER-FUNCTION (F NAME) (CONDITION-CASE () (with-open-stream (x (chaos:open-stream NIL NAME)) (chaos:accept (send x :connection)) (SEND TV:WHO-LINE-FILE-STATE-SHEET :ADD-SERVER (send x :connection) NAME) (FUNCALL F X)) (SI:REMOTE-NETWORK-ERROR))) (VANILLA-CHAOS-SERVER "KBD-INPUT" 'KBD-INPUT-SERVER) (defun kbd-input-server (X) (DO ((C) (R (SI:FIND-READTABLE-NAMED "CL")) (P (FIND-PACKAGE "USER"))) ((NULL (SETQ C (LET ((*READTABLE* R) (*PACKAGE* P) (BASE 10) (IBASE 10)) (READ X NIL))))) (SEND TV:SELECTED-WINDOW :FORCE-KBD-INPUT C))) (DEFUN KBD-CONNECT (HOST) (WITH-OPEN-STREAM (X (CHAOS:OPEN-STREAM HOST "KBD-INPUT")) (DO ((R (SI:FIND-READTABLE-NAMED "CL")) (P (FIND-PACKAGE "USER")) (C)) ((NULL (SETQ C (SEND STANDARD-INPUT :ANY-TYI)))) (IF (EQUAL C #\HAND-DOWN) (SETQ C #\ABORT)) (LET ((*PACKAGE* P) (*READTABLE* R) (IBASE 10) (BASE 10)) (PRINT C X)) (SEND X :FORCE-OUTPUT)))) (VANILLA-CHAOS-SERVER "CECHO" 'CHAOS-CHARACTER-ECHO) (DEFUN CHAOS-CHARACTER-ECHO (STREAM) (DO ((C)) ((NULL (SETQ C (SEND STREAM :TYI)))) (SEND STREAM :TYO C) (SEND STREAM :FORCE-OUTPUT))) (DEFUN CECHO-TEST (HOST) (WITH-OPEN-STREAM (STREAM (CHAOS:OPEN-STREAM HOST "CECHO")) (format t "~&Connected to ~A~%" (send (send stream :connection) :foreign-host)) (DO ((C) (TB) (TA)) ((OR (NOT (SETQ C (SEND STANDARD-INPUT :TYI))) (EQ C #\END))) (SETQ TB (TIME)) (SEND STREAM :TYO C) (SEND STREAM :FORCE-OUTPUT) (SETQ C (SEND STREAM :TYI)) (SETQ TA (TIME)) (FORMAT T "~D milliseconds~%" (* 1000 (quotient (time-difference ta tb) 60.0))))))