This is G o o g l e's cache of http://www.lp.se/ftp/mailinglists/LP/FREE-BUGS.1999-05.
G o o g l e's cache is the snapshot that we took of the page as we crawled the web.
The page may have changed since that time. Click here for the current page without highlighting.


Google is not affiliated with the authors of this page nor responsible for its content.
These search terms have been highlighted: levitte programming 

Archive-Date: Sun, 16 May 1999 16:10:20 +0200
Date: Sun, 16 May 1999 10:10:29 -0400
From: SYSTEM@wolverine.acornsw.com
Reply-To: bugs@free.lp.se, SYSTEM@wolverine.acornsw.com
To: bugs@free.lp.se
Message-ID: <990516101029.22800d1c@wolverine.acornsw.com>
Subject: Some more tweaks to ftp_mirror...

$	VERIFY = 'F$VERIFY(F$TRNLNM("FTP_MIRROR_VERIFY"))'
$	SET = "SET"
$	SET SYMBOL/SCOPE=(noGLOBAL,noLOCAL)
$	GOTO _START_FTP_MIRROR

DESCRIPTION:

  Automates mirroring a remote FTP site.

PARAMETERS:

  P1 - configuration filename

REQUIREMENTS:

Due to the different commands used by FTP Clients, only a few FTP Clients are 
supported.  Due to the different output generated by different FTP Servers,
parsing routines have only been written for a few FTP Servers.

  o one of the following FTP Clients (on your system):
      - MultiNet 
      - MadGoat FTP
      - TCPware

  o mirrored against one of the following FTP Servers (on the remote system):
      - MultiNet
      - MadGoat FTP
      - TCPware
      - Unix

 =----------------------------------------------------------------------=

Copyright © 1994 by Dan Wing.
Copyright © 1997 by MadGoat Software, Inc.
Copyright © 1998 by Richard Levitte.
Copyright © 1999 by Dick Munroe

This code may be freely distributed and modified for no commercial gain
as long as this copyright notice is retained.  This program is supplied
'as-is', and with no warranty.

Created September 21, 1994, by Dan Wing, TGV <dwing@Cisco.com>
Hacked a lot by Richard Levitte <richard@levitte.org>
Features added by Hunter Goatley <goathunter@madgoat.com>

