(FILECREATED " 9-Jan-85 12:27:06" {ERIS}<LISPNEW>PATCHES>TOPS20FTPPATCH.;1 9062 changes to: (VARS TOPS20FTPPATCHCOMS) (FNS \FTP.GENERATEFILES)) (* Copyright (c) 1985 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT TOPS20FTPPATCHCOMS) (RPAQQ TOPS20FTPPATCHCOMS ((FNS \FTP.GENERATEFILES))) (DEFINEQ (\FTP.GENERATEFILES [LAMBDA (DEVICE PATTERN DESIREDPROPS OPTIONS) (* bvm: " 9-Jan-85 12:26") (PROG [(RESULT (RESETLST (PROG (CONNECTION HOST REMOTENAME INS OUTS DESIREDPLIST CODE VERSION EXTENSION DEVICE WANTDEVICE NAME DIRECTORY NAMEBODY OSTYPE INFO FILTERNEEDED) (for TAIL on (UNPACKFILENAME.STRING PATTERN) by (CDDR TAIL) do (SELECTQ (CAR TAIL) [HOST (SETQ HOST (\CANONICAL.HOSTNAME (MKATOM (CADR TAIL] (DIRECTORY (SETQ DIRECTORY (CADR TAIL))) (NAME (SETQ NAME (CADR TAIL))) (EXTENSION (SETQ EXTENSION (OR (CADR TAIL) ""))) [VERSION (SETQ VERSION (AND (IGREATERP (NCHARS (CADR TAIL)) 0) (MKATOM (CADR TAIL] [DEVICE (SETQ WANTDEVICE (SETQ DEVICE (CADR TAIL] (RETURN))) (SETQ OSTYPE (GETHOSTINFO HOST (QUOTE OSTYPE))) (SELECTQ OSTYPE [TENEX [COND ((AND (STRPOS (QUOTE *) NAME) (IGREATERP (NCHARS NAME) 1)) (SETQ FILTERNEEDED (SETQ NAME (QUOTE *] [COND (EXTENSION (SELECTQ (NCHARS EXTENSION) (0 (* Maxc enumerates "name.*" even when given just "name.") (SETQ FILTERNEEDED T)) (1 (* Extension * no problem)) (COND ((STRPOS (QUOTE *) EXTENSION) (SETQ FILTERNEEDED (SETQ EXTENSION (QUOTE *] (OR VERSION (COND ((EQ OSTYPE (QUOTE TENEX)) (SETQ VERSION 0] (TOPS20 (* Can handle all *'s) (OR VERSION (SETQ VERSION 0))) (VMS (* Can handle all *'s)) [(NIL IFS UNIX) (COND (EXTENSION (SELECTQ (NCHARS EXTENSION) [1 (COND ((EQ (CHCON1 EXTENSION) (CHARCODE *)) (* If enumerating FOO.* need to ask for FOO* or else we will miss extensionless FOO) (SETQ EXTENSION NIL) (COND ((NEQ (NTHCHARCODE NAME -1) (CHARCODE *)) (SETQ FILTERNEEDED (SETQ NAME (CONCAT NAME (QUOTE *] (0 (* Explicit null extension. IFS enumerates FOO. okay, but FOO*. would also enumerate files with non-null extensions) (SETQ EXTENSION NIL) (SETQ FILTERNEEDED (STRPOS (QUOTE *) NAME))) NIL))) (COND [(EQ OSTYPE (QUOTE UNIX)) (* Coerce directory name to lowercase, get rid of trailing /) [COND ((EQ (NTHCHARCODE DIRECTORY -1) (CHARCODE /)) (SETQ DIRECTORY (SUBSTRING DIRECTORY 1 -2] [COND ((NEQ (NTHCHARCODE DIRECTORY 1) (CHARCODE /)) (SETQ DIRECTORY (CONCAT (QUOTE /) DIRECTORY] (COND ((U-CASEP DIRECTORY) (SETQ DIRECTORY (L-CASE DIRECTORY] (T (OR VERSION (SETQ VERSION (QUOTE H] NIL) (SETQ DESIREDPLIST (for PROP in (NCONC (for PROP in DESIREDPROPS collect (SELECTQ PROP (BYTESIZE (QUOTE BYTE-SIZE)) (LENGTH (QUOTE SIZE)) ((CREATIONDATE ICREATIONDATE) (QUOTE CREATION-DATE)) ((WRITEDATE IWRITEDATE) (QUOTE WRITE-DATE)) ((READDATE IREADDATE) (QUOTE READ-DATE)) (EOLCONVENTION (QUOTE END-OF-LINE-CONVENTION)) PROP)) (QUOTE (DIRECTORY NAME-BODY VERSION))) collect (LIST (QUOTE DESIRED-PROPERTY) PROP))) [COND ([AND VERSION (OR (NEQ VERSION (QUOTE *)) (EQ OSTYPE (QUOTE VMS] (push DESIREDPLIST (LIST (QUOTE VERSION) VERSION] [SETQ NAMEBODY (COND ((NULL EXTENSION) NAME) (T (CONCAT NAME "." EXTENSION] [COND ((EQ OSTYPE (QUOTE UNIX)) [COND ((AND NIL (U-CASEP NAMEBODY)) (* Would like to help out by coercing name to lowercase, but the leaf server really does write uppercase filenames!) (SETQ NAMEBODY (L-CASE NAMEBODY] (COND ((NEQ (NTHCHARCODE NAMEBODY -1) (CHARCODE *)) (* Unix FTP server does not understand versions, so make sure that whatever pattern we give ends in *) (SETQ FILTERNEEDED (SETQ NAMEBODY (CONCAT NAMEBODY (QUOTE *] (push DESIREDPLIST (LIST (QUOTE NAME-BODY) NAMEBODY)) [COND (DIRECTORY (push DESIREDPLIST (LIST (QUOTE DIRECTORY) DIRECTORY] [COND (WANTDEVICE (push DESIREDPLIST (LIST (QUOTE DESIRED-PROPERTY) (QUOTE DEVICE))) (COND (DEVICE (push DESIREDPLIST (LIST (QUOTE DEVICE) DEVICE] (push DESIREDPLIST [LIST (QUOTE USER-NAME) (CAR (SETQ INFO (\INTERNAL/GETPASSWORD HOST] (LIST (QUOTE USER-PASSWORD) (CDR INFO))) NEWCONNECTION (OR (SETQ CONNECTION (\GETFTPCONNECTION HOST T)) (GO NOFILES)) (SETQ INS (fetch FTPIN of CONNECTION)) (SETQ OUTS (fetch FTPOUT of CONNECTION)) RETRY (FTPPUTMARK OUTS (MARK# ENUMERATE)) (\FTP.PRINTPLIST OUTS DESIREDPLIST) (.EOC. OUTS) (SELECTC (FTPGETMARK INS) [(MARK# NO) (COND [(\FTP.HANDLE.NO CONNECTION DESIREDPLIST NIL CODE NIL T) (COND ((BSPOPENP INS (QUOTE INPUT)) (GO RETRY)) (T (GO NEWCONNECTION] (T (\RELEASE.FTPCONNECTION CONNECTION] [(MARK# HERE-IS-PLIST) (replace FTPBUSY of CONNECTION with (SETUPTIMER \FTP.IDLE.TIMEOUT)) (* This guy gets a timer because the generator could be aborted out of our control. Blech) (RETURN (create FILEGENOBJ NEXTFILEFN ←(FUNCTION \FTP.NEXTFILE) FILEINFOFN ←(FUNCTION \FTP.FILEINFOFN) GENFILESTATE ←(create FTPFILEGENSTATE FTPGENCONNECTION ← CONNECTION FTPDEVICEWANTED ← WANTDEVICE FTPGENPLIST ← NIL FTPNAMEFILTER ←(AND FILTERNEEDED ( DIRECTORY.MATCH.SETUP PATTERN] ((MARK# BROKEN) (GO NEWCONNECTION)) (\FTPERROR CONNECTION)) NOFILES (RETURN (create FILEGENOBJ NEXTFILEFN ←(FUNCTION NILL] [COND ((AND RESULT (fetch GENFILESTATE of RESULT)) (* Have a generator, so need to assure generator will terminate) (COND [(EQMEMB (QUOTE RESETLST) OPTIONS) (RESETSAVE NIL (LIST [FUNCTION (LAMBDA (CONNECTION) (AND RESETSTATE (CLOSEBSPSTREAM (fetch FTPIN of CONNECTION) 0] (fetch FTPGENCONNECTION of (fetch GENFILESTATE of RESULT] (T (\FTP.ASSURE.CLEANUP] (RETURN RESULT]) ) (PUTPROPS TOPS20FTPPATCH COPYRIGHT ("Xerox Corporation" 1985)) (DECLARE: DONTCOPY (FILEMAP (NIL (330 8977 (\FTP.GENERATEFILES 340 . 8975))))) STOP