;;; -*- Mode:Lisp; Readtable:ZL; Package:USER; Base:8; Patch-File:T -*-
;;; Patch file for System version 123.137
;;; Reason:
;;;  Telnet window assumes non-overprint mode and handles received ASCII backspaces
;;;  by backing up a character.
;;; Written 3-Dec-87 14:46:23 by pld at site Gigamos Cambridge
;;; while running on Jack Flanders from band 2
;;; with Experimental System 123.136, 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; SUPDUP.LISP#300 at 3-Dec-87 14:46:40
#8R SUPDUP#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SUPDUP")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; SUPDUP  "


(defmethod (basic-telnet :connect) (&optional path (net-window 3) &aux conn)
  (multiple-value-bind (host protocol contact contact-p)
      (parse-path path "TELNET" 23. :internet)
    (setq conn (send self :new-connection host protocol contact contact-p net-window)))
  (unless (errorp conn)
    (setq overprint nil)
    (telnet-send-option nvt-do nvt-echo)
    (setq echo-flag t)			;Assume success...
    (telnet-send-option nvt-do nvt-suppress-go-ahead)
    )
  conn)

))

; From modified file DJ: L.NETWORK; SUPDUP.LISP#300 at 3-Dec-87 14:46:43
#8R SUPDUP#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SUPDUP")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; SUPDUP  "


(defmethod (basic-telnet :buffered-tyo) (ch)
  (telnet-buffered-tyo ch))

))

; From modified file DJ: L.NETWORK; SUPDUP.LISP#300 at 3-Dec-87 14:46:44
#8R SUPDUP#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SUPDUP")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; SUPDUP  "


(defun telnet-buffered-tyo (ch &aux ch1)
  (declare (:self-flavor basic-telnet))
  (COND ((= CH NVT-IAC)
	 (SEND SELF ':HANDLE-IAC))		;Perform new telnet negotiations.
	(( CH #o200))				;Ignore otelnet negotiations
	((AND (= CH 7) (NOT (AND SIMULATE-IMLAC-FLAG BINARY-OUTPUT-FLAG)))
	 (SEND SELF ':REMOTE-BEEP))		;^G rings the bell.
	((AND (= CH #o15)
	      (IF (= (SETQ CH1 (NVT-NETI)) #o12)	;CR LF is NVT newline "character"
		  NIL				;Output normally
		  ;; A CR not followed by a LF.  Move the "carriage" to the start of the
		  ;; current line.  Then if the next character is anything other than a NUL,
		  ;; assume the other end if not obeying protocol and output it too.
		  (SEND SELF ':FORCE-OUTPUT)
		  (MULTIPLE-VALUE-BIND (IGNORE Y) (SEND SELF ':READ-CURSORPOS)
		    (SEND SELF ':SET-CURSORPOS 0 Y))
		  (= (SETQ CH CH1) 0))))	;If NUL, skip any output
	((AND (= CH #o177) SIMULATE-IMLAC-FLAG)	;Escape character
	 (SEND SELF ':HANDLE-IMLAC-ESCAPE))
	((= ch #o10)				;Back Space
	 (send self :force-output)
	 (send self :backward-char))
	(T
	 (AND (memq ch '(#o11 #o12 #o14 #o15))	;Convert formatting controls
	      (NOT (AND SIMULATE-IMLAC-FLAG BINARY-OUTPUT-FLAG))
	      (SETQ CH (+ CH 200)))		;to Lisp machine char set.
	 (DO () ((ARRAY-PUSH OUTPUT-BUFFER CH))
	   (SEND SELF ':FORCE-OUTPUT)))))

;;; New telnet protocol IAC handler

))

; From modified file DJ: L.NETWORK; SUPDUP.LISP#300 at 3-Dec-87 15:11:35
#8R SUPDUP#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SUPDUP")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; SUPDUP  "

(DEFMETHOD (BASIC-TELNET :HANDLE-IAC) (&AUX COMMAND OPTION)
  (SETQ COMMAND (NVT-NETI))
  (AND ( COMMAND NVT-WILL) ( COMMAND NVT-DONT)
       (SETQ OPTION (NVT-NETI)))
  (SELECT COMMAND
    (NVT-WILL
     (SELECT OPTION
       (NVT-SUPPRESS-GO-AHEAD)		;ignore things we requested
       (NVT-ECHO
	(telnet-echo t))
       (NVT-TRANSMIT-BINARY
	(SETQ BINARY-OUTPUT-FLAG T)
	(TELNET-SEND-OPTION NVT-DO OPTION))
       (NVT-SUPDUP-OUTPUT
	(TELNET-START-SUPDUP-OUTPUT))
       (nvt-logout
	(telnet-send-option nvt-do option))
       (OTHERWISE
	(TELNET-SEND-OPTION NVT-DONT OPTION))))
    (NVT-DO
     (select option
       ((NVT-SUPPRESS-GO-AHEAD NVT-TIMING-MARK NVT-TRANSMIT-BINARY)
	(TELNET-SEND-OPTION NVT-WILL OPTION))
       (T (TELNET-SEND-OPTION NVT-WONT OPTION))))
    (NVT-DONT
     (TELNET-SEND-OPTION NVT-WONT OPTION))
    (NVT-WONT
     (select option
       (NVT-ECHO
	(telnet-echo nil))
       (NVT-TRANSMIT-BINARY
	(SETQ BINARY-OUTPUT-FLAG NIL)
	(TELNET-SEND-OPTION NVT-DONT OPTION))))
    (NVT-SUBNEGOTIATION-BEGIN
     (TELNET-HANDLE-SUBNEGOTIATION))))

))

; From modified file DJ: L.NETWORK; SUPDUP.LISP#300 at 3-Dec-87 15:19:28
#8R SUPDUP#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SUPDUP")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; SUPDUP  "

(DEFMETHOD (BASIC-TELNET :NET-OUTPUT) (CH)
  (LOCK-OUTPUT
    (COND ((LDB-TEST #o1701 CH)
	   (SEND STREAM ':TYO NVT-IAC)
	   (SETQ CH (LDB #o0010 CH))))
    (SEND STREAM ':TYO CH)
    (COND ((= CH 15)
	   (SEND STREAM ':TYO #o12))		;CR is two chars
	  ((= CH NVT-IAC)
	   (SEND STREAM ':TYO #o377)))))	;IAC's must be quoted

))

; From modified file DJ: L.NETWORK; SUPDUP.LISP#300 at 3-Dec-87 15:20:17
#8R SUPDUP#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SUPDUP")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; SUPDUP  "

(DEFMETHOD (BASIC-TELNET :AFTER :DISCONNECT) ()
  (SETQ ECHO-FLAG NIL SUPDUP-OUTPUT-FLAG NIL BINARY-OUTPUT-FLAG NIL)
  (SEND SELF ':SET-LABEL (FORMAT NIL "~A -- not connected" TV:NAME)))

))