Please send bug reports to <bugs@free.lp.se>.

 =----------------------------------------------------------------------=

  REVERSE CHRONOLOGICAL MODIFICATION HISTORY
  ------------------------------------------

  T0.8-9  12-May-1999  Dick Munroe <munroe@acornsw.com>
     Fix a bug that got triggered by seeing "$" debugging records in the
     FTP log file when getting a directory listing.  While I was at it,
     I also force a retry when the login fails for any ftp processing.
     At the moment, it waits one minute and retries indefinately.  This
     guarantees that a file transfer actually happens each time the
     command procedure is run rather than relying on the batch job to
     get through the "next" time it is run.

  T0.8-8  16-APR-1999  Dick Munroe <munroe@acornsw.com>
     There is at least one case I'm running across in which the file name
     reported by LS isn't the file name actually on the server.  Therefore,
     I'm turning exit-on-error OFF once the file transfer portion of the
     procedure starts.  I don't like this solution, but it's what I have at
     the moment.

  T0.8-7  15-APR-1999  Dick Munroe <munroe@acornsw.com>
     The code that picks up the LS options for unix servers needs to supply
     the options when the directory is fully enumerated.  This avoids
     a bug when enumerating directories (or files) which are actually
     symbolic links on the server.

  T0.8-6  14-APR-1999  Dick Munroe <munroe@acornsw.com>
     The invocation of FTP that gets the directory listings assumed that
     any error coming back from FTP meant that things were not supposed
     to work.  I have disabled this test and as a result the failure to
     log in is properly detected and the job resubmitted, however this
     may lead to other problems downstream.  I suspect that a somewhat
     more sophisticated error recovery scheme will need to be evolved.
     If things fail due to either a login failure, or other issue, the
     directory structures don't have to be purged.

  T0.8-5  13-APR-1999  Dick Munroe <munroe@acornsw.com>
     Some FTP servers have a time limit on them.  I'm adding a
     MAXIMUM_FILES parameter to the configuration that allows some
     control over the load placed on the server.  Once the maximum
     number of files have been transferred, then the job is rescheduled.
     Frequently FTP servers are busy and you can't get logged in, so
     check for the 530 status and reschedule the job if that happens.
     To avoid spurious errors, check to see if directories contain
     files during the purge processing.

  T0.8-4  09-APR-1999  Dick Munroe <munroe@acornsw.com>
     Using a multinet FTP client requires that the VERBOSE mode of
     FTP transfer be used.  This, in turn, left stuff in the log files
     that, for some reason, the command procedure didn't know how to
     process.  There were similar issues for hooking up to aol.com, so
     now this procedure seems to work with all the ftp sites that I'm
     using regularly.

  T0.8-3  23-APR-1998  Richard Levitte <richard@levitte.org>
     A small bug corrected.  REMOTE_DIRECTORY wasn't set correctly
     under some circumstances.  Under others, it was set when it
     really shoulden't.

  T0.8-2  20-APR-1998  Richard Levitte <richard@levitte.org>
     Worked around the fact that the MadGoat client (and perhaps others)
     sputters lines like the following one right in the middle of the
     directory output:

	<226 File transfer Okay; Closing data connection.

  T0.8-1  07-APR-1998  Richard Levitte <richard@levitte.org>
     Corrected a small bug that caused a erroneous download to be made
     for a serie of Unix directories.  Of course, if `ls' could output
     the directory name for the first directory listed, we wouldn't
     have these problems...

  T0.8	   6-APR-1998	Hunter Goatley <goathunter@MadGoat.com>
     Explicitly enable or disable passive mode according to file setting.

  T0.7    06-APR-1998  Richard Levitte <richard@levitte.org>
     Merged in changes that Hunter Goatley <goathunter@madgoat.com>
     added in 27-MAY-1997.  His comment was:

	Updated for newer MGFTP releases and for TCPware.

  T0.6    05-APR-1998  Richard Levitte <richard@levitte.org>
     - Now understands the output from a Unix FTP server, and can
       download files from it.  ALL files are currently downloaded in
       Image mode.
     - An added feature is that "/..." at the end of a Unix directory
       specification means the same thing as the standard VMS
       ellipsis.
     - CAUTION:  Unix file specifications can ONLY be used as the
       first argument of the DIRECTORY configuratoin parameter.
     - Name conversion for Unix file specifications is done according
       to the following rules:
         1. An ending ".gz" is changed to "-gz" if there is another
            dot in the file name.
         2. And ending ".Z is changed to "_Z" if there is another dot
            in the file name.
         3. All remaining dots except the last are changed to
            underscores, except the last one in a file name.
         4. All other characters that are not legal in a VMS file name
            are changed to dollars.
     - A hack that saves the current time in a file has been added.
       If that file is found and there is a time specification in it,
       it is used to limit the download of file to those newer than
       that time.  The name of this file is configurable.
     - A mail address to send logs to is configurable.

  T0.5	  02-APR-1998  Richard Levitte <richard@levitte.org>
     Many hacks, among other supporting elipsis in directory specs,
     and support for the Process Software FTP server.  Unfortunatelly,
     I haven't made many notes of my changes.

  T0.0    25-OCT-1994  Dan Wing, wing@tgv.com
     Initial release.

$!
$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$
$ _START_FTP_MIRROR: 
$
$	ON WARNING THEN GOTO _ERROR
$	ON CONTROL_Y THEN GOTO _ABORT
$
$	FTP_MIRROR_VERSION = "T0.8-3 BETA TEST Prerelease 9"								!DM
$	WRITE SYS$OUTPUT F$FAO("!/FTP_Mirror, version !AS.!/Started by !AS on node !AS on !AS, !AS !8AS.", -
			       FTP_MIRROR_VERSION, -
			       F$EDIT(F$GETJPI(0,"USERNAME"),"TRIM"), -
			       F$GETSYI("NODENAME"), -
			       F$CVTIME(,,"WEEKDAY"), -
			       F$CVTIME(,"ABSOLUTE","DATE"), -
			       F$CVTIME(,,"TIME"))
$
$	TRUE = 1
$	FALSE = 0
$	DEBUG = FALSE
$	IF F$TRNLNM("FTP_MIRROR_DEBUG") THEN DEBUG = TRUE
$	IF DEBUG THEN WRITE SYS$ERROR "FTP_Mirror debugging enabled."
$
$! setup defaults.  These can be overridden in the configuration file
$
$	CONFIG_FTP_CLIENT           = "MadGoat FTP"
$	CONFIG_COMMAND              = "FTP"
$	CONFIG_FTP_SERVER           = "MadGoat FTP"
$	CONFIG_SITE                 = ""
$	CONFIG_USERNAME             = "anonymous"
$	IF F$TRNLNM("UCX$INET_HOST") .NES. "" THEN CONFIG_PASSWORD = "mirror@" + F$TRNLNM("UCX$INET_HOST")
$	IF F$TRNLNM("MULTINET_HOST_NAME") .NES. "" THEN CONFIG_PASSWORD = "mirror@" + F$TRNLNM("MULTINET_HOST_NAME")
$	CONFIG_PASSIVE              = FALSE
$	CONFIG_SUBMIT_AFTER         = "+12:00:00"
$	CONFIG_QUEUE                = "SYS$BATCH"
$	CONFIG_FILE_TRANSFER        = "VMS"
$	CONFIG_LAST_TIME_FILE       = ""
$	CONFIG_MAILTO               = ""
$	CONFIG_MAXIMUM_FILES	    = %X7FFFFFFF									!DM
$
$	VALID_CONFIGURATION = TRUE           ! assume the best
$
$	TEMPFILE_1 = "SYS$SCRATCH:FTP_MIRROR_1_" + F$GETJPI(0,"PID") + ".TMP"
$	TEMPFILE_2 = "SYS$SCRATCH:FTP_MIRROR_2_" + F$GETJPI(0,"PID") + ".TMP"
$	TEMPFILE_3 = "SYS$SCRATCH:FTP_MIRROR_3_" + F$GETJPI(0,"PID") + ".TMP"
$	TEMPFILE_4 = "SYS$SCRATCH:FTP_MIRROR_4_" + F$GETJPI(0,"PID") + ".TMP"
$	TEMPFILE_5 = "SYS$SCRATCH:FTP_MIRROR_5_" + F$GETJPI(0,"PID") + ".TMP"
$
$	CONFIG_LAST_TIME = ""
$	CONFIG_DIR_TOTAL = 0
$
$	TYPE_MULTINET = 1
$	TYPE_MGFTP    = 2
$	TYPE_TCPWARE  = 3
$	TYPE_UNIX     = 128
$	TYPE_OTHER    = 255
$
$	IF P1 .EQS. "" THEN P1 = "FTP_MIRROR.DAT"
$! make sure CONFIGURATION_FILE contains a full path, but also make sure
$! you get the right directory.  Guess what F$PARSE does to non-concealed
$! multivalued logical names.  It's not a pretty sight.  --  Richard Levitte
$	CONFIGURATION_FILE = F$SEARCH(P1)
$	IF CONFIGURATION_FILE .EQS. "" THEN GOTO _NO_CONFIG_FILE
$	GOSUB _CLEANUP
$
$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$	OPEN/READ/ERROR=_ERROR FILE 'CONFIGURATION_FILE'
$ _CONFIG_LOOP:	
$	READ/END_OF_FILE=_EXIT_CONFIG_LOOP/ERROR=_ERROR FILE RECORD
$	RECORD = F$EDIT(RECORD,"COMPRESS,UNCOMMENT")
$	IF RECORD .EQS. "" THEN GOTO _CONFIG_LOOP
$
$	PARA1 = F$EDIT(F$ELEMENT(0," ",RECORD),"UPCASE")
$	PARA2 = F$ELEMENT(1," ",RECORD)
$	PARA3 = F$ELEMENT(2," ",RECORD)
$  
$	VALID_RECORD = FALSE
$
$	IF PARA1 .EQS. "SITE"
$	THEN
$	    CONFIG_SITE = PARA2
$	    VALID_RECORD = TRUE
$	ENDIF
$
$	IF PARA1 .EQS. "USERNAME"
$	THEN
$	    CONFIG_USERNAME = PARA2
$	    VALID_RECORD = TRUE
$	ENDIF
$
$	IF PARA1 .EQS. "PASSWORD"
$	THEN
$	    CONFIG_PASSWORD = PARA2
$	    VALID_RECORD = TRUE
$	ENDIF
$
$	IF PARA1 .EQS. "DIRECTORY"
$	THEN
$	    CONFIG_DIRECTORIES_'CONFIG_DIR_TOTAL' = PARA2 + "," + PARA3
$	    CONFIG_DIR_TOTAL = CONFIG_DIR_TOTAL + 1
$	    VALID_RECORD = TRUE
$	ENDIF
$
$	IF PARA1 .EQS. "COMMAND"
$	THEN
$	    CONFIG_COMMAND = F$EXTRACT(F$LOCATE(" ",RECORD)+1,-1,RECORD)
$	    VALID_RECORD = TRUE
$	ENDIF
$
$	IF PARA1 .EQS. "PASSIVE"
$	THEN
$	    CONFIG_PASSIVE = PARA2
$	    VALID_RECORD = TRUE
$	ENDIF
$
$	IF PARA1 .EQS. "PRIV"
$	THEN
$	    ORIGINAL_PRIV = F$SETPRV(PARA2)
$	    IF .NOT. F$PRIVILEGE(PARA2) THEN WRITE SYS$OUTPUT "%%Warning - not all requested privileges are authorized."
$	    VALID_RECORD = TRUE
$	ENDIF
$
$	IF PARA1 .EQS. "SUBMIT_AFTER"
$	THEN
$	    CONFIG_SUBMIT_AFTER = F$EDIT("''PARA2' ''PARA3'","TRIM")
$	    IF F$EDIT(PARA2,"UPCASE") .EQS. "NONE" -
	       .OR. F$EDIT(PARA3,"UPCASE") .EQS. "ONE" THEN -
	       CONFIG_SUBMIT_AFTER = "NONE"
$	    VALID_RECORD = TRUE
$	ENDIF
$
$	IF PARA1 .EQS. "BATCH_QUEUE"
$	THEN
$	    CONFIG_QUEUE = PARA2
$	    VALID_RECORD = TRUE
$	ENDIF
$
$	IF PARA1 .EQS. "FTP_CLIENT"
$	THEN
$	    CONFIG_FTP_CLIENT = F$EDIT(PARA2,"UPCASE")
$	    IF CONFIG_FTP_CLIENT .EQS. "MULTINET" 
$	    THEN 
$		CONFIG_FTP_CLIENT = "MultiNet"
$		CONFIG_COMMAND = "MULTINET FTP"
$		VALID_RECORD = TRUE
$	    ENDIF
$	    IF CONFIG_FTP_CLIENT .EQS. "MADGOAT" -
	       .OR. CONFIG_FTP_CLIENT .EQS. "MADGOAT_FTP"
$	    THEN 
$		CONFIG_FTP_CLIENT = "MadGoat FTP"
$		CONFIG_COMMAND = "FTP"
$		VALID_RECORD = TRUE
$	    ENDIF
$	    IF CONFIG_FTP_CLIENT .EQS. "TCPWARE"
$	    THEN
$		CONFIG_FTP_CLIENT = "TCPware"
$		CONFIG_COMMAND = "FTP"
$		VALID_RECORD = TRUE
$	    ENDIF
$	ENDIF
$
$	IF PARA1 .EQS. "FTP_SERVER"
$	THEN
$	    CONFIG_FTP_SERVER = F$EDIT(PARA2,"UPCASE")
$	    IF CONFIG_FTP_SERVER .EQS. "MULTINET" THEN -
	       CONFIG_FTP_SERVER = "MultiNet"
$	    IF CONFIG_FTP_SERVER .EQS. "MADGOAT" -
	       .OR. CONFIG_FTP_SERVER .EQS. "MADGOAT_FTP" -
	       THEN CONFIG_FTP_SERVER = "MadGoat FTP"
$	    IF CONFIG_FTP_SERVER .EQS. "TCPWARE" THEN -
	       CONFIG_FTP_SERVER = "TCPware"
$	    IF CONFIG_FTP_SERVER .EQS. "UNIX" THEN -
	       CONFIG_FTP_SERVER = "Unix"
$	    VALID_RECORD = TRUE
$	ENDIF
$
$	IF PARA1 .EQS. "FILE_TRANSFER"
$	THEN
$	    CONFIG_FILE_TRANSFER = F$EDIT(PARA2,"UPCASE")
$	    VALID_RECORD = TRUE
$	ENDIF
$
$	IF PARA1 .EQS. "LAST_TIME_FILE"
$	THEN
$	    CONFIG_LAST_TIME_FILE = F$EDIT(PARA2,"UPCASE")
$	    IF F$SEARCH(CONFIG_LAST_TIME_FILE) .NES. ""
$	    THEN
$		OPEN/READ FOO 'CONFIG_LAST_TIME_FILE'
$		READ FOO CONFIG_LAST_TIME
$		CONFIG_LAST_TIME = F$CVTIME(CONFIG_LAST_TIME,"COMPARISON")
$		CLOSE FOO
$	    ELSE
$		CONFIG_LAST_TIME = "1-JAN-1900"
$	    ENDIF
$	    ! We remove oen day just to make sure we get all files in
$	    ! spite of all kinds of timezone junk.  So we might get
$	    ! duplicates at times...  So what?
$	    CONFIG_NEXT_TIME = F$CVTIME("-1-","ABSOLUTE")
$	    VALID_RECORD = TRUE
$	ENDIF
$
$	IF PARA1 .EQS. "MAILTO"
$	THEN
$	    CONFIG_MAILTO = F$EDIT(PARA2,"UPCASE")
$	    VALID_RECORD = TRUE
$	ENDIF
$
$	IF PARA1 .EQS. "MAXIMUM_FILES"											!DM
$	THEN														!DM
$	    CONFIG_MAXIMUM_FILES = F$INTEGER(F$EDIT(PARA2,"UPCASE"))							!DM
$	    VALID_RECORD = TRUE												!DM
$	ENDIF														!DM
$															!DM
$	IF .NOT. VALID_RECORD
$	THEN
$	    WRITE SYS$OUTPUT "%%Warning - invalid configuration file record \", RECORD, "\"
$	    VALID_CONFIGURATION = FALSE
$	ENDIF
$
$	GOTO _CONFIG_LOOP
$  
$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$ _EXIT_CONFIG_LOOP: 
$	CLOSE FILE
$
$	IF .NOT. VALID_CONFIGURATION
$	THEN
$	    WRITE SYS$OUTPUT "Error in configuration file."
$	    GOTO _EXIT
$	ENDIF
$
$	FTP_CLIENT_TYPE = TYPE_OTHER
$	IF CONFIG_FTP_CLIENT .EQS. "MultiNet" THEN -
	   FTP_CLIENT_TYPE = TYPE_MULTINET
$	IF CONFIG_FTP_CLIENT .EQS. "MadGoat FTP" THEN -
	   FTP_CLIENT_TYPE = TYPE_MGFTP
$	IF CONFIG_FTP_CLIENT .EQS. "TCPware" THEN -
	   FTP_CLIENT_TYPE = TYPE_TCPWARE
$
$	FTP_SERVER_TYPE = TYPE_OTHER
$	IF CONFIG_FTP_SERVER .EQS. "MultiNet" THEN -
	   FTP_SERVER_TYPE = TYPE_MULTINET
$	IF CONFIG_FTP_SERVER .EQS. "MadGoat FTP" THEN -
	   FTP_SERVER_TYPE = TYPE_MGFTP
$	IF CONFIG_FTP_SERVER .EQS. "TCPware" THEN -
	   FTP_SERVER_TYPE = TYPE_TCPWARE
$	IF CONFIG_FTP_SERVER .EQS. "Unix" THEN -
	   FTP_SERVER_TYPE = TYPE_UNIX
$
$	WRITE SYS$OUTPUT ""
$	WRITE SYS$OUTPUT F$FAO("  !40AS !AS","Remote site:",CONFIG_SITE)
$	WRITE SYS$OUTPUT F$FAO("  !40AS !AS","Remote username:",CONFIG_USERNAME)
$	WRITE SYS$OUTPUT F$FAO("  !40AS !AS","Remote password:",CONFIG_PASSWORD)
$	WRITE SYS$OUTPUT F$FAO("  !40AS !AS","FTP server:",CONFIG_FTP_SERVER)
$	WRITE SYS$OUTPUT ""
$	WRITE SYS$OUTPUT "  Directories:  (remote)                (local)"
$
$	COUNT = 0
$ _DISPLAY_LOOP_1: 
$	IF COUNT .GE. CONFIG_DIR_TOTAL THEN GOTO _EXIT_DISPLAY_LOOP_1
$	WRITE SYS$OUTPUT F$FAO("    !33AS !35AS", -
			       F$ELEMENT(0,",",CONFIG_DIRECTORIES_'COUNT'), -
			       F$ELEMENT(1,",",CONFIG_DIRECTORIES_'COUNT'))
$	IF F$PARSE(F$ELEMENT(1,",",CONFIG_DIRECTORIES_'COUNT'),,,,"SYNTAX_ONLY") .EQS. ""
$	THEN
$	    WRITE SYS$ERROR F$FAO("!5** Local directory specification (above) is invalid VMS syntax.")
$	    VALID_CONFIGURATION = FALSE
$	ENDIF
$	COUNT = COUNT + 1
$	GOTO _DISPLAY_LOOP_1
$ _EXIT_DISPLAY_LOOP_1: 
$
$	WRITE SYS$OUTPUT ""
$	WRITE SYS$OUTPUT F$FAO("  !40AS !AS","FTP client:",CONFIG_FTP_CLIENT)
$	WRITE SYS$OUTPUT F$FAO("  !40AS !AS","DCL command:",CONFIG_COMMAND)
$	WRITE SYS$OUTPUT F$FAO("  !40AS !AS","File transfer mode:",CONFIG_FILE_TRANSFER)
$	IF CONFIG_PASSIVE
$	THEN
$	    CONFIG_PASSIVE = TRUE
$	    WRITE SYS$OUTPUT F$FAO("  !40AS !AS","Passive mode:","Yes")
$	ELSE
$	    CONFIG_PASSIVE = FALSE
$	    WRITE SYS$OUTPUT F$FAO("  !40AS !AS","Passive mode:","No")
$	ENDIF
$	IF CONFIG_LAST_TIME .NES. "" THEN -
	   WRITE SYS$OUTPUT F$FAO("  !40AS !AS",-
				  "Only get files created after:",-
				  CONFIG_LAST_TIME)
$	WRITE SYS$OUTPUT F$FAO("  !40AS !AS","Resubmit after:",-
			       CONFIG_SUBMIT_AFTER)
$	IF CONFIG_SUBMIT_AFTER .NES. "NONE" THEN -
	   WRITE SYS$OUTPUT F$FAO("  !40AS !AS","Batch queue:",CONFIG_QUEUE)
$	IF CONFIG_MAILTO .NES. "" THEN -
	   WRITE SYS$OUTPUT F$FAO("  !40AS !AS",-
				  "Mail reports to:",-
				  CONFIG_MAILTO)
$	IF CONFIG_MAXIMUM_FILES .NE. %X7FFFFFFF THEN -									!DM
	   WRITE SYS$OUTPUT F$FAO("  !40AS !UL",-									!DM
				  "Maximum number of files to transfer:",-						!DM
				  CONFIG_MAXIMUM_FILES)									!DM
$	WRITE SYS$OUTPUT ""
$
$	IF CONFIG_SITE .EQS. "" .OR. CONFIG_USERNAME .EQS. "" .OR. -
	   CONFIG_PASSWORD .EQS. "" .OR. CONFIG_DIRECTORIES_0 .EQS. "" .OR. -
	   CONFIG_SUBMIT_AFTER .EQS. ""
$	THEN
$	    WRITE SYS$ERROR "Missing required configuration setting; exiting."
$	    WRITE SYS$ERROR "Check for missing username, directory, password, or submit-after."
$	    GOTO _EXIT
$	ENDIF
$
$	IF FTP_CLIENT_TYPE .NE. TYPE_MULTINET -
	   .AND. FTP_CLIENT_TYPE .NE. TYPE_MGFTP -
	   .AND. FTP_CLIENT_TYPE .NE. TYPE_TCPWARE
$	THEN
$	    WRITE SYS$ERROR "Invalid FTP Client -- only \MULTINET\, \TCPWARE\, or \MADGOAT FTP\ are allowed."
$	    GOTO _EXIT
$	ENDIF
$
$!$	IF CONFIG_PASSIVE .AND. (FTP_CLIENT_TYPE .EQ. TYPE_MGFTP .OR. -
$!				 FTP_SERVER_TYPE .EQ. TYPE_MGFTP)
$!$	THEN
$!$	    WRITE SYS$ERROR "PASSIVE isn't supported by MadGoat FTP client or server."
$!$	    GOTO _EXIT
$!$	ENDIF
$
$	IF FTP_SERVER_TYPE .NE. TYPE_MULTINET -
	   .AND. FTP_SERVER_TYPE .NE. TYPE_MGFTP -
	   .AND. FTP_SERVER_TYPE .NE. TYPE_TCPWARE -
	   .AND. FTP_SERVER_TYPE .NE. TYPE_UNIX
$	THEN
$	    WRITE SYS$ERROR "Invalid FTP Server.  Only MultiNet, MadGoat FTP, TCPware, and UNIX are supported."
$	    GOTO _EXIT
$	ENDIF
$
$	IF .NOT. VALID_CONFIGURATION
$	THEN
$	    WRITE SYS$ERROR "Invalid configuration -- see above reason"
$	    GOTO _EXIT
$	ENDIF
$
$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$
$	IF F$MODE() .EQS. "INTERACTIVE"
$	THEN
$	    READ SYS$COMMAND CHECK/PROMPT="Ready [Y]? "/END_OF_FILE=_ABORT
$	ELSE
$	    CHECK := Y
$	ENDIF
$
$	IF .NOT. CHECK .AND. CHECK .NES. "" THEN GOTO _ABORT
$
$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$
$
$
$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$
$	IF CONFIG_SUBMIT_AFTER .NES. "NONE" .AND. F$MODE() .NES. "BATCH"
$	THEN
$	    GOTO _SUBMIT
$	ENDIF
$          
$
$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$!  Obtain the list of files on the remote system
$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$
$	OPEN/WRITE FILE 'TEMPFILE_1'
$	COUNT = 0
$
$	IF FTP_CLIENT_TYPE .EQ. TYPE_MULTINET
$	THEN
$	    IF CONFIG_PASSIVE
$	    THEN WRITE FILE "PASSIVE ON"
$	    ELSE WRITE FILE "PASSIVE OFF"
$	    ENDIF
$	    WRITE FILE "EXIT-ON-ERROR ON"
$	    WRITE FILE "PROMPT-FOR-MISSING-ARGUMENTS OFF"
$	    WRITE FILE "VERBOSE"											!DM
$	    IF DEBUG THEN WRITE FILE "STATISTICS"
$	    WRITE FILE "CONNECT ", CONFIG_SITE
$	    WRITE FILE "USER ", CONFIG_USERNAME
$	    WRITE FILE "PASS ", CONFIG_PASSWORD
$	    IF CONFIG_FILE_TRANSFER .EQS. "VMS"
$	    THEN
$		WRITE FILE "STRUCTURE VMS"
$	    ELSE
$		WRITE FILE "TYPE ", CONFIG_FILE_TRANSFER
$	    ENDIF
$	    WRITE FILE "PWD"
$	ENDIF  ! multinet
$
$	IF FTP_CLIENT_TYPE .EQ. TYPE_MGFTP
$	THEN
$	    WRITE FILE "SET BATCH"
$	    IF CONFIG_PASSIVE
$	    THEN WRITE FILE "SET PASSIVE"
$	    ELSE WRITE FILE "SET NOPASSIVE"
$	    ENDIF
$	    IF CONFIG_FILE_TRANSFER .EQS. "VMS"
$	    THEN
$		WRITE FILE "SET STRUCTURE VMS"
$	    ELSE
$		WRITE FILE "SET TYPE ", CONFIG_FILE_TRANSFER
$	    ENDIF
$	    WRITE FILE "PWD"
$	ENDIF  ! madgoat
$
$	IF FTP_CLIENT_TYPE .EQ. TYPE_TCPWARE
$	THEN
$	    IF CONFIG_PASSIVE
$	    THEN WRITE FILE "SET PASSIVE"
$	    ELSE WRITE FILE "SET NOPASSIVE"
$	    ENDIF
$	    IF DEBUG THEN WRITE FILE "SET DEBUG/CLASS=REPLIES"
$	    WRITE FILE "CONNECT ", CONFIG_SITE, " ", -
		  CONFIG_USERNAME, " ", CONFIG_PASSWORD
$	    IF CONFIG_FILE_TRANSFER .EQS. "VMS"
$	    THEN
$		WRITE FILE "STRUCTURE VMS"
$	    ELSE
$		WRITE FILE "TYPE ", CONFIG_FILE_TRANSFER
$	    ENDIF
$	    WRITE FILE "PWD"
$	ENDIF  ! tcpware
$
$	COUNT = 0
$ _GEN_FILE_LOOP: 
$	IF COUNT .GE. CONFIG_DIR_TOTAL THEN GOTO _EXIT_GEN_FILE_LOOP
$	DIRECTORY_NAME = F$ELEMENT(0,",",CONFIG_DIRECTORIES_'COUNT')
$	DIRECTORY_NAME2 = DIRECTORY_NAME - "/..." - "..."
$	WRITE FILE "SPAWN WRITE SYS$OUTPUT ""<<<REMOTE_DIRECTORY ''DIRECTORY_NAME2'>>>"""
$	IF FTP_SERVER_TYPE .EQ. TYPE_UNIX										!DM
$	THEN														!DM
$	    IF F$EXTRACT(F$LENGTH(DIRECTORY_NAME)-4, 4, DIRECTORY_NAME) .EQS. "/..."					!DM
$	    THEN DIRECTORY_NAME = "-RlL " + F$EXTRACT(0, F$LENGTH(DIRECTORY_NAME)-4, DIRECTORY_NAME)			!DM
$	    ELSE DIRECTORY_NAME = "-lL " + DIRECTORY_NAME								!DM
$	    ENDIF													!DM
$	ENDIF														!DM
$	IF FTP_CLIENT_TYPE .EQ. TYPE_MULTINET THEN -
	   WRITE FILE "DIR """, DIRECTORY_NAME, """"
$!RL	   WRITE FILE "DIR """, DIRECTORY_NAME, """ FTP_DIR:"
$	IF FTP_CLIENT_TYPE .EQ. TYPE_MGFTP -
	   .OR. FTP_CLIENT_TYPE .EQ. TYPE_TCPWARE THEN -
	   WRITE FILE "DIR """, DIRECTORY_NAME, """"
$!RL	   WRITE FILE "DIR """, DIRECTORY_NAME, """/OUTPUT=FTP_DIR:"
$	COUNT = COUNT + 1
$	GOTO _GEN_FILE_LOOP
$
$ _EXIT_GEN_FILE_LOOP: 
$	WRITE FILE "EXIT"
$	CLOSE FILE
$	IF DEBUG THEN WRITE SYS$ERROR "-Debug- Contents of input file:"
$	IF DEBUG THEN TYPE/OUTPUT=SYS$ERROR 'TEMPFILE_1'
$
$	IF DEBUG THEN WRITE SYS$ERROR "-Debug- Connecting to remote system..."
$!RL$	IF F$SEARCH(TEMPFILE_2) .NES. "" THEN DELETE 'TEMPFILE_2';*
$!RL$	TYPE NLA0: /OUTPUT='TEMPFILE_2'
$!RL$	SET FILE/VERSION_LIMIT=0 'TEMPFILE_2'
$!RL$	IF F$SEARCH(TEMPFILE_4) .NES. "" THEN DELETE 'TEMPFILE_4';*
$!RL$	TYPE NLA0: /OUTPUT='TEMPFILE_4'
$!RL$	SET FILE/VERSION_LIMIT=0 'TEMPFILE_4'
$	IF .NOT. DEBUG .AND. F$SEARCH(TEMPFILE_3) .NES. "" THEN DELETE 'TEMPFILE_3';*					!DM
$
$	OLD_SYMBOL_SCOPE = F$ENVIRONMENT("SYMBOL_SCOPE")
$	SET SYMBOL/SCOPE=(GLOBAL,LOCAL)
$
$!RL$	IF DEBUG THEN SHOW LOG SYS$OUTPUT/FULL
$
$ _RETRY_GEN_FILE_LIST:													!DM
$
$	IF FTP_CLIENT_TYPE .EQ. TYPE_MULTINET
$	THEN
$	    SET noON
$!RL$	    OPEN/WRITE FTP_DIR 'TEMPFILE_2'
$!RL$	    DEFINE SYS$OUTPUT 'TEMPFILE_4'
$	    DEFINE SYS$OUTPUT 'TEMPFILE_3'
$	    'CONFIG_COMMAND' -
		  /NOINITIALIZATION -
		  /TAKE_FILE='TEMPFILE_1'
$	    STATUS = $STATUS
$	    DEASSIGN SYS$OUTPUT
$!RL$	    CLOSE FTP_DIR
$	    SET ON
$	ENDIF
$
$	IF FTP_CLIENT_TYPE .EQ. TYPE_MGFTP
$	THEN
$	    SET noON
$!RL$	    OPEN/WRITE FTP_DIR 'TEMPFILE_2'
$!RL$	    DEFINE SYS$OUTPUT 'TEMPFILE_4'
$	    DEFINE SYS$OUTPUT 'TEMPFILE_3'
$	    'CONFIG_COMMAND' -
		  'CONFIG_SITE' -
		  /USERNAME="''CONFIG_USERNAME'" -
		  /PASSWORD="''CONFIG_PASSWORD'" -
		  /INITIALIZATION='TEMPFILE_1'
$	    STATUS = $STATUS
$	    DEASSIGN SYS$OUTPUT
$!RL$	    CLOSE FTP_DIR
$	    SET noON
$	ENDIF
$
$	IF FTP_CLIENT_TYPE .EQ. TYPE_TCPWARE
$	THEN
$	    SET noON
$!RL$	    OPEN/WRITE FTP_DIR 'TEMPFILE_2'
$!RL$	    DEFINE SYS$OUTPUT 'TEMPFILE_4'
$	    DEFINE SYS$OUTPUT 'TEMPFILE_3'
$	    DEFINE/USER FTP_STARTUP 'TEMPFILE_1'									!DM
$	    'CONFIG_COMMAND'
$	    STATUS = $STATUS
$	    DEASSIGN SYS$OUTPUT
$!RL$	    CLOSE FTP_DIR
$	    SET noON
$	ENDIF
$
$	SET SYMBOL/SCOPE=('OLD_SYMBOL_SCOPE')
$
$!RL$	IF F$SEARCH(TEMPFILE_3) .NES. "" THEN DELETE 'TEMPFILE_3';*
$!RL$	COPY/CONCATENATE 'TEMPFILE_4','TEMPFILE_2' 'TEMPFILE_3'
$	IF DEBUG THEN WRITE SYS$ERROR "-Debug- Output from FTP session:"
$	IF DEBUG THEN TYPE/OUTPUT=SYS$ERROR 'TEMPFILE_3'
$
$!DM	IF .NOT. STATUS THEN GOTO _ERROR
$
$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$! Determine which files we will need to get from the remote system
$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$
$	OPEN/READ FILE 'TEMPFILE_3'
$!	IF .NOT. DEBUG .AND. F$SEARCH(TEMPFILE_1) .NES. "" THEN DELETE 'TEMPFILE_1';					!DM
$	OPEN/WRITE OUTFILE 'TEMPFILE_5'
$	TYPE NLA0: /OUTPUT='TEMPFILE_4'
$	OPEN/APPEND REPORT_FILE 'TEMPFILE_4'
$	WRITE REPORT_FILE "(This message generated by FTP_MIRROR.COM)"
$	WRITE REPORT_FILE ""
$	WRITE REPORT_FILE "New files at site: ", CONFIG_SITE
$	WRITE REPORT_FILE ""
$
$	IF FTP_CLIENT_TYPE .EQ. TYPE_MULTINET
$	THEN
$	    IF CONFIG_PASSIVE THEN WRITE OUTFILE "PASSIVE ON"
$	    WRITE OUTFILE "EXIT-ON-ERROR ON"
$	    WRITE OUTFILE "PROMPT-FOR-MISSING-ARGUMENTS OFF"
$	    WRITE OUTFILE "VERBOSE"											!DM
$	    IF DEBUG THEN WRITE OUTFILE "STATISTICS"
$	    WRITE OUTFILE "CONNECT ", CONFIG_SITE
$	    WRITE OUTFILE "USER ", CONFIG_USERNAME
$	    WRITE OUTFILE "PASS ", CONFIG_PASSWORD
$	    IF CONFIG_FILE_TRANSFER .EQS. "VMS"
$	    THEN
$		WRITE OUTFILE "STRUCTURE VMS"
$	    ELSE
$		WRITE OUTFILE "TYPE ", CONFIG_FILE_TRANSFER
$	    ENDIF
$	    WRITE OUTFILE "PWD"
$	    WRITE OUTFILE "EXIT-ON-ERROR OFF"										!DM
$	ENDIF
$
$	IF FTP_CLIENT_TYPE .EQ. TYPE_MGFTP
$	THEN
$	    WRITE OUTFILE "SET BATCH"
$	    IF CONFIG_FILE_TRANSFER .EQS. "VMS"
$	    THEN
$		WRITE OUTFILE "SET STRUCTURE VMS"
$	    ELSE
$		WRITE OUTFILE "SET TYPE ", CONFIG_FILE_TRANSFER
$	    ENDIF
$	    WRITE OUTFILE "PWD"
$	ENDIF
$
$	IF FTP_CLIENT_TYPE .EQ. TYPE_TCPWARE
$	THEN
$	    IF CONFIG_PASSIVE THEN WRITE OUTFILE "SET PASSIVE"
$	    IF DEBUG THEN WRITE OUTFILE "SET DEBUG/CLASS=REPLIES"
$	    WRITE OUTFILE "CONNECT ", CONFIG_SITE, " ", -
		  CONFIG_USERNAME, " ", CONFIG_PASSWORD
$	    IF CONFIG_FILE_TRANSFER .EQS. "VMS"
$	    THEN
$		WRITE OUTFILE "STRUCTURE VMS"
$	    ELSE
$		WRITE OUTFILE "TYPE ", CONFIG_FILE_TRANSFER
$	    ENDIF
$	    WRITE OUTFILE "PWD"
$	ENDIF  ! tcpware
$
$	GET_FILE_COUNT = 0
$
$	LOCAL_DIRECTORY = ""
$	LOCAL_FILENAME = ""
$	NOT_LOGGED_IN = 0
$ _READ_FILE_LOOP:
$	READ/END_OF_FILE=_EXIT_READ_FILE_LOOP FILE RECORD
$	IF F$EDIT(RECORD,"COLLAPSE") .EQS. "" THEN GOTO _READ_FILE_LOOP
$	IF DEBUG THEN WRITE SYS$ERROR F$FAO("-Debug- Record is: \!AS\", RECORD)
$	RECORD = F$EDIT(RECORD,"COMPRESS")
$	IF F$EXTRACT(0,1,RECORD) .EQS. "$" THEN GOTO _READ_FILE_LOOP							!DM
$															!DM
$	XXX = F$EDIT(F$ELEMENT(0," ",RECORD),"UPCASE")									!DM
$	IF XXX .EQS. "LIST" THEN GOTO _READ_FILE_LOOP									!DM
$	IF XXX .EQS. "PORT" THEN GOTO _READ_FILE_LOOP									!DM
$	IF XXX .EQS. "QUIT" THEN GOTO _READ_FILE_LOOP									!DM
$	IF XXX .EQS. "RUN" THEN GOTO _READ_FILE_LOOP									!DM
$	IF XXX .EQS. "TYPE:" THEN GOTO _READ_FILE_LOOP									!DM
$	IF XXX .EQS. "TYPE" THEN GOTO _READ_FILE_LOOP									!DM
$	IF F$EXTRACT(0,5,RECORD) .EQS. "<257 " -
	   .OR. F$EXTRACT(0,4,RECORD) .EQS. "257 "
$	THEN
$	    REMOTE_ROOT = F$ELEMENT(1," ",RECORD)
$	    IF F$EXTRACT(0,1,REMOTE_ROOT) .EQS. """" THEN REMOTE_ROOT = F$ELEMENT(1,"""",REMOTE_ROOT)
$	    IF DEBUG THEN WRITE SYS$ERROR "-Debug- Remote root now: ", REMOTE_ROOT
$	    GOTO _READ_FILE_LOOP
$	ENDIF
$
$	IF F$EXTRACT(0,5,RECORD) .EQS. "<530 " -									!DM
	   .OR. F$EXTRACT(0,4,RECORD) .EQS. "530 "									!DM
$	THEN														!DM
$	    NOT_LOGGED_IN = 1												!DM
$	    IF DEBUG THEN WRITE SYS$ERROR "-Debug- Login at remote failed."						!DM
$	    GOTO _EXIT_READ_FILE_LOOP											!DM
$	ENDIF														!DM
$															!DM
$	IF F$EXTRACT(0,10,RECORD) .EQS. "Directory "
$	THEN 
$	    RECORD = F$EXTRACT(10,F$LENGTH(RECORD)-10,RECORD)
$	    IF DEBUG THEN WRITE SYS$ERROR F$FAO("-Debug- Record changed: \!AS\", RECORD)
$	ENDIF
$	IF F$EDIT(F$ELEMENT(0," ",RECORD),"UPCASE") .EQS. "<<<REMOTE_DIRECTORY"
$!RL	   .AND. LOCAL_DIRECTORY .EQS. ""
$	THEN
$	    LOCAL_DIRECTORY = ""
$	    RECORD = F$ELEMENT(0,">",F$ELEMENT(1," ",RECORD))
$	    IF FTP_SERVER_TYPE .EQ. TYPE_UNIX
$	    THEN
$		RECORD = RECORD + ":"
$	    ELSE
$!RL$		IF RECORD - ":" .EQS. RECORD THEN -
$!RL		   RECORD = REMOTE_ROOT - "]" + (RECORD - "[")
$		GOTO _READ_FILE_LOOP
$	    ENDIF
$	    IF DEBUG THEN WRITE SYS$ERROR F$FAO("-Debug- Record changed: \!AS\", RECORD)
$	ENDIF
$
$	IF RECORD .EQS. "" .OR. -
	   (FTP_SERVER_TYPE .NE. TYPE_UNIX .AND. -
	    RECORD .NES. F$EDIT(RECORD,"UPCASE")) THEN -
	   GOTO _READ_FILE_LOOP      ! no lowercase in files/directories
$	C = F$EXTRACT(0,1,RECORD)
$	IF C .EQS. "<" .OR. C .EQS. "%" .OR. C .EQS. "[" THEN GOTO _READ_FILE_LOOP					!DM
$	IF FTP_SERVER_TYPE .EQ. TYPE_UNIX .AND. -
	   F$TYPE(C) .EQS. "INTEGER" THEN GOTO _READ_FILE_LOOP
$	IF FTP_SERVER_TYPE .EQ. TYPE_UNIX .AND. -
	   F$ELEMENT(0," ",RECORD) .EQS. "total"
$	THEN
$	    TMP3 = F$EDIT(RECORD - F$ELEMENT(0," ",RECORD),"TRIM")
$	    IF F$TYPE(TMP3) .EQS. "INTEGER" THEN GOTO _READ_FILE_LOOP
$	ENDIF
$
$	IF F$LOCATE(":",F$ELEMENT(0," ",RECORD)) .NE. F$LENGTH(F$ELEMENT(0," ",RECORD))
$	THEN
$	    ! we have a directory
$	    LOCAL_DIRECTORY = ""
$	    IF FTP_SERVER_TYPE .EQ. TYPE_UNIX
$	    THEN
$		REMOTE_DIRECTORY = F$ELEMENT(0,":",RECORD)
$		IF F$EXTRACT(0,1,REMOTE_DIRECTORY) .NES. "/"
$		THEN
$		    IF F$EXTRACT(F$LENGTH(REMOTE_ROOT)-1,1,REMOTE_ROOT) .NES. "/" THEN -
		       REMOTE_DIRECTORY = "/" + REMOTE_DIRECTORY
$		    REMOTE_DIRECTORY = REMOTE_ROOT + REMOTE_DIRECTORY
$		ENDIF
$		IF F$EXTRACT(F$LENGTH(REMOTE_DIRECTORY)-1,1,REMOTE_DIRECTORY) -
		   .NES. "/" THEN -
		   REMOTE_DIRECTORY = REMOTE_DIRECTORY + "/"
$	    ELSE
$		REMOTE_DIRECTORY = F$ELEMENT(0," ",RECORD)
$	    ENDIF
$	    IF DEBUG THEN WRITE SYS$ERROR "-Debug- Remote directory now: ", REMOTE_DIRECTORY
$	    ! now we have to find it in our mappings
$	    COUNT = 0
$ _FIND_LOOP: 
$	    IF COUNT .GE. CONFIG_DIR_TOTAL THEN GOTO _EXIT_FIND_LOOP
$	    TMP = F$ELEMENT(0,",",CONFIG_DIRECTORIES_'COUNT')
$	    IF FTP_SERVER_TYPE .EQ. TYPE_UNIX
$	    THEN
$		IF F$EXTRACT(0,1,TMP) .NES. "/"
$		THEN
$		    IF F$EXTRACT(F$LENGTH(REMOTE_ROOT)-1,1,REMOTE_ROOT) .NES. "/" THEN -
		       TMP = "/" + TMP
$		    TMP = REMOTE_ROOT + TMP
$		ENDIF
$	    ELSE
$		IF F$EXTRACT(0,2,TMP) .EQS. "[." THEN -
		   TMP = F$EXTRACT(0,F$LENGTH(REMOTE_ROOT)-1,REMOTE_ROOT) + -
		   F$EXTRACT(1,999,TMP)
$		IF F$EXTRACT(0,1,TMP) .EQS. "[" THEN -
		   TMP = F$ELEMENT(0,"[",REMOTE_ROOT) + TMP
$	    ENDIF
$	    IF DEBUG THEN WRITE SYS$ERROR "-Debug- Remote directory to check for: ", TMP
$	    ENDING = "...]"
$	    IF FTP_SERVER_TYPE .EQ. TYPE_UNIX THEN ENDING = "..."
$	    LE = F$LENGTH(ENDING)
$	    IF F$EXTRACT(F$LENGTH(TMP)-LE,LE,TMP) -
	       .EQS. ENDING
$	    THEN
$		TMP = F$EXTRACT(0,F$LENGTH(TMP)-F$LENGTH(ENDING),TMP)
$		IF TMP .EQS. F$EXTRACT(0,F$LENGTH(TMP),REMOTE_DIRECTORY)
$		THEN
$		    ! we have a mapping
$		    LOCAL_DIRECTORY = F$ELEMENT(1,",",CONFIG_DIRECTORIES_'COUNT')
$		    IF F$EXTRACT(F$LENGTH(LOCAL_DIRECTORY)-4,4,LOCAL_DIRECTORY) .EQS. "...]"
$		    THEN
$			TMP2 = REMOTE_DIRECTORY
$			IF FTP_SERVER_TYPE .EQ. TYPE_UNIX
$			THEN
$			    ALLOWED_CHARACTERS = "ABCDEFGHIKJLMNOPQRSTUVWXYZabcdefghikjlmnopqrstuvwxyz0123456789-_$/."
$			    I = 0
$ LOOP_CHARACTERS1:	    
$			    C = F$EXTRACT(I,1,TMP2)
$			    IF C .EQS. "." THEN -
			       TMP2 = F$EXTRACT(0,I,TMP2) + "_" + F$EXTRACT(I+1,F$LENGTH(TMP2)-I-1,TMP2)
$			    IF C .EQS. "/"
$			    THEN
$				IF I .LT. F$LENGTH(TMP2)-1
$				THEN
$				    TMP2 = F$EXTRACT(0,I,TMP2) + "." + F$EXTRACT(I+1,F$LENGTH(TMP2)-I-1,TMP2)
$				ELSE
$				    TMP2 = F$EXTRACT(0,I,TMP2) + "]"
$				ENDIF
$			    ENDIF
$			    IF ALLOWED_CHARACTERS - C .EQS. ALLOWED_CHARACTERS THEN -
			       TMP2 = F$EXTRACT(0,I,TMP2) + "$" + F$EXTRACT(I+1,F$LENGTH(TMP2)-I-1,TMP2)
$			    I = I + 1
$			    IF I .LT. F$LENGTH(TMP2) THEN GOTO LOOP_CHARACTERS1
$			    TMP2 = TMP2
$			ENDIF
$			IF DEBUG THEN -
			   WRITE SYS$ERROR "-Debug- TMP = """,TMP,""""
$			IF DEBUG THEN -
			   WRITE SYS$ERROR "-Debug- TMP2 = """,TMP2,""""
$			IF DEBUG THEN -
			   WRITE SYS$ERROR "-Debug- LOCAL_DIRECTORY = """,-
			   LOCAL_DIRECTORY,""""
$			LOCAL_DIRECTORY = F$EXTRACT(0,F$LENGTH(LOCAL_DIRECTORY)-4,LOCAL_DIRECTORY) + F$EXTRACT(F$LENGTH(TMP)-(FTP_SERVER_TYPE .EQ. TYPE_UNIX),999,TMP2)
$
$		    ENDIF
$		    IF DEBUG THEN WRITE SYS$ERROR "-Debug- Local directory now: ", LOCAL_DIRECTORY
$		ENDIF
$	    ELSE
$		IF FTP_SERVER_TYPE .EQ. TYPE_UNIX -
		   .AND. F$EXTRACT(F$LENGTH(TMP)-1,1,TMP) .NES. "/" THEN -
		   TMP = TMP + "/"
$		IF TMP .EQS. REMOTE_DIRECTORY
$		THEN
$		    ! we have a mapping
$		    LOCAL_DIRECTORY = F$ELEMENT(1,",",CONFIG_DIRECTORIES_'COUNT') - "..."
$		    IF DEBUG THEN WRITE SYS$ERROR "-Debug- Local directory now: ", LOCAL_DIRECTORY
$		ENDIF
$	    ENDIF
$	    COUNT = COUNT + 1
$	    GOTO _FIND_LOOP
$ _EXIT_FIND_LOOP: 
$	    IF LOCAL_DIRECTORY .EQS. "" 
$	    THEN 
$		WRITE SYS$ERROR "Error - no mapping for remote directory ", REMOTE_DIRECTORY
$		WRITE SYS$ERROR "Error - skipping directory ", REMOTE_DIRECTORY
$	    ELSE
$		IF F$PARSE(LOCAL_DIRECTORY) .EQS. "" THEN CREATE/DIRECTORY/LOG 'LOCAL_DIRECTORY'
$	    ENDIF
$	    GOTO _READ_FILE_LOOP
$	ENDIF ! f$locate
$
$	IF LOCAL_DIRECTORY .EQS. "" THEN GOTO _READ_FILE_LOOP
$
$!
$!!!  Determine if we need to get a file
$!
$
$	IF F$EDIT(F$ELEMENT(0," ",RECORD),"COLLAPSE") .NES. ""
$	THEN
$	    GET_FILE = FALSE
$	    ! assume we have a remote filename
$	    IF FTP_SERVER_TYPE .EQ. TYPE_UNIX
$	    THEN
$		RECORD_C = F$EDIT(RECORD,"COMPRESS,TRIM")
$		REMOTE_PROTECTION = F$ELEMENT(0," ",RECORD_C)
$		REMOTE_LINKS = F$ELEMENT(1," ",RECORD_C)
$		REMOTE_USER = F$ELEMENT(2," ",RECORD_C)
$		REMOTE_GROUP = F$ELEMENT(3," ",RECORD_C)
$		REMOTE_SIZE = F$ELEMENT(4," ",RECORD_C)
$		REMOTE_MONTH = F$ELEMENT(5," ",RECORD_C)
$		REMOTE_DAY = F$ELEMENT(6," ",RECORD_C)
$		REMOTE_YEARORTIME = F$ELEMENT(7," ",RECORD_C)
$		IF REMOTE_YEARORTIME - ":" .EQS. REMOTE_YEARORTIME
$		THEN ! Mon day year
$		    REMOTE_TIMESTAMP = F$CVTIME(REMOTE_DAY+"-"+REMOTE_MONTH+"-"+REMOTE_YEARORTIME+":0:0:0","COMPARISON")
$		ELSE
$		    REMOTE_TIMESTAMP = F$CVTIME(REMOTE_DAY+"-"+REMOTE_MONTH+"-"+F$CVTIME("",,"YEAR")+":"+REMOTE_YEARORTIME,"COMPARISON")
$		    IF REMOTE_TIMESTAMP .GTS. F$CVTIME("+1-","COMPARISON") THEN -
		       REMOTE_TIMESTAMP = F$CVTIME(REMOTE_DAY+"-"+REMOTE_MONTH+"-"+F$CVTIME("-365-",,"YEAR")+":"+REMOTE_YEARORTIME,"COMPARISON")
$		ENDIF
$		FILENAME = RECORD_C - REMOTE_PROTECTION - REMOTE_LINKS -
			   - REMOTE_USER - REMOTE_GROUP - REMOTE_SIZE -
			   - REMOTE_MONTH - REMOTE_DAY - REMOTE_YEARORTIME
$		FILENAME = F$EDIT(FILENAME,"TRIM")
$	    ELSE
$		FILENAME = F$ELEMENT(0," ",RECORD)
$		REMOTE_TIMESTAMP = F$ELEMENT(2," ",RECORD) + " " + F$ELEMENT(3," ",RECORD)
$		IF F$EDIT(REMOTE_TIMESTAMP,"COLLAPSE") .EQS. "" 
$		THEN
$		    ! date is on the next line...
$ _READ_DATE_LINE:  
$		    READ/END_OF_FILE=_EXIT_READ_FILE_LOOP FILE RECORD
$! Watch out.  Some client, like the MadGoat FTP client, will sputter lines
$! like this right in the middle of the directory output:
$!	<226 File transfer Okay; Closing data connection.
$! Fortunately, it is very easy to check, since we expect this line to start
$! with a space
$		    IF F$EXTRACT(0,1,RECORD) .NES. " " THEN -
		       GOTO _READ_DATE_LINE
$		    RECORD = F$EDIT(RECORD,"COMPRESS")
$		    REMOTE_TIMESTAMP = F$ELEMENT(2," ",RECORD) + " " + F$ELEMENT(3," ",RECORD)
$		ENDIF
$		REMOTE_TIMESTAMP = F$CVTIME(REMOTE_TIMESTAMP,"COMPARISON")
$	    ENDIF
$	    IF DEBUG THEN WRITE SYS$ERROR "-Debug- Remote file is: ", FILENAME
$	    IF FTP_SERVER_TYPE .EQ. TYPE_UNIX
$	    THEN
$		IF F$EXTRACT(0,1,REMOTE_PROTECTION) .NES. "-" THEN -
		   GOTO _READ_FILE_LOOP
$	    ELSE
$		IF F$PARSE(FILENAME,,,"TYPE") .EQS. ".DIR" THEN -
		   GOTO _READ_FILE_LOOP
$	    ENDIF
$
$	    OLD_LOCAL_FILENAME = LOCAL_FILENAME
$	    IF FTP_SERVER_TYPE .EQS. TYPE_UNIX
$	    THEN
$		LOCAL_FILENAME = FILENAME
$		IF F$EXTRACT(F$LENGTH(LOCAL_FILENAME)-3,3,LOCAL_FILENAME) .EQS. ".gz"
$		THEN
$		    LOCAL_FILENAME = F$EXTRACT(0,F$LENGTH(LOCAL_FILENAME)-3,LOCAL_FILENAME)
$		    IF LOCAL_FILENAME - "." .EQS. LOCAL_FILENAME
$		    THEN
$			LOCAL_FILENAME = LOCAL_FILENAME + ".gz"
$		    ELSE
$			LOCAL_FILENAME = LOCAL_FILENAME + "-gz"
$		    ENDIF
$		ENDIF
$		IF F$EXTRACT(F$LENGTH(LOCAL_FILENAME)-2,2,LOCAL_FILENAME) .EQS. ".Z"
$		THEN
$		    LOCAL_FILENAME = F$EXTRACT(0,F$LENGTH(LOCAL_FILENAME)-2,LOCAL_FILENAME)
$		    IF LOCAL_FILENAME - "." .EQS. LOCAL_FILENAME
$		    THEN
$			LOCAL_FILENAME = LOCAL_FILENAME + ".Z"
$		    ELSE
$			LOCAL_FILENAME = LOCAL_FILENAME + "_Z"
$		    ENDIF
$		ENDIF
$		ALLOWED_CHARACTERS = "ABCDEFGHIKJLMNOPQRSTUVWXYZabcdefghikjlmnopqrstuvwxyz0123456789-_$."
$		IF DEBUG THEN WRITE SYS$ERROR "-Debug- (1) LOCAL_FILENAME=""",-
		   LOCAL_FILENAME,""""
$		I = 0
$ LOOP_CHARACTERS2: 
$		C = F$EXTRACT(I,1,LOCAL_FILENAME)
$		IF C .EQS. "." -
		   .AND. LOCAL_FILENAME - "." - "." .NES. LOCAL_FILENAME - "." THEN -
		   LOCAL_FILENAME = F$EXTRACT(0,I,LOCAL_FILENAME) + "_" + F$EXTRACT(I+1,F$LENGTH(LOCAL_FILENAME)-I-1,LOCAL_FILENAME)
$		IF ALLOWED_CHARACTERS - C .EQS. ALLOWED_CHARACTERS THEN -
		   LOCAL_FILENAME = F$EXTRACT(0,I,LOCAL_FILENAME) + "$" + F$EXTRACT(I+1,F$LENGTH(LOCAL_FILENAME)-I-1,LOCAL_FILENAME)
$		I = I + 1
$		IF I .LT. F$LENGTH(LOCAL_FILENAME) THEN GOTO LOOP_CHARACTERS2
$		IF DEBUG THEN WRITE SYS$ERROR "-Debug- (2) LOCAL_FILENAME=""",-
		   LOCAL_FILENAME,""""
$		LOCAL_FILENAME = F$PARSE(";",LOCAL_FILENAME,LOCAL_DIRECTORY)
$		IF DEBUG THEN WRITE SYS$ERROR "-Debug- (3) LOCAL_FILENAME=""",-
		   LOCAL_FILENAME,""""
$	    ELSE
$		LOCAL_FILENAME = F$PARSE(";",FILENAME,LOCAL_DIRECTORY)
$	    ENDIF
$	    IF DEBUG THEN WRITE SYS$ERROR "-Debug- Local file is: ", LOCAL_FILENAME
$	    IF OLD_LOCAL_FILENAME .EQS. LOCAL_FILENAME
$	    THEN
$		IF DEBUG THEN WRITE SYS$ERROR "-Debug- Skipping file ", FILENAME, " (it's an older version)"
$		GOTO _READ_FILE_LOOP
$	    ENDIF
$	    IF F$SEARCH(LOCAL_FILENAME) .EQS. ""
$	    THEN
$		! no such file exists, so we need to create directory (if
$		! necessary) and pull the file over
$		IF CONFIG_LAST_TIME_FILE .EQS. "" -
		   .OR. CONFIG_LAST_TIME .LTS. REMOTE_TIMESTAMP THEN GET_FILE = TRUE
$		IF GET_FILE .AND. DEBUG THEN -
		   WRITE SYS$ERROR "-Debug- Copying file #",GET_FILE_COUNT, REMOTE_DIRECTORY, FILENAME, " to ", LOCAL_FILENAME, " (we don't have a copy)."
$	    ELSE
$		! check dates to see if we should get a new copy
$		LOCAL_TIMESTAMP = F$CVTIME(F$FILE(LOCAL_FILENAME,"RDT"),"COMPARISON")
$		IF DEBUG THEN WRITE SYS$ERROR "-Debug- Local file date: ", LOCAL_TIMESTAMP, ", remote file date: ", REMOTE_TIMESTAMP
$		IF LOCAL_TIMESTAMP .LES. REMOTE_TIMESTAMP
$		THEN 
$		    IF CONFIG_LAST_TIME_FILE .EQS. "" -
		       .OR. CONFIG_LAST_TIME .LTS. REMOTE_TIMESTAMP THEN GET_FILE = TRUE
$		    IF GET_FILE .AND. DEBUG THEN -
		       WRITE SYS$ERROR "-Debug- Getting file ",GET_FILE_COUNT, REMOTE_DIRECTORY, FILENAME, " to ", LOCAL_FILENAME," (we have an old copy)."
$		ENDIF
$	    ENDIF
$	    IF GET_FILE 
$	    THEN 
$		GET_FILE_COUNT = GET_FILE_COUNT + 1
$		WRITE OUTFILE "GET """, REMOTE_DIRECTORY, FILENAME, """ ", -
		      LOCAL_FILENAME
$		WRITE REPORT_FILE F$FAO("  !3UL.  !AS!AS -> !AS", -
					GET_FILE_COUNT, -
					REMOTE_DIRECTORY, FILENAME, -
					LOCAL_FILENAME)
$		IF GET_FILE_COUNT .GE. CONFIG_MAXIMUM_FILES THEN GOTO _EXIT_READ_FILE_LOOP				!DM
$	    ENDIF
$	ENDIF
$
$	GOTO _READ_FILE_LOOP
$ _EXIT_READ_FILE_LOOP:	
$	CLOSE FILE
$	WRITE OUTFILE "EXIT"
$	CLOSE OUTFILE
$	CLOSE REPORT_FILE
$
$	IF .NOT. DEBUG .AND. F$SEARCH(TEMPFILE_2) .NES. "" THEN DELETE 'TEMPFILE_2';					!DM
$
$	IF NOT_LOGGED_IN												!DM
$	THEN														!DM
$	    WAIT 00:01:00												!DM
$	    GOTO _RETRY_GEN_FILE_LIST											!DM
$	ENDIF														!DM
$
$	IF GET_FILE_COUNT .EQ. 0											!DM
$	THEN
$	    WRITE SYS$OUTPUT "No files to get.  Exiting."
$	    GOTO _SUBMIT
$	ENDIF
$	WRITE SYS$OUTPUT F$FAO("!/Getting !UL file!%S!/", GET_FILE_COUNT)
$
$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$!  Get the new files from the remote system
$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$
$	IF DEBUG THEN WRITE SYS$ERROR "-Debug- Contents of input file:"
$	IF DEBUG THEN TYPE/OUTPUT=SYS$ERROR 'TEMPFILE_5'								!DM
$
$ _RETRY_FILE_TRANSFER:													!DM
$
$	IF DEBUG THEN WRITE SYS$ERROR "-Debug- Connecting to remote system..."
$	OLD_SYMBOL_SCOPE = F$ENVIRONMENT("SYMBOL_SCOPE")
$	SET SYMBOL/SCOPE=(GLOBAL,LOCAL)
$
$	IF FTP_CLIENT_TYPE .EQ. TYPE_MULTINET 
$	THEN
$	    SET noON
$	    DEFINE/USER_MODE SYS$OUTPUT 'TEMPFILE_2'
$	    'CONFIG_COMMAND' -
		  /NOINITIALIZATION -
		  /TAKE_FILE='TEMPFILE_5'										!DM
$	    STATUS = $STATUS
$	    SET ON
$	ENDIF
$
$	IF FTP_CLIENT_TYPE .EQ. TYPE_MGFTP
$	THEN
$	    SET noON
$	    DEFINE/USER_MODE SYS$OUTPUT 'TEMPFILE_2'
$	    'CONFIG_COMMAND' -
		  'CONFIG_SITE' -
		  /USERNAME="''CONFIG_USERNAME'" -
		  /PASSWORD="''CONFIG_PASSWORD'" -
		  /INITIALIZATION='TEMPFILE_5'										!DM
$	    STATUS = $STATUS
$	    SET ON
$	ENDIF
$
$	IF FTP_CLIENT_TYPE .EQ. TYPE_TCPWARE
$	THEN
$	    SET noON
$	    DEFINE/USER_MODE SYS$OUTPUT 'TEMPFILE_2'
$	    DEFINE/USER FTP_STARTUP 'TEMPFILE_5'									!DM
$	    'CONFIG_COMMAND'
$	    STATUS = $STATUS
$	    SET noON
$	ENDIF
$
$	OPEN/READ FILE 'TEMPFILE_2'
$	NOT_LOGGED_IN = 0												!DM
$															!DM
$ _READ_FILE_TRANSFER_STATUS_LOOP:											!DM
$       READ/END_OF_FILE=_EXIT_FILE_TRANSFER_STATUS_LOOP FILE RECORD							!DM
$	IF F$EDIT(RECORD,"COLLAPSE") .EQS. "" THEN GOTO _READ_FILE_LOOP							!DM
$	IF DEBUG THEN WRITE SYS$ERROR F$FAO("-Debug- Record is: \!AS\", RECORD)						!DM
$	RECORD = F$EDIT(RECORD,"COMPRESS")										!DM
$															!DM
$	IF F$EXTRACT(0,5,RECORD) .EQS. "<530 " -									!DM
	   .OR. F$EXTRACT(0,4,RECORD) .EQS. "530 "									!DM
$	THEN														!DM
$	    NOT_LOGGED_IN = 1												!DM
$	    IF DEBUG THEN WRITE SYS$ERROR "-Debug- Login at remote failed."						!DM
$	    GOTO _EXIT_FILE_TRANSFER_STATUS_LOOP									!DM
$	ENDIF														!DM
$ _EXIT_FILE_TRANSFER_STATUS_LOOP:											!DM
$	CLOSE FILE													!DM
$															!DM
$	IF NOT_LOGGED_IN												!DM
$	THEN														!DM
$	    WAIT 00:01:00												!DM
$	    GOTO _RETRY_FILE_TRANSFER											!DM
$	ENDIF														!DM
$
$	SET SYMBOL/SCOPE=('OLD_SYMBOL_SCOPE')
$
$	IF DEBUG THEN WRITE SYS$ERROR "-Debug- Output from FTP session:"
$	IF DEBUG THEN TYPE/OUTPUT=SYS$ERROR 'TEMPFILE_2'
$
$	IF CONFIG_LAST_TIME_FILE .NES. "" .AND. .NOT. STATUS
$	THEN
$	    OPEN/WRITE FOO 'CONFIG_LAST_TIME_FILE'
$	    WRITE FOO CONFIG_NEXT_TIME
$	    CLOSE FOO
$	ENDIF
$
$	IF CONFIG_MAILTO .NES. ""
$	THEN
$	    IF STATUS
$	    THEN
$		MAIL_SUBJECT = F$FAO("!AS: !UL file!%S transferred to local system", -
				     CONFIG_SITE, GET_FILE_COUNT)
$		MAIL_PN = F$FAO("!AS: !UL file!%S", -
				CONFIG_SITE, GET_FILE_COUNT)
$	    ELSE
$		SHOW SYMBOL STATUS
$		MAIL_SUBJECT = F$FAO("!AS: Following files were not transferred - check logs", -
				     CONFIG_SITE)
$		MAIL_PN = F$FAO("!AS: Failure!!", CONFIG_SITE)
$	    ENDIF
$	    SET noON
$	    MAIL 'TEMPFILE_4' 'CONFIG_MAILTO' -
		 /SUBJECT="''MAIL_SUBJECT'" -
		 /PERSONAL_NAME="''MAIL_PN'"
$	    SET ON
$	ENDIF
$
$!
$!!!  Purge local directories
$!
$	IF NOT_LOGGED_IN .OR. GET_FILE_COUNT .EQ. 0 THEN GOTO _EXIT_PURGE_LOOP						!DM
$	COUNT = 0
$ _PURGE_LOOP: 
$	IF COUNT .GE. CONFIG_DIR_TOTAL THEN GOTO _EXIT_PURGE_LOOP
$	FOO = CONFIG_DIRECTORIES_'COUNT'
$	IF (F$SEARCH(F$PARSE("*.*",F$ELEMENT(1,",",FOO))) .NES. "") THEN PURGE/LOG 'F$ELEMENT(1,",",FOO)'*.*		!DM
$	COUNT = COUNT + 1
$	GOTO _PURGE_LOOP
$_EXIT_PURGE_LOOP:
$
$_SUBMIT:
$	IF CONFIG_SUBMIT_AFTER .NES. "NONE"
$	THEN
$	    SET VERIFY
$	    SUBMIT -
		   /NONOTIFY -
		   /LOG_FILE=FTP_MIRROR.LOG -
		   /PARAMETERS='F$ELEMENT(0,";",CONFIGURATION_FILE)' -
		   /noPRINTER -
		   /QUEUE='CONFIG_QUEUE' -
		   /NAME="FTP_Mirror" -
		   /AFTER="''CONFIG_SUBMIT_AFTER'" -
		   /KEEP -
		   'F$ELEMENT(0,";",F$ENVIRONMENT("PROCEDURE"))' 
$	    SET NOVERIFY
$	ENDIF
$	GOTO _EXIT
$
$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$ _EXIT: 
$	GOSUB _CLEANUP
$	WRITE SYS$OUTPUT "Leaving FTP_Mirror ..."
$	IF F$TYPE(ORIGINAL_PRIV) THEN JUNK = F$SETPRV(ORIGINAL_PRIV)
$	VERIFY = F$VERIFY(VERIFY)
$	EXIT 1
$
$ _NO_CONFIG_FILE: 
$	WRITE SYS$ERROR "Could not find configuration file ",P1
$	WRITE SYS$ERROR "Aborting..."
$	GOTO _EXIT
$ 
$ _ERROR: 
$	ERROR_STATUS = $STATUS
$	WRITE SYS$ERROR "Unexpected error (%X''F$FAO("!XL",ERROR_STATUS)') in FTP_MIRROR.COM"
$	GOSUB _CLEANUP
$	IF F$TYPE(ORIGINAL_PRIV) THEN JUNK = F$SETPRV(ORIGINAL_PRIV)
$	VERIFY = F$VERIFY(VERIFY)
$	EXIT ERROR_STATUS
$
$ _ABORT: 
$	WRITE SYS$ERROR "User aborted FTP_MIRROR.COM"
$	GOTO _EXIT
$
$ _CLEANUP: 
$	CLOSE/NOLOG FILE
$	CLOSE/NOLOG OUTFILE
$	CLOSE/NOLOG REPORT_FILE
$	IF .NOT. DEBUG .AND. F$SEARCH(TEMPFILE_1) .NES. "" THEN -
	   DELETE 'TEMPFILE_1';*
$	IF .NOT. DEBUG .AND. F$SEARCH(TEMPFILE_2) .NES. "" THEN -
	   DELETE 'TEMPFILE_2';*
$	IF .NOT. DEBUG .AND. F$SEARCH(TEMPFILE_3) .NES. "" THEN -
	   DELETE 'TEMPFILE_3';*
$	IF .NOT. DEBUG .AND. F$SEARCH(TEMPFILE_4) .NES. "" THEN -
	   DELETE 'TEMPFILE_4';*
$	IF .NOT. DEBUG .AND. F$SEARCH(TEMPFILE_5) .NES. "" THEN -
	   DELETE 'TEMPFILE_5';*
$	RETURN
================================================================================
Archive-Date: Mon, 17 May 1999 07:35:05 +0200
Date: Mon, 17 May 1999 07:34:47 +0200
Message-ID: <9640-Mon17May1999073447+0200-levitte@lp.se>
From: Richard Levitte - VMS Whacker <levitte@lp.se>
Reply-To: bugs@free.lp.se, levitte@lp.se
To: bugs@free.lp.se, SYSTEM@wolverine.acornsw.com
In-Reply-To: <990516101029.22800d1c@wolverine.acornsw.com> (SYSTEM@wolverine.acornsw.com)
Subject: Re: Some more tweaks to ftp_mirror...
MIME-Version: 1.0
Content-Type: Text/Plain; Charset=ISO-8859-1
Content-Transfer-Encoding: 8bit

	I also force a retry when the login fails for any ftp processing.
	At the moment, it waits one minute and retries indefinately.  This
	guarantees that a file transfer actually happens each time the
	command procedure is run rather than relying on the batch job to
	get through the "next" time it is run.

I don't think I'll include that part, OR I'll make it optional through a
logical name, turned off by default.

The reason is that I don't want to turn FTP_MIRROR into a possible
resoucre hog, which is what may happen if you have several such processes
at the same time.  Having it at least turned off by default will require
that anyone who turns it on will have to knowwhat eh or she is doing.

-- 
R Levitte, Levitte Programming;  Spannv. 38, I;  S-168 35  Bromma;  SWEDEN
    Tel: +46-8-26 52 47; Cell: +46-708-26 53 44; Fax: +46-708-26 53 88
  PGP key fingerprint = 35 3E 6C 9E 8C 97 85 24  BD 9F D1 9E 8F 75 23 6B
 http://richard.levitte.org/pubkey2.asc for my public key.  levitte@lp.se

          "price, performance, quality.  Choose any two you like"
================================================================================
Archive-Date: Fri, 28 May 1999 03:28:35 +0200
Date: Thu, 27 May 1999 21:28:19 -0400
From: system@quick.acornsw.com
Reply-To: bugs@free.lp.se, system@quick.acornsw.com
To: bugs@free.lp.se
Message-ID: <009D8C10.4DE218C3.1@quick.acornsw.com>
Subject: This pretty much wraps up my list of changes for ftp_mirror.  the template files follows.
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

=24	VERIFY =3D 'F=24VERIFY(F=24TRNLNM(=22FTP_MIRROR_VERIFY=22))'
=24	SET =3D =22SET=22
=24	SET SYMBOL/SCOPE=3D(noGLOBAL,noLOCAL)
=24	GOTO _START_FTP_MIRROR

DESCRIPTION:

  Automates mirroring a remote FTP site.

PARAMETERS:

  P1 - configuration filename

REQUIREMENTS:

Due to the different commands used by FTP Clients, only a few FTP Clients a=
re=20
supported.  Due to the different output generated by different FTP Servers,
parsing routines have only been written for a few FTP Servers.

  o one of the following FTP Clients (on your system):
      - MultiNet=20
      - MadGoat FTP
      - TCPware

  o mirrored against one of the following FTP Servers (on the remote system=
):
      - MultiNet
      - MadGoat FTP
      - TCPware
      - Unix

 =3D----------------------------------------------------------------------=
=3D

Copyright =A9 1994 by Dan Wing.
Copyright =A9 1997 by MadGoat Software, Inc.
Copyright =A9 1998 by Richard Levitte.
Copyright =A9 1999 by Dick Munroe

This code may be freely distributed and modified for no commercial gain
as long as this copyright notice is retained.  This program is supplied
'as-is', and with no warranty.

Created September 21, 1994, by Dan Wing, TGV <dwing=40Cisco.com>
Hacked a lot by Richard Levitte <richard=40levitte.org>
Features added by Hunter Goatley <goathunter=40madgoat.com>

Please send bug reports to <bugs=40free.lp.se>.

 =3D----------------------------------------------------------------------=
=3D

  REVERSE CHRONOLOGICAL MODIFICATION HISTORY
  ------------------------------------------

  T0.8-10 27-May-1999  Dick Munroe <munroeacornsw.com>
     The template says that PROCESS_SOFTWARE is a valid FTP SERVER type
     and the command procedure chokes on it.
     Some FTP servers incorrectly use 53x to indicate the need for further
     information during a log in.  The fix is to look for the USER username
     line in the log BEFORE looking for a 530.
     Add a type line that overrides the transfer type as necessary.
     Parse the FTP output to generate the report file.

  T0.8-9  12-May-1999  Dick Munroe <munroe=40acornsw.com>
     Fix a bug that got triggered by seeing =22=24=22 debugging records in=
 the
     FTP log file when getting a directory listing.  While I was at it,
     I also force a retry when the login fails for any ftp processing.
     At the moment, it waits one minute and retries indefinately.  This
     guarantees that a file transfer actually happens each time the
     command procedure is run rather than relying on the batch job to
     get through the =22next=22 time it is run.

  T0.8-8  16-APR-1999  Dick Munroe <munroe=40acornsw.com>
     There is at least one case I'm running across in which the file name
     reported by LS isn't the file name actually on the server.  Therefore,
     I'm turning exit-on-error OFF once the file transfer portion of the
     procedure starts.  I don't like this solution, but it's what I have at
     the moment.

  T0.8-7  15-APR-1999  Dick Munroe <munroe=40acornsw.com>
     The code that picks up the LS options for unix servers needs to supply
     the options when the directory is fully enumerated.  This avoids
     a bug when enumerating directories (or files) which are actually
     symbolic links on the server.

  T0.8-6  14-APR-1999  Dick Munroe <munroe=40acornsw.com>
     The invocation of FTP that gets the directory listings assumed that
     any error coming back from FTP meant that things were not supposed
     to work.  I have disabled this test and as a result the failure to
     log in is properly detected and the job resubmitted, however this
     may lead to other problems downstream.  I suspect that a somewhat
     more sophisticated error recovery scheme will need to be evolved.
     If things fail due to either a login failure, or other issue, the
     directory structures don't have to be purged.

  T0.8-5  13-APR-1999  Dick Munroe <munroe=40acornsw.com>
     Some FTP servers have a time limit on them.  I'm adding a
     MAXIMUM_FILES parameter to the configuration that allows some
     control over the load placed on the server.  Once the maximum
     number of files have been transferred, then the job is rescheduled.
     Frequently FTP servers are busy and you can't get logged in, so
     check for the 530 status and reschedule the job if that happens.
     To avoid spurious errors, check to see if directories contain
     files during the purge processing.

  T0.8-4  09-APR-1999  Dick Munroe <munroe=40acornsw.com>
     Using a multinet FTP client requires that the VERBOSE mode of
     FTP transfer be used.  This, in turn, left stuff in the log files
     that, for some reason, the command procedure didn't know how to
     process.  There were similar issues for hooking up to aol.com, so
     now this procedure seems to work with all the ftp sites that I'm
     using regularly.

  T0.8-3  23-APR-1998  Richard Levitte <richard=40levitte.org>
     A small bug corrected.  REMOTE_DIRECTORY wasn't set correctly
     under some circumstances.  Under others, it was set when it
     really shoulden't.

  T0.8-2  20-APR-1998  Richard Levitte <richard=40levitte.org>
     Worked around the fact that the MadGoat client (and perhaps others)
     sputters lines like the following one right in the middle of the
     directory output:

	<226 File transfer Okay; Closing data connection.

  T0.8-1  07-APR-1998  Richard Levitte <richard=40levitte.org>
     Corrected a small bug that caused a erroneous download to be made
     for a serie of Unix directories.  Of course, if =60ls' could output
     the directory name for the first directory listed, we wouldn't
     have these problems...

  T0.8	   6-APR-1998	Hunter Goatley <goathunter=40MadGoat.com>
     Explicitly enable or disable passive mode according to file setting.

  T0.7    06-APR-1998  Richard Levitte <richard=40levitte.org>
     Merged in changes that Hunter Goatley <goathunter=40madgoat.com>
     added in 27-MAY-1997.  His comment was:

	Updated for newer MGFTP releases and for TCPware.

  T0.6    05-APR-1998  Richard Levitte <richard=40levitte.org>
     - Now understands the output from a Unix FTP server, and can
       download files from it.  ALL files are currently downloaded in
       Image mode.
     - An added feature is that =22/...=22 at the end of a Unix directory
       specification means the same thing as the standard VMS
       ellipsis.
     - CAUTION:  Unix file specifications can ONLY be used as the
       first argument of the DIRECTORY configuratoin parameter.
     - Name conversion for Unix file specifications is done according
       to the following rules:
         1. An ending =22.gz=22 is changed to =22-gz=22 if there is another
            dot in the file name.
         2. And ending =22.Z is changed to =22_Z=22 if there is another dot
            in the file name.
         3. All remaining dots except the last are changed to
            underscores, except the last one in a file name.
         4. All other characters that are not legal in a VMS file name
            are changed to dollars.
     - A hack that saves the current time in a file has been added.
       If that file is found and there is a time specification in it,
       it is used to limit the download of file to those newer than
       that time.  The name of this file is configurable.
     - A mail address to send logs to is configurable.

  T0.5	  02-APR-1998  Richard Levitte <richard=40levitte.org>
     Many hacks, among other supporting elipsis in directory specs,
     and support for the Process Software FTP server.  Unfortunatelly,
     I haven't made many notes of my changes.

  T0.0    25-OCT-1994  Dan Wing, wing=40tgv.com
     Initial release.

=24=21
=24=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21
=24
=24 _START_FTP_MIRROR:=20
=24
=24	ON WARNING THEN GOTO _ERROR
=24	ON CONTROL_Y THEN GOTO _ABORT
=24
=24	FTP_MIRROR_VERSION =3D =22T0.8-3 BETA TEST Prerelease 10=22								=21D=
M
=24	WRITE SYS=24OUTPUT F=24FAO(=22=21/FTP_Mirror, version =21AS.=21/Started=
 by =21AS on node =21AS on =21AS, =21AS =218AS.=22, -
			       FTP_MIRROR_VERSION, -
			       F=24EDIT(F=24GETJPI(0,=22USERNAME=22),=22TRIM=22), -
			       F=24GETSYI(=22NODENAME=22), -
			       F=24CVTIME(,,=22WEEKDAY=22), -
			       F=24CVTIME(,=22ABSOLUTE=22,=22DATE=22), -
			       F=24CVTIME(,,=22TIME=22))
=24
=24	TRUE =3D 1
=24	FALSE =3D 0
=24	DEBUG =3D FALSE
=24	IF F=24TRNLNM(=22FTP_MIRROR_DEBUG=22) THEN DEBUG =3D TRUE
=24	IF DEBUG THEN WRITE SYS=24ERROR =22FTP_Mirror debugging enabled.=22
=24
=24=21 setup defaults.  These can be overridden in the configuration file
=24
=24	CONFIG_FTP_CLIENT           =3D =22MadGoat FTP=22
=24	CONFIG_COMMAND              =3D =22FTP=22
=24	CONFIG_FTP_SERVER           =3D =22MadGoat FTP=22
=24	CONFIG_SITE                 =3D =22=22
=24	CONFIG_USERNAME             =3D =22anonymous=22
=24	IF F=24TRNLNM(=22UCX=24INET_HOST=22) .NES. =22=22 THEN CONFIG_PASSWORD=
 =3D =22mirror=40=22 + F=24TRNLNM(=22UCX=24INET_HOST=22)
=24	IF F=24TRNLNM(=22MULTINET_HOST_NAME=22) .NES. =22=22 THEN CONFIG_PASSWO=
RD =3D =22mirror=40=22 + F=24TRNLNM(=22MULTINET_HOST_NAME=22)
=24	CONFIG_PASSIVE              =3D FALSE
=24	CONFIG_SUBMIT_AFTER         =3D =22+12:00:00=22
=24	CONFIG_QUEUE                =3D =22SYS=24BATCH=22
=24	CONFIG_FILE_TRANSFER        =3D =22VMS=22
=24	CONFIG_LAST_TIME_FILE       =3D =22=22
=24	CONFIG_MAILTO               =3D =22=22
=24	CONFIG_MAXIMUM_FILES	    =3D %X7FFFFFFF									=21DM
=24	CONFIG_TYPE_TOTAL	    =3D 0											=21DM
=24
=24	VALID_CONFIGURATION =3D TRUE           =21 assume the best
=24
=24	TEMPFILE_1 =3D =22SYS=24SCRATCH:FTP_MIRROR_1_=22 + F=24GETJPI(0,=22PID=
=22) + =22.TMP=22
=24	TEMPFILE_2 =3D =22SYS=24SCRATCH:FTP_MIRROR_2_=22 + F=24GETJPI(0,=22PID=
=22) + =22.TMP=22
=24	TEMPFILE_3 =3D =22SYS=24SCRATCH:FTP_MIRROR_3_=22 + F=24GETJPI(0,=22PID=
=22) + =22.TMP=22
=24	TEMPFILE_4 =3D =22SYS=24SCRATCH:FTP_MIRROR_4_=22 + F=24GETJPI(0,=22PID=
=22) + =22.TMP=22
=24	TEMPFILE_5 =3D =22SYS=24SCRATCH:FTP_MIRROR_5_=22 + F=24GETJPI(0,=22PID=
=22) + =22.TMP=22
=24
=24	CONFIG_LAST_TIME =3D =22=22
=24	CONFIG_DIR_TOTAL =3D 0
=24
=24	TYPE_MULTINET =3D 1
=24	TYPE_MGFTP    =3D 2
=24	TYPE_TCPWARE  =3D 3
=24	TYPE_UNIX     =3D 128
=24	TYPE_OTHER    =3D 255
=24
=24	IF P1 .EQS. =22=22 THEN P1 =3D =22FTP_MIRROR.DAT=22
=24=21 make sure CONFIGURATION_FILE contains a full path, but also make sur=
e
=24=21 you get the right directory.  Guess what F=24PARSE does to non-conce=
aled
=24=21 multivalued logical names.  It's not a pretty sight.  --  Richard Le=
vitte
=24	CONFIGURATION_FILE =3D F=24SEARCH(P1)
=24	IF CONFIGURATION_FILE .EQS. =22=22 THEN GOTO _NO_CONFIG_FILE
=24	GOSUB _CLEANUP
=24
=24=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21
=24	OPEN/READ/ERROR=3D_ERROR FILE 'CONFIGURATION_FILE'
=24 _CONFIG_LOOP:=09
=24	READ/END_OF_FILE=3D_EXIT_CONFIG_LOOP/ERROR=3D_ERROR FILE RECORD
=24	RECORD =3D F=24EDIT(RECORD,=22COMPRESS,UNCOMMENT=22)
=24	IF RECORD .EQS. =22=22 THEN GOTO _CONFIG_LOOP
=24
=24	PARA1 =3D F=24EDIT(F=24ELEMENT(0,=22 =22,RECORD),=22UPCASE=22)
=24	PARA2 =3D F=24ELEMENT(1,=22 =22,RECORD)
=24	PARA3 =3D F=24ELEMENT(2,=22 =22,RECORD)
=24 =20
=24	VALID_RECORD =3D FALSE
=24
=24	IF PARA1 .EQS. =22SITE=22
=24	THEN
=24	    CONFIG_SITE =3D PARA2
=24	    VALID_RECORD =3D TRUE
=24	ENDIF
=24
=24	IF PARA1 .EQS. =22USERNAME=22
=24	THEN
=24	    CONFIG_USERNAME =3D PARA2
=24	    VALID_RECORD =3D TRUE
=24	ENDIF
=24
=24	IF PARA1 .EQS. =22PASSWORD=22
=24	THEN
=24	    CONFIG_PASSWORD =3D PARA2
=24	    VALID_RECORD =3D TRUE
=24	ENDIF
=24
=24	IF PARA1 .EQS. =22DIRECTORY=22
=24	THEN
=24	    CONFIG_DIRECTORIES_'CONFIG_DIR_TOTAL' =3D PARA2 + =22,=22 + PARA3
=24	    CONFIG_DIR_TOTAL =3D CONFIG_DIR_TOTAL + 1
=24	    VALID_RECORD =3D TRUE
=24	ENDIF
=24
=24	IF PARA1 .EQS. =22COMMAND=22
=24	THEN
=24	    CONFIG_COMMAND =3D F=24EXTRACT(F=24LOCATE(=22 =22,RECORD)+1,-1,RECO=
RD)
=24	    VALID_RECORD =3D TRUE
=24	ENDIF
=24
=24	IF PARA1 .EQS. =22PASSIVE=22
=24	THEN
=24	    CONFIG_PASSIVE =3D PARA2
=24	    VALID_RECORD =3D TRUE
=24	ENDIF
=24
=24	IF PARA1 .EQS. =22PRIV=22
=24	THEN
=24	    ORIGINAL_PRIV =3D F=24SETPRV(PARA2)
=24	    IF .NOT. F=24PRIVILEGE(PARA2) THEN WRITE SYS=24OUTPUT =22%%Warning=
 - not all requested privileges are authorized.=22
=24	    VALID_RECORD =3D TRUE
=24	ENDIF
=24
=24	IF PARA1 .EQS. =22SUBMIT_AFTER=22
=24	THEN
=24	    CONFIG_SUBMIT_AFTER =3D F=24EDIT(=22''PARA2' ''PARA3'=22,=22TRIM=22=
)
=24	    IF F=24EDIT(PARA2,=22UPCASE=22) .EQS. =22NONE=22 -
	       .OR. F=24EDIT(PARA3,=22UPCASE=22) .EQS. =22ONE=22 THEN -
	       CONFIG_SUBMIT_AFTER =3D =22NONE=22
=24	    VALID_RECORD =3D TRUE
=24	ENDIF
=24
=24	IF PARA1 .EQS. =22BATCH_QUEUE=22
=24	THEN
=24	    CONFIG_QUEUE =3D PARA2
=24	    VALID_RECORD =3D TRUE
=24	ENDIF
=24
=24	IF PARA1 .EQS. =22FTP_CLIENT=22
=24	THEN
=24	    CONFIG_FTP_CLIENT =3D F=24EDIT(PARA2,=22UPCASE=22)
=24	    IF CONFIG_FTP_CLIENT .EQS. =22MULTINET=22=20
=24	    THEN=20
=24		CONFIG_FTP_CLIENT =3D =22MultiNet=22
=24		CONFIG_COMMAND =3D =22MULTINET FTP=22
=24		VALID_RECORD =3D TRUE
=24	    ENDIF
=24	    IF CONFIG_FTP_CLIENT .EQS. =22MADGOAT=22 -
	       .OR. CONFIG_FTP_CLIENT .EQS. =22MADGOAT_FTP=22
=24	    THEN=20
=24		CONFIG_FTP_CLIENT =3D =22MadGoat FTP=22
=24		CONFIG_COMMAND =3D =22FTP=22
=24		VALID_RECORD =3D TRUE
=24	    ENDIF
=24	    IF (CONFIG_FTP_CLIENT .EQS. =22TCPWARE=22) .OR. (CONFIG_FTP_CLIENT=
 .EQS. =22PROCESS_SOFTWARE=22)			=21DM
=24	    THEN
=24		CONFIG_FTP_CLIENT =3D =22TCPware=22
=24		CONFIG_COMMAND =3D =22FTP=22
=24		VALID_RECORD =3D TRUE
=24	    ENDIF
=24	ENDIF
=24
=24	IF PARA1 .EQS. =22FTP_SERVER=22
=24	THEN
=24	    CONFIG_FTP_SERVER =3D F=24EDIT(PARA2,=22UPCASE=22)
=24	    IF CONFIG_FTP_SERVER .EQS. =22MULTINET=22 THEN -
	       CONFIG_FTP_SERVER =3D =22MultiNet=22
=24	    IF CONFIG_FTP_SERVER .EQS. =22MADGOAT=22 -
	       .OR. CONFIG_FTP_SERVER .EQS. =22MADGOAT_FTP=22 -
	       THEN CONFIG_FTP_SERVER =3D =22MadGoat FTP=22
=24	    IF (CONFIG_FTP_SERVER .EQS. =22TCPWARE=22) .OR. (CONFIG_FTP_SERVER=
 .EQS. =22PROCESS_SOFTWARE=22) THEN -		=21DM
	       CONFIG_FTP_SERVER =3D =22TCPware=22
=24	    IF CONFIG_FTP_SERVER .EQS. =22UNIX=22 THEN -
	       CONFIG_FTP_SERVER =3D =22Unix=22
=24	    VALID_RECORD =3D TRUE
=24	ENDIF
=24
=24	IF PARA1 .EQS. =22FILE_TRANSFER=22
=24	THEN
=24	    CONFIG_FILE_TRANSFER =3D F=24EDIT(PARA2,=22UPCASE=22)
=24	    VALID_RECORD =3D TRUE
=24	ENDIF
=24
=24	IF PARA1 .EQS. =22LAST_TIME_FILE=22
=24	THEN
=24	    CONFIG_LAST_TIME_FILE =3D F=24EDIT(PARA2,=22UPCASE=22)
=24	    IF F=24SEARCH(CONFIG_LAST_TIME_FILE) .NES. =22=22
=24	    THEN
=24		OPEN/READ FOO 'CONFIG_LAST_TIME_FILE'
=24		READ FOO CONFIG_LAST_TIME
=24		CONFIG_LAST_TIME =3D F=24CVTIME(CONFIG_LAST_TIME,=22COMPARISON=22)
=24		CLOSE FOO
=24	    ELSE
=24		CONFIG_LAST_TIME =3D =221-JAN-1900=22
=24	    ENDIF
=24	    =21 We remove oen day just to make sure we get all files in
=24	    =21 spite of all kinds of timezone junk.  So we might get
=24	    =21 duplicates at times...  So what?
=24	    CONFIG_NEXT_TIME =3D F=24CVTIME(=22-1-=22,=22ABSOLUTE=22)
=24	    VALID_RECORD =3D TRUE
=24	ENDIF
=24
=24	IF PARA1 .EQS. =22MAILTO=22
=24	THEN
=24	    CONFIG_MAILTO =3D F=24EDIT(PARA2,=22UPCASE=22)
=24	    VALID_RECORD =3D TRUE
=24	ENDIF
=24
=24	IF PARA1 .EQS. =22MAXIMUM_FILES=22											=21DM
=24	THEN														=21DM
=24	    CONFIG_MAXIMUM_FILES =3D F=24INTEGER(F=24EDIT(PARA2,=22UPCASE=22))=
							=21DM
=24	    VALID_RECORD =3D TRUE												=21DM
=24	ENDIF														=21DM
=24															=21DM
=24	IF PARA1 .EQS. =22TYPE=22												=21DM
=24	THEN														=21DM
=24	    CONFIG_TYPE_'CONFIG_TYPE_TOTAL' =3D PARA2									=21DM
=24	    CONFIG_TYPE_TRANSFER_'CONFIG_TYPE_TOTAL' =3D PARA3								=21DM
=24	    IF (PARA3 .EQS. =22ASCII=22) .OR. -										=21DM
	       (PARA3 .EQS. =22BINARY=22) .OR. -										=21DM
	       (PARA3 .EQS. =22VMS=22)											=21DM
=24	    THEN													=21DM
=24		CONFIG_TYPE_TOTAL =3D CONFIG_TYPE_TOTAL + 1								=21DM
=24		VALID_RECORD =3D TRUE											=21DM
=24	    ENDIF													=21DM
=24	ENDIF														=21DM
=24															=21DM
=24	IF .NOT. VALID_RECORD
=24	THEN
=24	    WRITE SYS=24OUTPUT =22%%Warning - invalid configuration file record=
 =5C=22, RECORD, =22=5C=22
=24	    VALID_CONFIGURATION =3D FALSE
=24	ENDIF
=24
=24	GOTO _CONFIG_LOOP
=24 =20
=24=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21
=24 _EXIT_CONFIG_LOOP:=20
=24	CLOSE FILE
=24
=24	IF .NOT. VALID_CONFIGURATION
=24	THEN
=24	    WRITE SYS=24OUTPUT =22Error in configuration file.=22
=24	    GOTO _EXIT
=24	ENDIF
=24
=24	FTP_CLIENT_TYPE =3D TYPE_OTHER
=24	IF CONFIG_FTP_CLIENT .EQS. =22MultiNet=22 THEN -
	   FTP_CLIENT_TYPE =3D TYPE_MULTINET
=24	IF CONFIG_FTP_CLIENT .EQS. =22MadGoat FTP=22 THEN -
	   FTP_CLIENT_TYPE =3D TYPE_MGFTP
=24	IF CONFIG_FTP_CLIENT .EQS. =22TCPware=22 THEN -
	   FTP_CLIENT_TYPE =3D TYPE_TCPWARE
=24
=24	FTP_SERVER_TYPE =3D TYPE_OTHER
=24	IF CONFIG_FTP_SERVER .EQS. =22MultiNet=22 THEN -
	   FTP_SERVER_TYPE =3D TYPE_MULTINET
=24	IF CONFIG_FTP_SERVER .EQS. =22MadGoat FTP=22 THEN -
	   FTP_SERVER_TYPE =3D TYPE_MGFTP
=24	IF CONFIG_FTP_SERVER .EQS. =22TCPware=22 THEN -
	   FTP_SERVER_TYPE =3D TYPE_TCPWARE
=24	IF CONFIG_FTP_SERVER .EQS. =22Unix=22 THEN -
	   FTP_SERVER_TYPE =3D TYPE_UNIX
=24
=24	WRITE SYS=24OUTPUT =22=22
=24	WRITE SYS=24OUTPUT F=24FAO(=22  =2140AS =21AS=22,=22Remote site:=22,CON=
FIG_SITE)
=24	WRITE SYS=24OUTPUT F=24FAO(=22  =2140AS =21AS=22,=22Remote username:=22=
,CONFIG_USERNAME)
=24	WRITE SYS=24OUTPUT F=24FAO(=22  =2140AS =21AS=22,=22Remote password:=22=
,CONFIG_PASSWORD)
=24	WRITE SYS=24OUTPUT F=24FAO(=22  =2140AS =21AS=22,=22FTP server:=22,CONF=
IG_FTP_SERVER)
=24	WRITE SYS=24OUTPUT =22=22
=24	WRITE SYS=24OUTPUT =22  Directories:  (remote)                (local)=
=22
=24
=24	COUNT =3D 0
=24 _DISPLAY_LOOP_1:=20
=24	IF COUNT .GE. CONFIG_DIR_TOTAL THEN GOTO _EXIT_DISPLAY_LOOP_1
=24	WRITE SYS=24OUTPUT F=24FAO(=22    =2133AS =2135AS=22, -
			       F=24ELEMENT(0,=22,=22,CONFIG_DIRECTORIES_'COUNT'), -
			       F=24ELEMENT(1,=22,=22,CONFIG_DIRECTORIES_'COUNT'))
=24	IF F=24PARSE(F=24ELEMENT(1,=22,=22,CONFIG_DIRECTORIES_'COUNT'),,,,=22SY=
NTAX_ONLY=22) .EQS. =22=22
=24	THEN
=24	    WRITE SYS=24ERROR F=24FAO(=22=215** Local directory specification (=
above) is invalid VMS syntax.=22)
=24	    VALID_CONFIGURATION =3D FALSE
=24	ENDIF
=24	COUNT =3D COUNT + 1
=24	GOTO _DISPLAY_LOOP_1
=24 _EXIT_DISPLAY_LOOP_1:=20
=24															=21DM
=24	WRITE SYS=24OUTPUT =22=22												=21DM
=24	WRITE SYS=24OUTPUT =22  Type Mappings:(extension)             (Transfer=
 type)=22					=21DM
=24															=21DM
=24	COUNT =3D 0													=21DM
=24 _TYPE_DISPLAY_LOOP_1:													=21DM
=24	IF COUNT .GE. CONFIG_TYPE_TOTAL THEN GOTO _EXIT_TYPE_DISPLAY_LOOP_1			=
			=21DM
=24	WRITE SYS=24OUTPUT F=24FAO(=22    =2133AS =2110AS=22, -									=21DM
			       CONFIG_TYPE_'COUNT', -									=21DM
			       CONFIG_TYPE_TRANSFER_'COUNT')								=21DM
=24	COUNT =3D COUNT + 1												=21DM
=24	GOTO _TYPE_DISPLAY_LOOP_1											=21DM
=24 _EXIT_TYPE_DISPLAY_LOOP_1:												=21DM
=24															=21DM
=24	WRITE SYS=24OUTPUT =22=22
=24	WRITE SYS=24OUTPUT F=24FAO(=22  =2140AS =21AS=22,=22FTP client:=22,CONF=
IG_FTP_CLIENT)
=24	WRITE SYS=24OUTPUT F=24FAO(=22  =2140AS =21AS=22,=22DCL command:=22,CON=
FIG_COMMAND)
=24	WRITE SYS=24OUTPUT F=24FAO(=22  =2140AS =21AS=22,=22File transfer mode:=
=22,CONFIG_FILE_TRANSFER)
=24	IF CONFIG_PASSIVE
=24	THEN
=24	    CONFIG_PASSIVE =3D TRUE
=24	    WRITE SYS=24OUTPUT F=24FAO(=22  =2140AS =21AS=22,=22Passive mode:=
=22,=22Yes=22)
=24	ELSE
=24	    CONFIG_PASSIVE =3D FALSE
=24	    WRITE SYS=24OUTPUT F=24FAO(=22  =2140AS =21AS=22,=22Passive mode:=
=22,=22No=22)
=24	ENDIF
=24	IF CONFIG_LAST_TIME .NES. =22=22 THEN -
	   WRITE SYS=24OUTPUT F=24FAO(=22  =2140AS =21AS=22,-
				  =22Only get files created after:=22,-
				  CONFIG_LAST_TIME)
=24	WRITE SYS=24OUTPUT F=24FAO(=22  =2140AS =21AS=22,=22Resubmit after:=22,=
-
			       CONFIG_SUBMIT_AFTER)
=24	IF CONFIG_SUBMIT_AFTER .NES. =22NONE=22 THEN -
	   WRITE SYS=24OUTPUT F=24FAO(=22  =2140AS =21AS=22,=22Batch queue:=22,CON=
FIG_QUEUE)
=24	IF CONFIG_MAILTO .NES. =22=22 THEN -
	   WRITE SYS=24OUTPUT F=24FAO(=22  =2140AS =21AS=22,-
				  =22Mail reports to:=22,-
				  CONFIG_MAILTO)
=24	IF CONFIG_MAXIMUM_FILES .NE. %X7FFFFFFF THEN -									=21DM
	   WRITE SYS=24OUTPUT F=24FAO(=22  =2140AS =21UL=22,-									=21DM
				  =22Maximum number of files to transfer:=22,-						=21DM
				  CONFIG_MAXIMUM_FILES)									=21DM
=24	WRITE SYS=24OUTPUT =22=22
=24
=24	IF CONFIG_SITE .EQS. =22=22 .OR. CONFIG_USERNAME .EQS. =22=22 .OR. -
	   CONFIG_PASSWORD .EQS. =22=22 .OR. CONFIG_DIRECTORIES_0 .EQS. =22=22 .OR=
. -
	   CONFIG_SUBMIT_AFTER .EQS. =22=22
=24	THEN
=24	    WRITE SYS=24ERROR =22Missing required configuration setting; exitin=
g.=22
=24	    WRITE SYS=24ERROR =22Check for missing username, directory, passwor=
d, or submit-after.=22
=24	    GOTO _EXIT
=24	ENDIF
=24
=24	IF FTP_CLIENT_TYPE .NE. TYPE_MULTINET -
	   .AND. FTP_CLIENT_TYPE .NE. TYPE_MGFTP -
	   .AND. FTP_CLIENT_TYPE .NE. TYPE_TCPWARE
=24	THEN
=24	    WRITE SYS=24ERROR =22Invalid FTP Client -- only =5CMULTINET=5C, =5C=
TCPWARE=5C, or =5CMADGOAT FTP=5C are allowed.=22
=24	    GOTO _EXIT
=24	ENDIF
=24
=24=21=24	IF CONFIG_PASSIVE .AND. (FTP_CLIENT_TYPE .EQ. TYPE_MGFTP .OR. -
=24=21				 FTP_SERVER_TYPE .EQ. TYPE_MGFTP)
=24=21=24	THEN
=24=21=24	    WRITE SYS=24ERROR =22PASSIVE isn't supported by MadGoat FTP c=
lient or server.=22
=24=21=24	    GOTO _EXIT
=24=21=24	ENDIF
=24
=24	IF FTP_SERVER_TYPE .NE. TYPE_MULTINET -
	   .AND. FTP_SERVER_TYPE .NE. TYPE_MGFTP -
	   .AND. FTP_SERVER_TYPE .NE. TYPE_TCPWARE -
	   .AND. FTP_SERVER_TYPE .NE. TYPE_UNIX
=24	THEN
=24	    WRITE SYS=24ERROR =22Invalid FTP Server.  Only MultiNet, MadGoat FT=
P, TCPware, and UNIX are supported.=22
=24	    GOTO _EXIT
=24	ENDIF
=24
=24	IF .NOT. VALID_CONFIGURATION
=24	THEN
=24	    WRITE SYS=24ERROR =22Invalid configuration -- see above reason=22
=24	    GOTO _EXIT
=24	ENDIF
=24
=24=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21
=24
=24	IF F=24MODE() .EQS. =22INTERACTIVE=22
=24	THEN
=24	    READ SYS=24COMMAND CHECK/PROMPT=3D=22Ready =5BY=5D? =22/END_OF_FILE=
=3D_ABORT
=24	ELSE
=24	    CHECK :=3D Y
=24	ENDIF
=24
=24	IF .NOT. CHECK .AND. CHECK .NES. =22=22 THEN GOTO _ABORT
=24
=24=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21
=24
=24
=24
=24=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21
=24
=24	IF CONFIG_SUBMIT_AFTER .NES. =22NONE=22 .AND. F=24MODE() .NES. =22BATCH=
=22
=24	THEN
=24	    GOTO _SUBMIT
=24	ENDIF
=24         =20
=24
=24=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21
=24=21  Obtain the list of files on the remote system
=24=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21
=24
=24	OPEN/WRITE FILE 'TEMPFILE_1'
=24	COUNT =3D 0
=24
=24	IF FTP_CLIENT_TYPE .EQ. TYPE_MULTINET
=24	THEN
=24	    IF CONFIG_PASSIVE
=24	    THEN WRITE FILE =22PASSIVE ON=22
=24	    ELSE WRITE FILE =22PASSIVE OFF=22
=24	    ENDIF
=24	    WRITE FILE =22EXIT-ON-ERROR ON=22
=24	    WRITE FILE =22PROMPT-FOR-MISSING-ARGUMENTS OFF=22
=24	    WRITE FILE =22VERBOSE=22											=21DM
=24	    IF DEBUG THEN WRITE FILE =22STATISTICS=22
=24	    WRITE FILE =22CONNECT =22, CONFIG_SITE
=24	    WRITE FILE =22USER =22, CONFIG_USERNAME
=24	    WRITE FILE =22PASS =22, CONFIG_PASSWORD
=24	    IF CONFIG_FILE_TRANSFER .EQS. =22VMS=22
=24	    THEN
=24		WRITE FILE =22STRUCTURE VMS=22
=24	    ELSE
=24		WRITE FILE =22TYPE =22, CONFIG_FILE_TRANSFER
=24	    ENDIF
=24	    WRITE FILE =22PWD=22
=24	ENDIF  =21 multinet
=24
=24	IF FTP_CLIENT_TYPE .EQ. TYPE_MGFTP
=24	THEN
=24	    WRITE FILE =22SET BATCH=22
=24	    IF CONFIG_PASSIVE
=24	    THEN WRITE FILE =22SET PASSIVE=22
=24	    ELSE WRITE FILE =22SET NOPASSIVE=22
=24	    ENDIF
=24	    IF CONFIG_FILE_TRANSFER .EQS. =22VMS=22
=24	    THEN
=24		WRITE FILE =22SET STRUCTURE VMS=22
=24	    ELSE
=24		WRITE FILE =22SET TYPE =22, CONFIG_FILE_TRANSFER
=24	    ENDIF
=24	    WRITE FILE =22PWD=22
=24	ENDIF  =21 madgoat
=24
=24	IF FTP_CLIENT_TYPE .EQ. TYPE_TCPWARE
=24	THEN
=24	    IF CONFIG_PASSIVE
=24	    THEN WRITE FILE =22SET PASSIVE=22
=24	    ELSE WRITE FILE =22SET NOPASSIVE=22
=24	    ENDIF
=24	    IF DEBUG THEN WRITE FILE =22SET DEBUG/CLASS=3DREPLIES=22
=24	    WRITE FILE =22CONNECT =22, CONFIG_SITE, =22 =22, -
		  CONFIG_USERNAME, =22 =22, CONFIG_PASSWORD
=24	    IF CONFIG_FILE_TRANSFER .EQS. =22VMS=22
=24	    THEN
=24		WRITE FILE =22STRUCTURE VMS=22
=24	    ELSE
=24		WRITE FILE =22TYPE =22, CONFIG_FILE_TRANSFER
=24	    ENDIF
=24	    WRITE FILE =22PWD=22
=24	ENDIF  =21 tcpware
=24
=24	COUNT =3D 0
=24 _GEN_FILE_LOOP:=20
=24	IF COUNT .GE. CONFIG_DIR_TOTAL THEN GOTO _EXIT_GEN_FILE_LOOP
=24	DIRECTORY_NAME =3D F=24ELEMENT(0,=22,=22,CONFIG_DIRECTORIES_'COUNT')
=24	DIRECTORY_NAME2 =3D DIRECTORY_NAME - =22/...=22 - =22...=22
=24	WRITE FILE =22SPAWN WRITE SYS=24OUTPUT =22=22<<<REMOTE_DIRECTORY ''DIRE=
CTORY_NAME2'>>>=22=22=22
=24	IF FTP_SERVER_TYPE .EQ. TYPE_UNIX										=21DM
=24	THEN														=21DM
=24	    IF F=24EXTRACT(F=24LENGTH(DIRECTORY_NAME)-4, 4, DIRECTORY_NAME) .EQ=
S. =22/...=22					=21DM
=24	    THEN DIRECTORY_NAME =3D =22-RlL =22 + F=24EXTRACT(0, F=24LENGTH(DIR=
ECTORY_NAME)-4, DIRECTORY_NAME)			=21DM
=24	    ELSE DIRECTORY_NAME =3D =22-lL =22 + DIRECTORY_NAME								=21DM
=24	    ENDIF													=21DM
=24	ENDIF														=21DM
=24	IF FTP_CLIENT_TYPE .EQ. TYPE_MULTINET THEN -
	   WRITE FILE =22DIR =22=22=22, DIRECTORY_NAME, =22=22=22=22
=24=21RL	   WRITE FILE =22DIR =22=22=22, DIRECTORY_NAME, =22=22=22 FTP_DIR:=
=22
=24	IF FTP_CLIENT_TYPE .EQ. TYPE_MGFTP -
	   .OR. FTP_CLIENT_TYPE .EQ. TYPE_TCPWARE THEN -
	   WRITE FILE =22DIR =22=22=22, DIRECTORY_NAME, =22=22=22=22
=24=21RL	   WRITE FILE =22DIR =22=22=22, DIRECTORY_NAME, =22=22=22/OUTPUT=
=3DFTP_DIR:=22
=24	COUNT =3D COUNT + 1
=24	GOTO _GEN_FILE_LOOP
=24
=24 _EXIT_GEN_FILE_LOOP:=20
=24	WRITE FILE =22EXIT=22
=24	CLOSE FILE
=24	IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- Contents of input file:=22
=24	IF DEBUG THEN TYPE/OUTPUT=3DSYS=24ERROR 'TEMPFILE_1'
=24
=24	IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- Connecting to remote system.=
..=22
=24=21RL=24	IF F=24SEARCH(TEMPFILE_2) .NES. =22=22 THEN DELETE 'TEMPFILE_2'=
;*
=24=21RL=24	TYPE NLA0: /OUTPUT=3D'TEMPFILE_2'
=24=21RL=24	SET FILE/VERSION_LIMIT=3D0 'TEMPFILE_2'
=24=21RL=24	IF F=24SEARCH(TEMPFILE_4) .NES. =22=22 THEN DELETE 'TEMPFILE_4'=
;*
=24=21RL=24	TYPE NLA0: /OUTPUT=3D'TEMPFILE_4'
=24=21RL=24	SET FILE/VERSION_LIMIT=3D0 'TEMPFILE_4'
=24	IF .NOT. DEBUG .AND. F=24SEARCH(TEMPFILE_3) .NES. =22=22 THEN DELETE 'T=
EMPFILE_3';*					=21DM
=24
=24	OLD_SYMBOL_SCOPE =3D F=24ENVIRONMENT(=22SYMBOL_SCOPE=22)
=24	SET SYMBOL/SCOPE=3D(GLOBAL,LOCAL)
=24
=24=21RL=24	IF DEBUG THEN SHOW LOG SYS=24OUTPUT/FULL
=24
=24 _RETRY_GEN_FILE_LIST:													=21DM
=24
=24	IF FTP_CLIENT_TYPE .EQ. TYPE_MULTINET
=24	THEN
=24	    SET noON
=24=21RL=24	    OPEN/WRITE FTP_DIR 'TEMPFILE_2'
=24=21RL=24	    DEFINE SYS=24OUTPUT 'TEMPFILE_4'
=24	    DEFINE SYS=24OUTPUT 'TEMPFILE_3'
=24	    'CONFIG_COMMAND' -
		  /NOINITIALIZATION -
		  /TAKE_FILE=3D'TEMPFILE_1'
=24	    STATUS =3D =24STATUS
=24	    DEASSIGN SYS=24OUTPUT
=24=21RL=24	    CLOSE FTP_DIR
=24	    SET ON
=24	ENDIF
=24
=24	IF FTP_CLIENT_TYPE .EQ. TYPE_MGFTP
=24	THEN
=24	    SET noON
=24=21RL=24	    OPEN/WRITE FTP_DIR 'TEMPFILE_2'
=24=21RL=24	    DEFINE SYS=24OUTPUT 'TEMPFILE_4'
=24	    DEFINE SYS=24OUTPUT 'TEMPFILE_3'
=24	    'CONFIG_COMMAND' -
		  'CONFIG_SITE' -
		  /USERNAME=3D=22''CONFIG_USERNAME'=22 -
		  /PASSWORD=3D=22''CONFIG_PASSWORD'=22 -
		  /INITIALIZATION=3D'TEMPFILE_1'
=24	    STATUS =3D =24STATUS
=24	    DEASSIGN SYS=24OUTPUT
=24=21RL=24	    CLOSE FTP_DIR
=24	    SET noON
=24	ENDIF
=24
=24	IF FTP_CLIENT_TYPE .EQ. TYPE_TCPWARE
=24	THEN
=24	    SET noON
=24=21RL=24	    OPEN/WRITE FTP_DIR 'TEMPFILE_2'
=24=21RL=24	    DEFINE SYS=24OUTPUT 'TEMPFILE_4'
=24	    DEFINE SYS=24OUTPUT 'TEMPFILE_3'
=24	    DEFINE/USER FTP_STARTUP 'TEMPFILE_1'									=21DM
=24	    'CONFIG_COMMAND'
=24	    STATUS =3D =24STATUS
=24	    DEASSIGN SYS=24OUTPUT
=24=21RL=24	    CLOSE FTP_DIR
=24	    SET noON
=24	ENDIF
=24
=24	SET SYMBOL/SCOPE=3D('OLD_SYMBOL_SCOPE')
=24
=24=21RL=24	IF F=24SEARCH(TEMPFILE_3) .NES. =22=22 THEN DELETE 'TEMPFILE_3'=
;*
=24=21RL=24	COPY/CONCATENATE 'TEMPFILE_4','TEMPFILE_2' 'TEMPFILE_3'
=24	IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- Output from FTP session:=22
=24	IF DEBUG THEN TYPE/OUTPUT=3DSYS=24ERROR 'TEMPFILE_3'
=24
=24=21DM	IF .NOT. STATUS THEN GOTO _ERROR
=24
=24=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21
=24=21 Determine which files we will need to get from the remote system
=24=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=
=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21=21
=24
=24	OPEN/READ FILE 'TEMPFILE_3'
=24	OPEN/WRITE OUTFILE 'TEMPFILE_5'
=24
=24=21	IF .NOT. DEBUG .AND. F=24SEARCH(TEMPFILE_1) .NES. =22=22 THEN DELETE=
 'TEMPFILE_1';					=21DM
=24
=24	IF FTP_CLIENT_TYPE .EQ. TYPE_MULTINET
=24	THEN
=24	    IF CONFIG_PASSIVE THEN WRITE OUTFILE =22PASSIVE ON=22
=24	    WRITE OUTFILE =22EXIT-ON-ERROR ON=22
=24	    WRITE OUTFILE =22PROMPT-FOR-MISSING-ARGUMENTS OFF=22
=24	    WRITE OUTFILE =22VERBOSE=22											=21DM
=24	    IF DEBUG THEN WRITE OUTFILE =22STATISTICS=22
=24	    WRITE OUTFILE =22CONNECT =22, CONFIG_SITE
=24	    WRITE OUTFILE =22USER =22, CONFIG_USERNAME
=24	    WRITE OUTFILE =22PASS =22, CONFIG_PASSWORD
=24	    IF CONFIG_FILE_TRANSFER .EQS. =22VMS=22
=24	    THEN
=24		WRITE OUTFILE =22STRUCTURE VMS=22
=24	    ELSE
=24		WRITE OUTFILE =22TYPE =22, CONFIG_FILE_TRANSFER
=24	    ENDIF
=24	    WRITE OUTFILE =22PWD=22
=24	    WRITE OUTFILE =22EXIT-ON-ERROR OFF=22										=21DM
=24	ENDIF
=24
=24	IF FTP_CLIENT_TYPE .EQ. TYPE_MGFTP
=24	THEN
=24	    WRITE OUTFILE =22SET BATCH=22
=24	    IF CONFIG_FILE_TRANSFER .EQS. =22VMS=22
=24	    THEN
=24		WRITE OUTFILE =22SET STRUCTURE VMS=22
=24	    ELSE
=24		WRITE OUTFILE =22SET TYPE =22, CONFIG_FILE_TRANSFER
=24	    ENDIF
=24	    WRITE OUTFILE =22PWD=22
=24	ENDIF
=24
=24	IF FTP_CLIENT_TYPE .EQ. TYPE_TCPWARE
=24	THEN
=24	    IF CONFIG_PASSIVE THEN WRITE OUTFILE =22SET PASSIVE=22
=24	    IF DEBUG THEN WRITE OUTFILE =22SET DEBUG/CLASS=3DREPLIES=22
=24	    WRITE OUTFILE =22CONNECT =22, CONFIG_SITE, =22 =22, -
		  CONFIG_USERNAME, =22 =22, CONFIG_PASSWORD
=24	    IF CONFIG_FILE_TRANSFER .EQS. =22VMS=22
=24	    THEN
=24		WRITE OUTFILE =22STRUCTURE VMS=22
=24	    ELSE
=24		WRITE OUTFILE =22TYPE =22, CONFIG_FILE_TRANSFER
=24	    ENDIF
=24	    WRITE OUTFILE =22PWD=22
=24	ENDIF  =21 tcpware
=24
=24	GET_FILE_COUNT =3D 0
=24
=24	LOCAL_DIRECTORY =3D =22=22
=24	LOCAL_FILENAME =3D =22=22
=24	NOT_LOGGED_IN =3D 0
=24	USER_SEEN =3D 0													=21DM
=24 _READ_FILE_LOOP:
=24	READ/END_OF_FILE=3D_EXIT_READ_FILE_LOOP FILE RECORD
=24	IF F=24EDIT(RECORD,=22COLLAPSE=22) .EQS. =22=22 THEN GOTO _READ_FILE_LO=
OP
=24	IF DEBUG THEN WRITE SYS=24ERROR F=24FAO(=22-Debug- Record is: =5C=21AS=
=5C=22, RECORD)
=24	RECORD =3D F=24EDIT(RECORD,=22COMPRESS=22)
=24	IF F=24EXTRACT(0,1,RECORD) .EQS. =22=24=22 THEN GOTO _READ_FILE_LOOP		=
					=21DM
=24															=21DM
=24	XXX =3D F=24EDIT(F=24ELEMENT(0,=22 =22,RECORD),=22UPCASE=22)								=
	=21DM
=24	IF XXX .EQS. =22LIST=22 THEN GOTO _READ_FILE_LOOP									=21DM
=24	IF XXX .EQS. =22PORT=22 THEN GOTO _READ_FILE_LOOP									=21DM
=24	IF XXX .EQS. =22QUIT=22 THEN GOTO _READ_FILE_LOOP									=21DM
=24	IF XXX .EQS. =22RUN=22 THEN GOTO _READ_FILE_LOOP									=21DM
=24	IF XXX .EQS. =22TYPE:=22 THEN GOTO _READ_FILE_LOOP									=21DM
=24	IF XXX .EQS. =22TYPE=22 THEN GOTO _READ_FILE_LOOP									=21DM
=24	IF XXX .EQS. =22USER=22												=21DM
=24	THEN														=21DM
=24	    USER_SEEN =3D 1												=21DM
=24	    GOTO _READ_FILE_LOOP											=21DM
=24	ENDIF														=21DM
=24	IF F=24EXTRACT(0,5,RECORD) .EQS. =22<257 =22 -
	   .OR. F=24EXTRACT(0,4,RECORD) .EQS. =22257 =22
=24	THEN
=24	    REMOTE_ROOT =3D F=24ELEMENT(1,=22 =22,RECORD)
=24	    IF F=24EXTRACT(0,1,REMOTE_ROOT) .EQS. =22=22=22=22 THEN REMOTE_ROOT=
 =3D F=24ELEMENT(1,=22=22=22=22,REMOTE_ROOT)
=24	    IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- Remote root now: =22, RE=
MOTE_ROOT
=24	    GOTO _READ_FILE_LOOP
=24	ENDIF
=24
=24	IF ((F=24EXTRACT(0,5,RECORD) .EQS. =22<530 =22) -									=21DM
	   .OR. (F=24EXTRACT(0,4,RECORD) .EQS. =22530 =22)) .AND. -								=21DM
	   USER_SEEN													=21DM
=24	THEN														=21DM
=24	    NOT_LOGGED_IN =3D 1												=21DM
=24	    IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- Login at remote failed.=
=22						=21DM
=24	    GOTO _EXIT_READ_FILE_LOOP											=21DM
=24	ENDIF														=21DM
=24															=21DM
=24	IF F=24EXTRACT(0,10,RECORD) .EQS. =22Directory =22
=24	THEN=20
=24	    RECORD =3D F=24EXTRACT(10,F=24LENGTH(RECORD)-10,RECORD)
=24	    IF DEBUG THEN WRITE SYS=24ERROR F=24FAO(=22-Debug- Record changed:=
 =5C=21AS=5C=22, RECORD)
=24	ENDIF
=24	IF F=24EDIT(F=24ELEMENT(0,=22 =22,RECORD),=22UPCASE=22) .EQS. =22<<<REM=
OTE_DIRECTORY=22
=24=21RL	   .AND. LOCAL_DIRECTORY .EQS. =22=22
=24	THEN
=24	    LOCAL_DIRECTORY =3D =22=22
=24	    RECORD =3D F=24ELEMENT(0,=22>=22,F=24ELEMENT(1,=22 =22,RECORD))
=24	    IF FTP_SERVER_TYPE .EQ. TYPE_UNIX
=24	    THEN
=24		RECORD =3D RECORD + =22:=22
=24	    ELSE
=24=21RL=24		IF RECORD - =22:=22 .EQS. RECORD THEN -
=24=21RL		   RECORD =3D REMOTE_ROOT - =22=5D=22 + (RECORD - =22=5B=22)
=24		GOTO _READ_FILE_LOOP
=24	    ENDIF
=24	    IF DEBUG THEN WRITE SYS=24ERROR F=24FAO(=22-Debug- Record changed:=
 =5C=21AS=5C=22, RECORD)
=24	ENDIF
=24
=24	IF RECORD .EQS. =22=22 .OR. -
	   (FTP_SERVER_TYPE .NE. TYPE_UNIX .AND. -
	    RECORD .NES. F=24EDIT(RECORD,=22UPCASE=22)) THEN -
	   GOTO _READ_FILE_LOOP      =21 no lowercase in files/directories
=24	C =3D F=24EXTRACT(0,1,RECORD)
=24	IF C .EQS. =22<=22 .OR. C .EQS. =22%=22 .OR. C .EQS. =22=5B=22 THEN GOT=
O _READ_FILE_LOOP					=21DM
=24	IF FTP_SERVER_TYPE .EQ. TYPE_UNIX .AND. -
	   F=24TYPE(C) .EQS. =22INTEGER=22 THEN GOTO _READ_FILE_LOOP
=24	IF FTP_SERVER_TYPE .EQ. TYPE_UNIX .AND. -
	   F=24ELEMENT(0,=22 =22,RECORD) .EQS. =22total=22
=24	THEN
=24	    TMP3 =3D F=24EDIT(RECORD - F=24ELEMENT(0,=22 =22,RECORD),=22TRIM=22=
)
=24	    IF F=24TYPE(TMP3) .EQS. =22INTEGER=22 THEN GOTO _READ_FILE_LOOP
=24	ENDIF
=24
=24	IF F=24LOCATE(=22:=22,F=24ELEMENT(0,=22 =22,RECORD)) .NE. F=24LENGTH(F=
=24ELEMENT(0,=22 =22,RECORD))
=24	THEN
=24	    =21 we have a directory
=24	    LOCAL_DIRECTORY =3D =22=22
=24	    IF FTP_SERVER_TYPE .EQ. TYPE_UNIX
=24	    THEN
=24		REMOTE_DIRECTORY =3D F=24ELEMENT(0,=22:=22,RECORD)
=24		IF F=24EXTRACT(0,1,REMOTE_DIRECTORY) .NES. =22/=22
=24		THEN
=24		    IF F=24EXTRACT(F=24LENGTH(REMOTE_ROOT)-1,1,REMOTE_ROOT) .NES. =22/=
=22 THEN -
		       REMOTE_DIRECTORY =3D =22/=22 + REMOTE_DIRECTORY
=24		    REMOTE_DIRECTORY =3D REMOTE_ROOT + REMOTE_DIRECTORY
=24		ENDIF
=24		IF F=24EXTRACT(F=24LENGTH(REMOTE_DIRECTORY)-1,1,REMOTE_DIRECTORY) -
		   .NES. =22/=22 THEN -
		   REMOTE_DIRECTORY =3D REMOTE_DIRECTORY + =22/=22
=24	    ELSE
=24		REMOTE_DIRECTORY =3D F=24ELEMENT(0,=22 =22,RECORD)
=24	    ENDIF
=24	    IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- Remote directory now:=
 =22, REMOTE_DIRECTORY
=24	    =21 now we have to find it in our mappings
=24	    COUNT =3D 0
=24 _FIND_LOOP:=20
=24	    IF COUNT .GE. CONFIG_DIR_TOTAL THEN GOTO _EXIT_FIND_LOOP
=24	    TMP =3D F=24ELEMENT(0,=22,=22,CONFIG_DIRECTORIES_'COUNT')
=24	    IF FTP_SERVER_TYPE .EQ. TYPE_UNIX
=24	    THEN
=24		IF F=24EXTRACT(0,1,TMP) .NES. =22/=22
=24		THEN
=24		    IF F=24EXTRACT(F=24LENGTH(REMOTE_ROOT)-1,1,REMOTE_ROOT) .NES. =22/=
=22 THEN -
		       TMP =3D =22/=22 + TMP
=24		    TMP =3D REMOTE_ROOT + TMP
=24		ENDIF
=24	    ELSE
=24		IF F=24EXTRACT(0,2,TMP) .EQS. =22=5B.=22 THEN -
		   TMP =3D F=24EXTRACT(0,F=24LENGTH(REMOTE_ROOT)-1,REMOTE_ROOT) + -
		   F=24EXTRACT(1,999,TMP)
=24		IF F=24EXTRACT(0,1,TMP) .EQS. =22=5B=22 THEN -
		   TMP =3D F=24ELEMENT(0,=22=5B=22,REMOTE_ROOT) + TMP
=24	    ENDIF
=24	    IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- Remote directory to chec=
k for: =22, TMP
=24	    ENDING =3D =22...=5D=22
=24	    IF FTP_SERVER_TYPE .EQ. TYPE_UNIX THEN ENDING =3D =22...=22
=24	    LE =3D F=24LENGTH(ENDING)
=24	    IF F=24EXTRACT(F=24LENGTH(TMP)-LE,LE,TMP) -
	       .EQS. ENDING
=24	    THEN
=24		TMP =3D F=24EXTRACT(0,F=24LENGTH(TMP)-F=24LENGTH(ENDING),TMP)
=24		IF TMP .EQS. F=24EXTRACT(0,F=24LENGTH(TMP),REMOTE_DIRECTORY)
=24		THEN
=24		    =21 we have a mapping
=24		    LOCAL_DIRECTORY =3D F=24ELEMENT(1,=22,=22,CONFIG_DIRECTORIES_'COUN=
T')
=24		    IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- Equivalent local direct=
ory: =22, LOCAL_DIRECTORY		=21DM
=24		    IF F=24EXTRACT(F=24LENGTH(LOCAL_DIRECTORY)-4,4,LOCAL_DIRECTORY) .E=
QS. =22...=5D=22
=24		    THEN
=24			TMP2 =3D REMOTE_DIRECTORY
=24			IF FTP_SERVER_TYPE .EQ. TYPE_UNIX
=24			THEN
=24			    ALLOWED_CHARACTERS =3D =22ABCDEFGHIKJLMNOPQRSTUVWXYZabcdefghikjlm=
nopqrstuvwxyz0123456789-_=24/.=22
=24			    I =3D 0
=24 LOOP_CHARACTERS1:	   =20
=24			    C =3D F=24EXTRACT(I,1,TMP2)
=24			    IF C .EQS. =22.=22 THEN -
			       TMP2 =3D F=24EXTRACT(0,I,TMP2) + =22_=22 + F=24EXTRACT(I+1,F=24LE=
NGTH(TMP2)-I-1,TMP2)
=24			    IF C .EQS. =22/=22
=24			    THEN
=24				IF I .LT. F=24LENGTH(TMP2)-1
=24				THEN
=24				    TMP2 =3D F=24EXTRACT(0,I,TMP2) + =22.=22 + F=24EXTRACT(I+1,F=24L=
ENGTH(TMP2)-I-1,TMP2)
=24				ELSE
=24				    TMP2 =3D F=24EXTRACT(0,I,TMP2) + =22=5D=22
=24				ENDIF
=24			    ENDIF
=24			    IF ALLOWED_CHARACTERS - C .EQS. ALLOWED_CHARACTERS THEN -
			       TMP2 =3D F=24EXTRACT(0,I,TMP2) + =22=24=22 + F=24EXTRACT(I+1,F=24=
LENGTH(TMP2)-I-1,TMP2)
=24			    I =3D I + 1
=24			    IF I .LT. F=24LENGTH(TMP2) THEN GOTO LOOP_CHARACTERS1
=24			    TMP2 =3D TMP2
=24			ENDIF
=24			IF DEBUG THEN -
			   WRITE SYS=24ERROR =22-Debug- TMP =3D =22=22=22,TMP,=22=22=22=22
=24			IF DEBUG THEN -
			   WRITE SYS=24ERROR =22-Debug- TMP2 =3D =22=22=22,TMP2,=22=22=22=22
=24			IF DEBUG THEN -
			   WRITE SYS=24ERROR =22-Debug- LOCAL_DIRECTORY =3D =22=22=22,-
			   LOCAL_DIRECTORY,=22=22=22=22
=24			LOCAL_DIRECTORY =3D F=24EXTRACT(0,F=24LENGTH(LOCAL_DIRECTORY)-4,LOCAL=
_DIRECTORY) + F=24EXTRACT(F=24LENGTH(TMP)-(FTP_SERVER_TYPE .EQ. TYPE_UNIX),=
999,TMP2)
=24
=24		    ENDIF
=24		    IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- Local directory now:=
 =22, LOCAL_DIRECTORY
=24		ENDIF
=24	    ELSE
=24		IF FTP_SERVER_TYPE .EQ. TYPE_UNIX -
		   .AND. F=24EXTRACT(F=24LENGTH(TMP)-1,1,TMP) .NES. =22/=22 THEN -
		   TMP =3D TMP + =22/=22
=24		IF TMP .EQS. REMOTE_DIRECTORY
=24		THEN
=24		    =21 we have a mapping
=24		    LOCAL_DIRECTORY =3D F=24ELEMENT(1,=22,=22,CONFIG_DIRECTORIES_'COUN=
T') - =22...=22
=24		    IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- Local directory now:=
 =22, LOCAL_DIRECTORY
=24		ENDIF
=24	    ENDIF
=24	    COUNT =3D COUNT + 1
=24	    GOTO _FIND_LOOP
=24 _EXIT_FIND_LOOP:=20
=24	    IF LOCAL_DIRECTORY .EQS. =22=22=20
=24	    THEN=20
=24		WRITE SYS=24ERROR =22Error - no mapping for remote directory =22, REMO=
TE_DIRECTORY
=24		WRITE SYS=24ERROR =22Error - skipping directory =22, REMOTE_DIRECTORY
=24	    ELSE
=24		IF F=24PARSE(LOCAL_DIRECTORY) .EQS. =22=22 THEN CREATE/DIRECTORY/LOG '=
LOCAL_DIRECTORY'
=24	    ENDIF
=24	    GOTO _READ_FILE_LOOP
=24	ENDIF =21 f=24locate
=24
=24	IF LOCAL_DIRECTORY .EQS. =22=22 THEN GOTO _READ_FILE_LOOP
=24
=24=21
=24=21=21=21  Determine if we need to get a file
=24=21
=24
=24	IF F=24EDIT(F=24ELEMENT(0,=22 =22,RECORD),=22COLLAPSE=22) .NES. =22=22
=24	THEN
=24	    GET_FILE =3D FALSE
=24	    =21 assume we have a remote filename
=24	    IF FTP_SERVER_TYPE .EQ. TYPE_UNIX
=24	    THEN
=24		RECORD_C =3D F=24EDIT(RECORD,=22COMPRESS,TRIM=22)
=24		REMOTE_PROTECTION =3D F=24ELEMENT(0,=22 =22,RECORD_C)
=24		REMOTE_LINKS =3D F=24ELEMENT(1,=22 =22,RECORD_C)
=24		REMOTE_USER =3D F=24ELEMENT(2,=22 =22,RECORD_C)
=24		REMOTE_GROUP =3D F=24ELEMENT(3,=22 =22,RECORD_C)
=24		REMOTE_SIZE =3D F=24ELEMENT(4,=22 =22,RECORD_C)
=24		REMOTE_MONTH =3D F=24ELEMENT(5,=22 =22,RECORD_C)
=24		REMOTE_DAY =3D F=24ELEMENT(6,=22 =22,RECORD_C)
=24		REMOTE_YEARORTIME =3D F=24ELEMENT(7,=22 =22,RECORD_C)
=24		IF REMOTE_YEARORTIME - =22:=22 .EQS. REMOTE_YEARORTIME
=24		THEN =21 Mon day year
=24		    REMOTE_TIMESTAMP =3D F=24CVTIME(REMOTE_DAY+=22-=22+REMOTE_MONTH+=
=22-=22+REMOTE_YEARORTIME+=22:0:0:0=22,=22COMPARISON=22)
=24		ELSE
=24		    REMOTE_TIMESTAMP =3D F=24CVTIME(REMOTE_DAY+=22-=22+REMOTE_MONTH+=
=22-=22+F=24CVTIME(=22=22,,=22YEAR=22)+=22:=22+REMOTE_YEARORTIME,=22COMPARI=
SON=22)
=24		    IF REMOTE_TIMESTAMP .GTS. F=24CVTIME(=22+1-=22,=22COMPARISON=22) T=
HEN -
		       REMOTE_TIMESTAMP =3D F=24CVTIME(REMOTE_DAY+=22-=22+REMOTE_MONTH+=
=22-=22+F=24CVTIME(=22-365-=22,,=22YEAR=22)+=22:=22+REMOTE_YEARORTIME,=22CO=
MPARISON=22)
=24		ENDIF
=24		FILENAME =3D RECORD_C - REMOTE_PROTECTION - REMOTE_LINKS -
			   - REMOTE_USER - REMOTE_GROUP - REMOTE_SIZE -
			   - REMOTE_MONTH - REMOTE_DAY - REMOTE_YEARORTIME
=24		FILENAME =3D F=24EDIT(FILENAME,=22TRIM=22)
=24	    ELSE
=24		FILENAME =3D F=24ELEMENT(0,=22 =22,RECORD)
=24		REMOTE_TIMESTAMP =3D F=24ELEMENT(2,=22 =22,RECORD) + =22 =22 + F=24ELE=
MENT(3,=22 =22,RECORD)
=24		IF F=24EDIT(REMOTE_TIMESTAMP,=22COLLAPSE=22) .EQS. =22=22=20
=24		THEN
=24		    =21 date is on the next line...
=24 _READ_DATE_LINE: =20
=24		    READ/END_OF_FILE=3D_EXIT_READ_FILE_LOOP FILE RECORD
=24=21 Watch out.  Some client, like the MadGoat FTP client, will sputter l=
ines
=24=21 like this right in the middle of the directory output:
=24=21	<226 File transfer Okay; Closing data connection.
=24=21 Fortunately, it is very easy to check, since we expect this line to=
 start
=24=21 with a space
=24		    IF F=24EXTRACT(0,1,RECORD) .NES. =22 =22 THEN -
		       GOTO _READ_DATE_LINE
=24		    RECORD =3D F=24EDIT(RECORD,=22COMPRESS=22)
=24		    REMOTE_TIMESTAMP =3D F=24ELEMENT(2,=22 =22,RECORD) + =22 =22 + F=
=24ELEMENT(3,=22 =22,RECORD)
=24		ENDIF
=24		REMOTE_TIMESTAMP =3D F=24CVTIME(REMOTE_TIMESTAMP,=22COMPARISON=22)
=24	    ENDIF
=24	    IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- Remote file is: =22, FIL=
ENAME
=24	    IF FTP_SERVER_TYPE .EQ. TYPE_UNIX
=24	    THEN
=24		IF F=24EXTRACT(0,1,REMOTE_PROTECTION) .NES. =22-=22 THEN -
		   GOTO _READ_FILE_LOOP
=24	    ELSE
=24		IF F=24PARSE(FILENAME,,,=22TYPE=22) .EQS. =22.DIR=22 THEN -
		   GOTO _READ_FILE_LOOP
=24	    ENDIF
=24
=24	    OLD_LOCAL_FILENAME =3D LOCAL_FILENAME
=24	    IF FTP_SERVER_TYPE .EQS. TYPE_UNIX
=24	    THEN
=24		LOCAL_FILENAME =3D FILENAME
=24		IF F=24EXTRACT(F=24LENGTH(LOCAL_FILENAME)-3,3,LOCAL_FILENAME) .EQS.=
 =22.gz=22
=24		THEN
=24		    LOCAL_FILENAME =3D F=24EXTRACT(0,F=24LENGTH(LOCAL_FILENAME)-3,LOCA=
L_FILENAME)
=24		    IF LOCAL_FILENAME - =22.=22 .EQS. LOCAL_FILENAME
=24		    THEN
=24			LOCAL_FILENAME =3D LOCAL_FILENAME + =22.gz=22
=24		    ELSE
=24			LOCAL_FILENAME =3D LOCAL_FILENAME + =22-gz=22
=24		    ENDIF
=24		ENDIF
=24		IF F=24EXTRACT(F=24LENGTH(LOCAL_FILENAME)-2,2,LOCAL_FILENAME) .EQS.=
 =22.Z=22
=24		THEN
=24		    LOCAL_FILENAME =3D F=24EXTRACT(0,F=24LENGTH(LOCAL_FILENAME)-2,LOCA=
L_FILENAME)
=24		    IF LOCAL_FILENAME - =22.=22 .EQS. LOCAL_FILENAME
=24		    THEN
=24			LOCAL_FILENAME =3D LOCAL_FILENAME + =22.Z=22
=24		    ELSE
=24			LOCAL_FILENAME =3D LOCAL_FILENAME + =22_Z=22
=24		    ENDIF
=24		ENDIF
=24		ALLOWED_CHARACTERS =3D =22ABCDEFGHIKJLMNOPQRSTUVWXYZabcdefghikjlmnopqr=
stuvwxyz0123456789-_=24.=22
=24		IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- (1) LOCAL_FILENAME=3D=22=22=
=22,-
		   LOCAL_FILENAME,=22=22=22=22
=24		I =3D 0
=24 LOOP_CHARACTERS2:=20
=24		C =3D F=24EXTRACT(I,1,LOCAL_FILENAME)
=24		IF C .EQS. =22.=22 -
		   .AND. LOCAL_FILENAME - =22.=22 - =22.=22 .NES. LOCAL_FILENAME - =22.=
=22 THEN -
		   LOCAL_FILENAME =3D F=24EXTRACT(0,I,LOCAL_FILENAME) + =22_=22 + F=24EXT=
RACT(I+1,F=24LENGTH(LOCAL_FILENAME)-I-1,LOCAL_FILENAME)
=24		IF ALLOWED_CHARACTERS - C .EQS. ALLOWED_CHARACTERS THEN -
		   LOCAL_FILENAME =3D F=24EXTRACT(0,I,LOCAL_FILENAME) + =22=24=22 + F=24E=
XTRACT(I+1,F=24LENGTH(LOCAL_FILENAME)-I-1,LOCAL_FILENAME)
=24		I =3D I + 1
=24		IF I .LT. F=24LENGTH(LOCAL_FILENAME) THEN GOTO LOOP_CHARACTERS2
=24		IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- (2) LOCAL_FILENAME=3D=22=22=
=22,-
		   LOCAL_FILENAME,=22=22=22=22
=24		LOCAL_FILENAME =3D F=24PARSE(=22;=22,LOCAL_FILENAME,LOCAL_DIRECTORY)
=24		IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- (3) LOCAL_FILENAME=3D=22=22=
=22,-
		   LOCAL_FILENAME,=22=22=22=22
=24	    ELSE
=24		LOCAL_FILENAME =3D F=24PARSE(=22;=22,FILENAME,LOCAL_DIRECTORY)
=24	    ENDIF
=24	    IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- Local file is: =22, LOCA=
L_FILENAME
=24	    IF OLD_LOCAL_FILENAME .EQS. LOCAL_FILENAME
=24	    THEN
=24		IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- Skipping file =22, FILENAME=
, =22 (it's an older version)=22
=24		GOTO _READ_FILE_LOOP
=24	    ENDIF
=24	    IF F=24SEARCH(LOCAL_FILENAME) .EQS. =22=22
=24	    THEN
=24		=21 no such file exists, so we need to create directory (if
=24		=21 necessary) and pull the file over
=24		IF CONFIG_LAST_TIME_FILE .EQS. =22=22 -
		   .OR. CONFIG_LAST_TIME .LTS. REMOTE_TIMESTAMP THEN GET_FILE =3D TRUE
=24		IF GET_FILE .AND. DEBUG THEN -
		   WRITE SYS=24ERROR =22-Debug- Copying file #=22,GET_FILE_COUNT, REMOTE_=
DIRECTORY, FILENAME, =22 to =22, LOCAL_FILENAME, =22 (we don't have a copy)=
.=22
=24	    ELSE
=24		=21 check dates to see if we should get a new copy
=24		LOCAL_TIMESTAMP =3D F=24CVTIME(F=24FILE(LOCAL_FILENAME,=22RDT=22),=22C=
OMPARISON=22)
=24		IF DEBUG THEN WRITE SYS=24ERROR =22-Debug- Local file date: =22, LOCAL=
_TIMESTAMP, =22, remote file date: =22, REMOTE_TIMESTAMP
=24		IF LOCAL_TIMESTAMP .LES. REMOTE_TIMESTAMP
=24		THEN=20
=24		    IF CONFIG_LAST_TIME_FILE .EQS. =22=22 -
		       .OR. CONFIG_LAST_TIME .LTS. REMOTE_TIMESTAMP THEN GET_FILE =3D TRU=
E
=24		    IF GET_FILE .AND. DEBUG THEN -
		       WRITE SYS=24ERROR =22-Debug- Getting file =22,GET_FILE_COUNT, REMO=
TE_DIRECTORY, FILENAME, =22 to =22, LOCAL_FILENAME,=22 (we have an old copy=
).=22
=24		ENDIF
=24	    ENDIF
=24	    IF GET_FILE=20
=24	    THEN=20
=24		GET_FILE_COUNT =3D GET_FILE_COUNT + 1
=24		NEW_TYPE =3D 0												=21DM
=24		IF (CONFIG_TYPE_TOTAL .NE. 0)										=21DM
=24		THEN													=21DM
=24		    XXX =3D 0												=21DM
=24 _SCAN_TYPE_LOOP:													=21DM
=24		    IF XXX .GE. CONFIG_TYPE_TOTAL THEN GOTO _EXIT_SCAN_TYPE_LOOP				=
	=21DM
=24		    YYY =3D CONFIG_TYPE_'XXX'										=21DM
=24		    IF F=24EXTRACT(F=24LENGTH(FILENAME)-F=24LENGTH(YYY),F=24LENGTH(YYY=
),FILENAME) .EQS. YYY			=21DM
=24		    THEN												=21DM
=24                       WRITE SYS=24ERROR =22-Debug- Changing transfer mo=
de to: =22,CONFIG_TYPE_TRANSFER_'XXX'		=21DM
=24			IF FTP_CLIENT_TYPE .EQ. TYPE_MULTINET								=21DM
=24			THEN												=21DM
=24			    IF (CONFIG_TYPE_TRANSFER_'XXX' .EQS. =22VMS=22)							=21DM
=24			    THEN											=21DM
=24				WRITE OUTFILE =22STRUCTURE VMS=22								=21DM
=24			    ELSE											=21DM
=24				WRITE OUTFILE =22TYPE =22, CONFIG_TYPE_TRANSFER_'XXX'					=21DM
=24			    ENDIF											=21DM
=24			ENDIF												=21DM
=24															=21DM
=24                       IF FTP_CLIENT_TYPE .EQ. TYPE_MGFTP								=21DM
=24                       THEN                                            =
                                                =21DM
=24                           IF (CONFIG_TYPE_TRANSFER_'XXX' .EQS. =22VMS=
=22)                                                 =21DM
=24                           THEN                                        =
                                                =21DM
=24                               WRITE OUTFILE =22SET STRUCTURE VMS=22   =
                                                    =21DM
=24                           ELSE                                        =
                                                =21DM
=24                               WRITE OUTFILE =22SET TYPE =22, CONFIG_TYP=
E_TRANSFER_'XXX'                                   =21DM
=24                           ENDIF                                       =
                                                =21DM
=24                       ENDIF                                           =
                                                =21DM
=24                                                                       =
                                                =21DM
=24                       IF FTP_CLIENT_TYPE .EQ. TYPE_TCPWARE								=21DM
=24                       THEN                                            =
                                                =21DM
=24                           IF (CONFIG_TYPE_TRANSFER_'XXX' .EQS. =22VMS=
=22)                                                 =21DM
=24                           THEN                                        =
                                                =21DM
=24                               WRITE OUTFILE =22STRUCTURE VMS=22       =
                                                    =21DM
=24                           ELSE                                        =
                                                =21DM
=24                               WRITE OUTFILE =22TYPE =22, CONFIG_TYPE_TR=
ANSFER_'XXX'                                       =21DM
=24                           ENDIF                                       =
                                                =21DM
=24                       ENDIF                                           =
                                                =21DM
=24                                                                       =
                                                =21DM
=24			NEW_TYPE =3D 1											=21DM
=24			GOTO _EXIT_SCAN_TYPE_LOOP									=21DM
=24		    ENDIF												=21DM
=24		    XXX =3D XXX + 1											=21DM
=24		    GOTO _SCAN_TYPE_LOOP										=21DM
=24 _EXIT_SCAN_TYPE_LOOP:													=21DM
=24		ENDIF													=21DM
=24		IF (CONFIG_TYPE_TOTAL .NE. 0) .AND. (.NOT. NEW_TYPE)							=21DM
=24		THEN													=21DM
=24		    IF (CONFIG_FILE_TRANSFER .EQS. =22VMS=22)								=21DM
=24		    THEN												=21DM
=24			WRITE OUTFILE =22STRUCTURE VMS=22									=21DM
=24		    ELSE												=21DM
=24			WRITE OUTFILE =22TYPE =22, CONFIG_FILE_TRANSFER							=21DM
=24		    ENDIF												=21DM
=24		ENDIF													=21DM
=24		WRITE OUTFILE -												=21DM
		    =22SPAWN WRITE SYS=24OUTPUT =22=22<<<GET =22=22=22=22''REMOTE_DIRECTO=
RY'''FILENAME'=22=22=22=22 ''LOCAL_FILENAME'>>>=22=22=22	=21DM
=24		WRITE OUTFILE =22GET =22=22=22, REMOTE_DIRECTORY, FILENAME, =22=22=22=
 =22, LOCAL_FILENAME				=21DM
=24		IF GET_FILE_COUNT .GE. CONFIG_MAXIMUM_FILES THEN GOTO _EXIT_READ_FILE_=
LOOP				=21DM
=24	    ENDIF
=24	ENDIF
=24	GOTO _READ_FILE_LOOP
=24 _EXIT_READ_FILE_LOOP:=09
=24	CLOSE FILE
=24	WRITE O