(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP")
(FILECREATED " 8-Sep-87 11:48:32" {DSK}<LISPFILES>MATT>DPUPFTPPATCH.;6 5640   

      changes to%:  (FNS \FTP.NEGOTIATED.CONNECTION.SOCKET)

      previous date%: "24-Jul-87 12:29:41" {DSK}<LISPFILES>MATT>DPUPFTPPATCH.;5)


(* "
Copyright (c) 1987 by Matt Heffron & XEROX Corporation.  All rights reserved.
")

(PRETTYCOMPRINT DPUPFTPPATCHCOMS)

(RPAQQ DPUPFTPPATCHCOMS ((DECLARE%: DOCOPY FIRST (FILES DPUPFTP))
                         (FNS \FTP.NEGOTIATED.CONNECTION.SOCKET \FTP.OPEN.CONNECTION)
                         (INITVARS (*FTP.NEGOTIATED.CONNECTION.HOSTS* NIL))
                         (GLOBALVARS *FTP.NEGOTIATED.CONNECTION.HOSTS*)
                         (CONSTANTS (\PT.NEGOTIATED.CONNECTION 128)
                                (\PUPSOCKET.NEGOTIATED.CONNECTION 63))
                         (DECLARE%: DONTCOPY (FILES (LOADCOMP)
                                                    DPUPFTP))
                         (PROP (FILETYPE MAKEFILE-ENVIRONMENT)
                               DPUPFTPPATCH)))
(DECLARE%: DOCOPY FIRST 
(FILESLOAD DPUPFTP)
)
(DEFINEQ

(\FTP.NEGOTIATED.CONNECTION.SOCKET
  [LAMBDA (PORT)
    (DECLARE (GLOBALVARS *FTP.NEGOTIATED.CONNECTION.HOSTS*))
                                                      (* ; "Edited  8-Sep-87 11:46 by Matt Heffron")

    (if (ZEROP (CDR PORT))
        then [CONS (CAR PORT)
                   (COND
                      ((EQ (CDR PORT)
                           0)
                       \PUPSOCKET.FTP)
                      (T (CDR PORT]
             (if (MEMB (CAR PORT)
                       *FTP.NEGOTIATED.CONNECTION.HOSTS*)
                 then (LET ((PUP (ALLOCATE.PUP))
                            RESULT.FTP.SOCKET NEGOTIATIONSOCKET)
                           (CLEARPUP PUP)
                           (SETQ NEGOTIATIONSOCKET (SETUPPUP PUP (CAR PORT)
                                                          \PUPSOCKET.NEGOTIATED.CONNECTION 
                                                          \PT.NEGOTIATED.CONNECTION NIL NIL
                                                          'FREE))
                           (SENDPUP NEGOTIATIONSOCKET PUP)
                           (SETQ PUP (GETPUP NEGOTIATIONSOCKET 10000))
                           (if PUP
                               then (SETQ RESULT.FTP.SOCKET (fetch PUPSOURCESOCKET of PUP))
                                    (RELEASE.PUP PUP)
                             else 
          
          (* ;; "Timed-out, just do it the old-fashoned way.")

                                  (SETQ RESULT.FTP.SOCKET \PUPSOCKET.FTP))
                           (CONS (CAR PORT)
                                 RESULT.FTP.SOCKET))
               else 
          
          (* ;; "This is not talking to a known FTP negotiated connection host.  So use the standard \PUPSOCKET.FTP.")

                    (CONS (CAR PORT)
                          \PUPSOCKET.FTP))
      else 
          
          (* ;; "If they specified an explicit SOCKET in the PORT (i.e. in the HOST argument to \FTP.OPEN.CONNECTION), just return that PORT.")

           PORT])

(\FTP.OPEN.CONNECTION
  [LAMBDA (HOST ECHOSTREAM FAILURESTRING)             (* ; "Edited 21-Jul-87 18:45 by Matt Heffron")

    (LET ((PORT (BESTPUPADDRESS HOST PROMPTWINDOW))
          INSTREAM)
         (if [AND PORT (SETQ INSTREAM (OPENBSPSTREAM (\FTP.NEGOTIATED.CONNECTION.SOCKET PORT)
                                             NIL
                                             (FUNCTION \FTP.ERRORHANDLER)
                                             NIL NIL (FUNCTION \FTP.WHENCLOSED)
                                             (OR FAILURESTRING "Can't open FTP connection"]
             then (if (TYPENAMEP INSTREAM 'STREAM)
                      then (SETQ INSTREAM (create FTPCONNECTION
                                                 FTPIN _ INSTREAM
                                                 FTPOUT _ (BSPOUTPUTSTREAM INSTREAM)
                                                 FTPHOST _ [\CANONICAL.HOSTNAME (COND
                                                                                   ((LITATOM HOST)
                                                                                    HOST)
                                                                                   (T (ETHERHOSTNAME
                                                                                       PORT]
                                                 FTPBUSY _ T))
                           (if (\FTP.SENDVERSION INSTREAM ECHOSTREAM)
                               then (push \FTPCONNECTIONS INSTREAM)
                                    INSTREAM
                             else (CLOSEBSPSTREAM (fetch FTPIN of INSTREAM)))
                    else INSTREAM])
)

(RPAQ? *FTP.NEGOTIATED.CONNECTION.HOSTS* NIL)
(DECLARE%: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS *FTP.NEGOTIATED.CONNECTION.HOSTS*)
)
(DECLARE%: EVAL@COMPILE 

(RPAQQ \PT.NEGOTIATED.CONNECTION 128)

(RPAQQ \PUPSOCKET.NEGOTIATED.CONNECTION 63)

(CONSTANTS (\PT.NEGOTIATED.CONNECTION 128)
       (\PUPSOCKET.NEGOTIATED.CONNECTION 63))
)
(DECLARE%: DONTCOPY 
(FILESLOAD (LOADCOMP)
       DPUPFTP)
)

(PUTPROPS DPUPFTPPATCH FILETYPE :TCOMPL)

(PUTPROPS DPUPFTPPATCH MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP"))
(PUTPROPS DPUPFTPPATCH COPYRIGHT ("Matt Heffron & XEROX Corporation" 1987))
(DECLARE%: DONTCOPY
  (FILEMAP (NIL (1140 4993 (\FTP.NEGOTIATED.CONNECTION.SOCKET 1150 . 3246) (\FTP.OPEN.CONNECTION 3248 . 
4991)))))
STOP
