ÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛ ÛÛÛ ÛÛÛÛÛÛÛ °°°°°ÛÛ°° °°°°°ÛÛ°° ÛÛ°ÛÛ° ÛÛ°°°°ÛÛ° ÛÛ°° ÛÛ°° ÛÛ° ÛÛ° ÛÛ° ÛÛ° ÛÛ°° ÛÛ°° ÛÛ° ÛÛ° ÛÛ° ÛÛ°° ÛÛ°° ÛÛ°° ÛÛÛÛÛÛÛÛÛ° ÛÛÛÛÛÛÛ°° ÛÛ°° ÛÛ°° ÛÛ°°°°°ÛÛ° ÛÛ°°°°°° ÛÛ°° ÛÛ°° ÛÛ° ÛÛ° ÛÛ° ÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛ ÛÛ° ÛÛ° ÛÛ° °°°°°°°°° °°°°°°°°° °° °° °° Version 6.6 ZIP/ZOO/ARC/PAK Converter (And More!) Copyright (c) 1989,91 Ross Neilson Wentworth All Rights Reserved Chapter One License Agreement In the past I have not requested money to use ZZAP unless it was used in a commercial environment. However, due to its increased popularity with the resultant increase in phone calls with questions, I am forced to change my licensing policy. This new policy supersedes all previous agreements for the licensing of ZZAP. You may use ZZAP on a trial basis for up to 30 days freely. You may give it away to anyone you wish so long as you do not charge for it or use it as an incentive to buy. If, after the 30 day trial period, you wish to continue to use ZZAP, a registration fee is required (see the file ORDER.FRM for details). Payment should be by check or money in U.S. funds drawn on a U.S. bank. I can not be responsible for cash that is sent through the mail. Printing the file "ORDER.FRM" will produce an order form that you can use to register ZZAP. Send your registration and/or inquiry to: Ross Neilson Wentworth 1422 Elkgrove Circle, #3 Venice, CA 90291 (310)399-1244 The latest version of ZZAP can be found on West Los Angeles BBS, (310)838-9229. Even if you do not wish to register I would appreciate hearing from you. A simple postcard listing your likes, dislikes, suggestions, and the version number is all that I ask. The terms "arc", "archive", "unarc", etc. are used throughout this document. They are considered generic terms for all archiving types and formats. Any declaration that any of these terms are proprietary will be construed as a ridiculous statement and be properly ignored. Chapter Two Summary of Features o Automated conversion between the most common archive types (ARC, ARJ, DWC, ICE, LBR, LZH, MD, PAK, SDN, SQZ, ZIP, and ZOO), including self-extracting archives. o Automatically converts nested archives including nested archives of different types. A switch is provided to disable this feature. o Optionally convert archives in multiple subdirectories (subdirectory recursion). o Accepts wild-card designations and multiple file names on the command line. o Repack archives to same type. o Renames or moves corrupted archive for later examination. o User defined arcing and unarcing options. o Deletes old archives by default, options to keep them. o Optional logging of ZZAP activities to a text file. o Optionally create a text file listing the archives converted, suitable for use by filter programs to update the file list as used by BBS programs. o Flag archives containing files with Hidden, System, or ReadOnly attributes as "bad" or optionally strip the funny attributes. o Can automatically check an archive for viruses using the virus scanning program SCAN.EXE (version 39 or later) from McAfee Associates. o Optional 32-bit CRC testing of program files adds an additional layer of protection from viruses, trojans, and the like. o The standard input of programs that are executed can be redirected from a file to allow the automatic addition of an archive comment (currently this only works with ZIP files, I think). o Can take advantage of expanded memory (LIM 4.0 driver required) or extended memory (XMS driver required) to reduce the memory overhead while executing the archiving programs. o Processing can be skipped on archives that are more than a configurable number of days old. o External programs can be defined to be executed before and/or after each archive is processed. o Configurable for additional archiving programs. Page 2 Chapter 2. License Agreement Chapter Three Running ZZAP The basic syntax of ZZAP is: ZZAP [switches] filespec [filespec ...] Where [options] is any of the optional command line switches and filespec is a file name, wildcard specification, or the name of a file indicating a list of files. A "list" file is signified by preceding the file name with the '@' character, for example: ZZAP @newfiles.lst You can mix filespecs on the command line, giving a combination of specific file names, wildcards, and list files; limited only by the length of the command line (80 characters): ZZAP AFILE.ZOO *.LZH @UPLOADS.LST To halt ZZAP press the ESCape key. Conversion of the current archive will be completed and ZZAP will halt. Every attempt has been made to supply a universally acceptable configuration file (ZZAP.CFG). Everybody, of course, has personal preferences so you may wish to modify it for your special needs. Consult the chapter on the configuration file for information on customizing ZZAP operations. If you wish to log the activity of ZZAP you need to specify the full path and file name of the log file. See the chapter Logging ZZAP Activity for details. Chapter 3. Summary of Features Page 3 Chapter Four Archive Programs Supported Currently, there are a multitude of mostly incompatible archiving utilities available. While a standard would be beneficial to the BBS community, it's not likely to occur in the near future. To help cope with the different formats and to make conversion from one to another easy I wrote ZZAP. It allows conversion from one format to another, quickly and painlessly. ZZAP doesn't actually do any conversion on its own. Rather, it acts as a shell around the archivers - automating the process. The archive programs and version numbers tested under are: ARJ 2.00 DWC A4.95 ICE 1.14 LHARC 1.13 LUE 2.20 (extraction only) MD (unknown version number - tested by user) PAK 2.0 PKPAK/PKUNPAK 3.61 (a.k.a. PKARC/PKXARC) PKZIP/PKUNZIP 1.10 SQZ 1.08.2 ZOO 2.01 Other formats should work if properly configured but there is no guarantee. If you run across an archiving program that does not work under ZZAP I would like to hear about it so I can make the necessary modifications. Page 4 Chapter 4. Running ZZAP Chapter Five Configuration File ZZAP relies on a configuration file (ZZAP.CFG) to know how to arc and unarc. There are a number commands allowed in the configuration file, three of them are required (ARC=, UNARC=, and DEFAULT=) and the rest are optional. The order of the commands are unimportant. Each command is on its own line. Placing multiple commands on a single line will result in improper operation. A configuration file is included with this package that may be used as-is or may be modified for your personal preferences. 5.1 ARC= ARC= defines the command used to archive. This command can appear as many times as required to define all of the various archive types you may use. The syntax for this command is: ARC=EXT PROGNAME OPTIONS EXT represents the filename extension used by this particular archiver, PKZIP, for example, uses ZIP. Do NOT include a leading period. PROGNAME is the name of the actual archiving program. If the filename extension is not given the a search will be made for both COM and EXE. Including the extension will improve the performance of ZZAP. OPTIONS is the command line options used to create an archive. ZOO, for example, uses "-ADD" while PKPAK uses "-A". Since some archiving programs use both upper and lower case letters to represent different actions, this item's case is left intact. OPTIONS also may include the "%1" to indicate where the archive files name should be placed on the command line. In previous version the archive name was appended to the end of the command line if the %1 was omitted. This is no longer true, now you MUST specify the %1 if you wish the archive name on the command line. If you wish to redirect the standard input or output of the archiving program then put the redirection command at the end of OPTIONS. ZZAP allows three types of redirection: > redirects the output, < redirects the input, and >> appends redirection to the indicated file. Chapter 5. Archive Programs Supported Page 5 The following are all legal ARC= commands: ARC=ARC PKPAK -A %1 *.* ARC=DWC DWC.EXE AZ %1 *.* ARC=PAK PAK A %1 *.* ARC=LZH LHARC.EXE a %1 *.* ARC=ZIP PKZIP -A -EX ARC=ZOO ZOO.EXE -ADD %1 * >NUL ARC=ZIP PKZIP.EXE -a -z %1 *.* >NUL NUL UNARC=ZOO ZOO -EXTRACT %1 >NUL The last two examples have their display output redirected to the NUL device. Subdirectories It is recommended that you turn on creation of subdirectories if the archive format supports storing subdirectories along with file names. This is to allow ZZAP to detect the subdirectories and treat the archive as BAD. If the unarc program allows all files to be placed in a single subdirectory a file name conflict can arise, resulting in the unarc program stopping and waiting for keyboard input to verify a file overwrite. This could potentially stop your computer dead, leaving the BBS system off- line until manually continued. The unarc program MUST allow the subdirectories created to be children of the temporary subdirectory. UNARC=ZIP PKUNZIP.EXE -d %1 >NUL This example causes PKUNZIP to create subdirectories if the information is stored with the file names. ZZAP will detect the creation of any subdirectories, log the error message, move the archive to the BAD subdirectory, and clean up (remove all files and subdirectories extracted from the archive). If the unarc program creates the subdirectores anyplace besides in the temporary subdirectory ZZAP will not be able to detect them, the contents of the new archive will be incomplete, and the subdirectories created will remain on your disk. See also COMSPEC. 5.3 DEFAULT= This is the default extension used to decide which archiving format to convert to. The extension given must match one of the extensions given with the ARC= command. If a match is not found the program will halt with an error. The syntax for this command is: DEFAULT=ext where ext is the file extension corresponding to an archive type. Chapter 5. Configuration File Page 7 The following are legal DEFAULT commands: DEFAULT=ZIP DEFAULT=ZOO DEFAULT=.ARC Note that the preceding period is optional. You can override DEFAULT= with the command line switch /E. 5.4 NESTED= You can modify how nested archives are handled with this command. The following options are valid (choose only one): TEST The nested archive is tested but not converted. SAME The archive is repacked to its same type. CONVERT The archive is converted to the default type. If you omit this command from the configuration file the default operation is CONVERT. Nested archives are always ignored (treated as a normal file) if you disable nested archives processing with /N-. 5.5 WORKDRIVE= Specify the drive to use for temporary files with this command, e.g.: WORKDRIVE=E: If you use a RAM disk be sure it's very large so that it doesn't fill up when archives are temporarily expanded. If the drive does become full the archive being converted/tested will be flagged as "bad". 5.6 NESTEDARC= Controls how nested archives are handled. This command accepts three options: TEST Nested archives are tested only. SAME Nested archives are repacked to the same type. CONVERT Nested archives are converted to the default type. If this command is omitted from the configuration file the default action is CONVERT. The /T, /O and /N switches will affect the action of this command. /T will cause the entire Page 8 Chapter 5. Configuration File contents of the archive to be tested only, no conversions. /O will cause the archive to repack to the same same, nested archives included. If /N- is specified nested archives will be treated as a normal file, not an archive. 5.7 BADDIR= Whenever an archive fails to unarc properly it will be renamed to so the second character of the extension is "!", e.g. "Z!P". By default the file is kept in its original subdirectory. If you wish bad archives to be placed in a special subdirectory you may use the BADDIR= command. Simply name the subdirectory you wish to use. This subdirectory must already exist for this option to work properly. Example: BADDIR=C:\BAD The defined subdirectory can be on a different drive but if the file move is unsuccessful the file will simply be renamed to have the normal bad extension (the default mode). 5.8 VIRUSDIR= If an archive fails the virus check the archive will be placed in the subdirectory named here. If this command is not included in the configuration file the archive will be placed in the directory specified with the BADDIR= command or will be renamed with the '!' in the extension if BADDIR= is not specified. The subdirectory must already exist for it to be used, ZZAP will not create the subdirectory for you. VIRUSDIR=C:\VIRUS The defined subdirectory can be on a different drive but if the file move is unsuccessful the file will simply be renamed to have the normal bad extension (the default mode). 5.9 SWITCH= Use this to specify your default command line switches. For example, if you always use the virus checking options you can place this in your configuration file: SWITCH=/V+ You can always override the options on the command line: ZZAP /V- file.ext Chapter 5. Configuration File Page 9 The command line always takes precedence over the configuration file. 5.10 FIXER= Specify the name of your BBS download list fix-up program and command line options with this command. For example, if you are running a QuickBBS bulletin board system you can specify FIXER=QFIX.EXE (included in this package). Include any command line options needed immediately after the fix-up program name. For example, to automatically update the 4DOS description file the proper syntax would be: FIXER=QFIX.EXE DESCRIPT.ION This command is only needed if you plan on using the /C command line switch. See also COMSPEC. 5.11 AGE= If this command is used then only files that are within the specified number of days old will be processed. For example, setting the age to 1 (AGE=1) will result in only files that are one day old (files with today's date ONLY) to be processed by ZZAP. Sysops who have an "event" at midnight will generally wish to set AGE= to 2, allowing files from today and yesterday to be processed. When using this feature you should use the /DO command line switch (keep original dates of files). Assuming you stamped the files with the date they are uploaded, this would guarantee that only new archives are processed. Omitting this command or setting AGE=0 results in the age of a file to be completely ignored. See also the /I command line switch. 5.12 PRE= If you wish an external program executed to process an archive before its files are extracted declare the program name and command line options with this command. PRE=GETCMTS.EXE %1 Page 10 Chapter 5. Configuration File With the above example the hypothetical program GETCMTS.EXE will be execute with the archive name passed as the command line parameter. The specified program will be executed while in the same subdirectory as the archive being processed (regardless of the command line parameters). If the DOS return code returned by the PRE= program is exactly 101 further processing on the file will be skipped. This could be used to run a program that detects for authenticity verification information (e.g. -AV option for PKZIP) since ZZAP will lose the AV information if it rebuilds an archive. This program, as well as programs defined by MID= and POST= will be executed for nested archives as well. You should avoid creating files in the temporary subdirectories ("Z.I_P" is created as a child of the subdirectory holding the archive being processed) as these files will be added to the new archive (unless that is what you wish done). While testing ZZAP I often use a "PRE=MAPMEM.EXE >\MAP" to get a memory map of the system while shelling to an external program. This helped me to optimize memory usage so that the maximum amount is available. See also MID=, POST=, and COMSPEC. 5.13 MID= If you wish an external program executed after files have been extracted from the old archive but before the new archive has been created declare the program name and command line options with this command. MID=DIRSORT.EXE NE With the above example the program DIRSORT.EXE will be executed with the command line option of NE. You can execute a batch file via the command processor (normally COMMAND.COM) by specifying %COMSPEC% as the filename. This is useful for deleting those silly BBS ads that seem to propagate unchecked throughout archives. For example, in ZZAP.CFG: MID=%COMSPEC% /c bbsads If your batch file is not somewhere on the PATH you should include the path in the filename. In your batch file called BBSADS.BAT: IF EXIST STUPID.AD DEL STUPID.AD REM repeat for BBS AD filename Chapter 5. Configuration File Page 11 The specified program will be executed while in the temporary subdirectory ZZAP creates to hold the extracted files. If you create any temporary files you should clean up afterwards, otherwise the file(s) will be added to the archive when it is repacked. See also PRE=, POST=, and COMSPEC. 5.14 POST= If you wish an external program executed to process the new archive after it as been created (or repacked) declare the program name and command line options with this command. POST=PUTCMTS.EXE %1 With the above example the hypothetical program PUTCMTS.EXE will be executed with the archive name (the new name) as the command line parameter. The specified program will be executed while in the same subdirectory as the archive being processed (regardless of the command line parameters). The main intent of the PRE= and POST= commands is to allow third party programmers to create programs that extract archive comments from the original archives and then put them into the new archives. Since these are format specific I didn't want to program these types of operations into ZZAP. See also PRE=, MID=, and COMSPEC. 5.15 SFX= Defines the offset and "signature" to search for in an EXE or COM file to verify if it is a self-extracting archive. The parameters are: SFX=ext offset signature For example, for ZIP version 1.10 self-extracting archives the parameters are: SFX=ZIP 50 PKWARE The extension you specify will determine which unarc program is used to extract the files in the archive. The offset is a decimal number indicating the position in the file that the signature is found at. The signature is any combination of characters that can uniquely determine if the archive is that specific SFX type. Page 12 Chapter 5. Configuration File Multiple definitions can be given for the same extension, thus allowing different versions to be supported. For example most SFX archives come in two flavors, regular and junior. The offset and/or signatures are usually different for each type, though the same unarc program can be used for either type. The signature can be regular ASCII characters (case is significant) as well as the following special characters: ^ Species a control character, e.g. ^A is replaced with ASCII byte value 01h. # Place numbers between a pair of these to indicate a specific ASCII value, e.g. #13# for ASCII character 13 (decimal). / The following character is used as is. Must precede the /, ^ or # character, e.g. /^ when you want an explicit ^ character. 5.16 NONSFX= By default, executable files (EXE and COM) which are not recognized as self-extracting archives are treated as "bad". If you would prefer to have these files ignored include NONSFX=IGNORE in the configuration file. Leaving out this command or including NONSFX=BAD will result in executables to be treated as "bad" if they are not self-extracting archives. Note that executables inside an archive are NEVER treated as bad even if they are not SFX. 5.17 NESTEDSFX= You can have ZZAP check for SFX signatures in executable files contained inside an archive by including NESTEDSFX=YES in the configuration file. Note that many programs include automatic installation programs that rely on certain files being SFX and converting these files will probably break these programs (though they are rare). Alternately, you can have archives with nested SFX files flagged as "bad" and placed in the bad archive subdirectory (or renamed), giving you the opportunity to manual examine the archive and decide if it should be converted or left alone. The valid options for this command are: NESTEDSFX=YES ; test for nested SFX NESTEDSFX=NO ; don't test for nested SFX NESTEDSFX=BAD ; treat nested SFX as "bad" Chapter 5. Configuration File Page 13 5.18 SCANOPT= Place, after this command, any command line options you wish passed on to SCAN.EXE when it is executed. The given options will be added after the subdirectory to scan exactly as shown in the configuration file. For example, if you have this in the configuration file: SCANOPT=/A /NOMEM SCAN will be executed as: SCAN pathname /A /NOMEM 5.19 WORKDRV= Use this directive to specify a different drive and/or directory for temporary workspace. If you specify a directory it must already exist. If you use a RAM disk as the work drive be sure it's large enough to hold the entire uncompressed contents of the largest archive you will be converting. Page 14 Chapter 5. Configuration File Chapter Six Logging ZZAP Activity If you wish ZZAP to run unattended (see EVENTS below) then you may wish to log its activities. You must specify the drive full path and file name of the log file in the environment with the ZZAPLOG variable. In your AUTOEXEC.BAT file you should place this (or something similar): SET ZZAPLOG=C:\LOG\ZZAP.LOG The actual file name will depend upon your system configuration. The first time the log option is used the log file is created. On subsequent runs new information is appended to the end of the file. The log file is a standard ASCII file that may be viewed, edited, printed, etc.. The long form log file (enabled with the /L switch) contains information about the files converted, their original and new sizes, differences in archive sizes (savings or loss), as well as error messages. The short form log file only contains error messages. See also the /L command line switch. Chapter 6. Configuration File Page 15 Chapter Seven Executing Compsec Any time you declare, in the configuration file, a program to be executed you have the option of using %COMSPEC% to indicate to ZZAP to execute DOS (normally COMMAND.COM). With this feature you can execute a batch file instead of a single program. For example: FIXER=%COMSPEC% /C FIXUP %1 If FIXUP is a batch file it will be executed with the archive name passed as the parameter. The /C option is to tell DOS to return to the calling program (ZZAP) when execution has been completed. Caution! When you execute COMSPEC any error codes returned by programs will be unseen by ZZAP. See also PRE=, MID=, and POST=. Page 16 Chapter 7. Logging ZZAP Activity Chapter Eight Command Line Options There are a number of command line options that allow you to customize the behavior of ZZAP. These options can also be declared in the configuration file using the SWITCH= statement. Command line options override configuration file options. With the exception of the /E and /D switches, each option is a forward slash (/), a letter, and optionally followed by a plus (+) or minus (-). If the option is given but the plus or minus is omitted then plus is assumed, e.g. /A is equivalent to /A+. Plus (+) turns the option on and minus (-) turns the option off. /A Flag archives with HIDDEN, SYSTEM, or READ- ONLY files (default ON). /B Allow subdirectories. /C Call the BBS file description updating program. /D File date stamping. /E Extension of archive type to convert to. /F Create a list of files that were converted (default OFF). /I Ignore age of files. /K Keep the original archive (default OFF). /L Long Log file. /M Use expanded or extended memory when shelling (default ON). /N Convert archives nested within archives (default ON). /O Repack all archives to original archive type (default OFF) /P Prevent overwriting existing archives (default OFF). /R Recurs subdirectories (default OFF). /S Strip HIDDEN, SYSTEM, and READ-ONLY attributes (default OFF). /T Test mode only - no repacking (default OFF). /V Scan for viruses (default OFF). /X Enable self-extracting archive processing. /Z Enable/disable I/O redirection. 8.1 Flag Odd Attributes - /A If this option is ON any archive that contains a file with the HIDDEN, SYSTEM, or READ-ONLY attribute will be treated as a corrupt archive and be renamed to have a "!" as the second Chapter 8. Executing Compsec Page 17 character of the extension. Currently, only PKZIP, LHARC, and ICE support attributes within the archive. It is highly recommended that you have on either the /A or /S command at all times since most archiving programs will completely ignore hidden files, possibly resulting in lost files. The /S (strip attributes) command will override this command. 8.2 Allow subdirectories - B Some archive formats allow subdirectory information to be imbedded into the archive. By default, ZZAP treats archives with subdirectory information as BAD archives, leaving them for you to manually examine and process. If the archive format you are converting to supports subdirectories you can have this information automatically included in the conversion process by modifying the program options for the ARC and UNARC programs and including the /B option on the command line (or with the SWITCH= option). It is assumed that subdirectories that are created by the UNARC program will be child directories of ZZAP's temporary work subdirectory ZZAP. If a subdirectory is created elsewhere it will not be detected and the files contained therein will not be added to the new archive. Nested archives that are placed in created subdirectories will not be converted by ZZAP. *** WARNING *** Do not use the /B switch unless you are sure that the default archive configuration is properly configured to allow subdirectory information. Improper configuration will result in the failure of files to be included in the new subdirectory. It is URGED that you manually test all possible situations before trusting the /B switch in an unattended mode. The following archive programs can NOT be used to extract subdirectory information. This limitation is because the programs insist on creating the original subdirectories instead of creating the subdirectories as children of the current directory: DWC A495 PAK 2.10 This limitation may be removed in future versions of these programs or the limitation could be removed by changing the configuration of each of these programs in the ZZAP configuration file. This limitation does not exist for the creation of new archives, however, it should be noted that because the entire path is Page 18 Chapter 8. Command Line Options stored you may not have the subdirectory information that you desire. *** REPEAT OF WARNING *** allow subdirectory creation with extreme caution. It is highly recommended that you leave out the /B option and handle the subdirectories manual on a case-by-case basis. 8.3 Call Update Program - /C Turning this option on causes the fix-up program named in the configuration file (see FIXER=) to be executed after all conversions have been completed. This removes the necessity to execute the program after running ZZAP. Turning this option on also forces the /F option on as well. This option is ignored when using the Test Only mode (/T). 8.4 File Date Stamping - /D ZZAP provides three different options for setting the date and time of the archives after they have been converted. Immediately follow /D with one of three letters to indicate which stamping method to use: T Stamp with the current date and time (Today). L Stamp with the date and time of the most recent file contained in the archive (Latest). O Keep the original date and time of the archive (Original). Sysops may wish to use the /DO (original date) option in conjunction with the AGE= configuration file command. If your daily maintenance event is at midnight you should set AGE=2. After a file is successfully uploaded you should "TOUCH" the file with the current date and time. When the daily event occurs, only files that are one or two days old will be processed. Since there shouldn't be any one day old files (assuming a midnight event), only the files uploaded from the previous day will be processed. The default stamping method is /DL. 8.5 Target Extension - /E Overrides the DEFAULT= option in the configuration file. Follow immediately with a three letter extension, for example: Chapter 8. Command Line Options Page 19 ZZAP /EZIP *.LZH The above example will convert all LZH type archives in the current directory to ZIP archives. Unlike the DEFAULT= configuration file option, you must not precede the extension with a period. 8.6 File List - /F If the /F+ option is used the text file FILES.FIX will be created that lists each of the files converted. Each line contains a single entry, first is the full path and file name of the original file, followed by a single space, and finally the new file name (no path), for example: C:\ARCHIVES\MYARC.LZH MYARC.ZIP C:\ARCHIVES\ANOTHER.ZOO ANOTHER.ZIP C:\NEWSTUFF\JUNK.ICE JUNK.ZIP Files that are repacked to the same type (e.g. ZIP to ZIP) will also be listed in this file. Under some BBS list formats the file size, date, time, etc. are also stored along with the file name and description. It is up to the programmer of the filter to use or ignore unchanged file names as necessary. This option is ignored when using the Test Only mode (/T). This text file can be used by a filter program to modify any file list as used by most BBS systems to reflect the change of file names. Included with ZZAP is the program QFIX.EXE that modifies the file list format used by QuickBBS and many other BBS systems as well as the description file used by 4DOS. See the QFIX document file for additional information. A filter program for TBBS called DIRFIX has been written by Gary W. Funk. This program is also included with ZZAP by permission. I will be happy to provide some limited assistance in developing filter programs for other BBS list formats. If you develop a filter program that would be of interest to others, send a copy to me so I can make it available to other sysops. Appropriate acknowledgments will, of course, be given. 8.7 Ignore File Age - /I If you use the AGE= option to ignore files that are more than a specified number of days old you can override this with the /I command. Enabling the /I option will result in all files Page 20 Chapter 8. Command Line Options (matching the file specification) being processed, regardless of their age. 8.8 Keeping The Original - /K By default the original archive is deleted after the new archive is successfully created. To prevent the old archives from being deleted you need to turn ON the /K (keep) option. For example: ZZAP /K+ *.ARC This switch can be used in combination with any other option: ZZAP /K+ /R+ C:\*.ARC 8.9 Long Log file - /L The /L option is used to select between the long form log file, in which status reports of archive conversions are kept (original size, new size, difference in size, etc.) or the short form log file which only contains error messages. /L+ selects the long form while /L- selects the short form. The default is the short form log if the /L command is not used. 8.10 Expanded/Extended Memory - /M By default ZZAP will take advantage of expanded or extended memory while shelling to an archive program. This makes more memory available to the archiver and may mean the difference between success or failure in a tight memory system. If you do NOT wish expanded to be used include the /M- option on the command line. To use expanded memory a LIM 4.0 driver be installed as well as sufficient EMS to store the bulk of the program and data. To use extended memory an XMS driver such as HIMEM.SYS (available free from Microsoft) must be installed as well as sufficient extended memory to store the bulk of the program and data. 8.11 Convert Nested - /N If this option is on, any archives nested within an archive being converted will also be converted. All nested archive types supported will be converted to the default type. Nested archives are left unchanged (and untested!) if this option is off. Chapter 8. Command Line Options Page 21 8.12 Keep Original Archive Format - /O When on, all archives are repacked, but they retain their original archive type. Thus, a ZIP file will be repacked as a ZIP, a LZH file will be repacked as a LZH, etc., regardless of the default archive type. Nested archives will be converted to the parent archive's type if the /N switch is enabled, otherwise the nested archive will be untouched (and untested!). Self- extracting archives will be converted to the same type but without the SFX program code. Using this switch without the AGE= option could result in archives being processed several times if you use a wildcard for the extension. While this doesn't hurt anything it does waste time unnecessarily. This problem won't occur if you move archives to a new subdirectory after processing them with ZZAP. 8.13 Prevent Overwriting - /P By default an existing archive can be overwritten when converting. For example, if both TEST.ZIP and TEST.LZH exist and you convert TEST.LZH to a ZIP file, the original TEST.ZIP will be replaced by the new ZIP file (formerly TEST.LZH). If the /P option is turned on it will prevent this from occurring, in fact, any archive that would cause an overwrite would be completely ignored, without any status message being displayed. This option has no effect when using the Test Only mode (/T). 8.14 Subdirectory Recursion - /R If you have multiple subdirectories with archives you need to convert, you can either process each subdirectory individually or use the recursion feature of ZZAP. Subdirectory recursion means ZZAP will start at a given subdirectory and convert all archives in it and all archives in any child subdirectories. This feature is especially handy when you have a Bulletin Board System with a large number of specialized file areas. Subdirectory Recursion is invoked by the /R command line options. The following are valid command lines: ZZAP /R+ \FILES\T*.ZOO ZZAP /R+ \*.ARC ZZAP /R *.PAK ZZAP /R+/V+ *.* Page 22 Chapter 8. Command Line Options 8.15 Strip Attributes - /S The /S options will strip the HIDDEN, SYSTEM, and READ-ONLY attributes from all files contained in the archive before adding the files to the new archive. Note that most archiving programs do not support unusual attributes and will simply ignore files containing these three attributes. You should use either the /A or /S command if there is any chance of any of these three attributes being run across. Turning this option on will cause the /A option to be turned off. This option has no effect when using the Test Only mode (/T). 8.16 Test Only - /T If you merely wish to test the integrity of an archive and possibly run a virus check use the /T switch. All normal steps will be executed with the exception of the creation of the new archive. The date/time stamp of a archives will not be changed during the Test mode unless a /D command is explicitly stated, either in the configuration file with the OPTIONS= command, or on the command line. This feature would be more useful with SDN archives if PAK would return a nonzero exit code if the security envelope was missing. Unfortunately, as of version 2.10 it returns a code of zero as long as the archive is not corrupted (beyond the missing security envelope). 8.17 Virus Scan - /V The /V option will enable the virus scan option. You must have version 39 or greater of McAfee Associates virus scanning program SCAN.EXE placed on your execution PATH. If a virus is detected the archive will be treated as corrupted and an error message will be displayed and placed in the log file (if enabled). See also the SCANOPT= and VIRUSDIR= configuration file commands. 8.18 Self-extracting Archives - /X Enables or disables the processing of self-extracting archives when a wildcard is specified for the file extension. When enabled, files with the extension of EXE or COM will be checked Chapter 8. Command Line Options Page 23 to see if they are self-extracting archives as defined with the SFX= command. Files contained inside an archive are never checked as SFX files. Any EXE or COM program will be treated as a corrupted archive if it is not self-extracting. Examples: zzap /t *.exe The /X switch was not required since an explicit extension was specified. zzap /x *.* All archive types are converted to the default archive type. EXE and COM programs are also converted if they are self-extracting. 8.19 Enable/Disable CRC Verification - /Y Enables program file CRC verification. Before you can use this option you need to create a CRC data file with an entry for each program file you wish CRC verified. Consult the file MAKECRC.DOC for instructions to do this. The /Y switch allows you to enable and disable the CRC option without having to modify the configuration file. 8.20 Enable/Disable I/O Redirection - /Z Turning this option off disables all I/O redirection. ZZAP is configured to redirect all the output of the external programs to the NULL device to keep a clean screen. When you are having a problem with program configuration it is often helpful to turn off the redirection so you can see each phase of the conversion process. Using this command line switch is much easier than editing the configuration file to remove the redirection commands. This option is ON by default. Page 24 Chapter 8. Command Line Options Chapter Nine Locating The Configuration File ZZAP will try it's best to locate the configuration file. Upon execution it searches for the configuration file in the following order: 1. The current subdirectory. 2. The Subdirectory defined by the environment variable ZZAP=, e.g. ZZAP=C:\BIN. 3. The subdirectory ZZAP.EXE resides in (DOS 3.x only). 4. Each subdirectory defined by PATH in the environment. If you wish to keep the configuration file in a directory not on the PATH and still be able to execute ZZAP from any subdirectory you should set the environment variable: SET ZZAP=C:\STUFF If the configuration file can not be found ZZAP will halt with an error. Chapter 9. Command Line Options Page 25 Chapter Ten Running ZZAP ZZAP is fully configured for the major archiving programs. The only change in the configuration file you may need to make is the EXT= command to set your preferred default archive type. To run ZZAP, simply type ZZAP followed by the filename (wild- cards allowed). The filename MUST have an extension. If the extension is wild (*) then all archive types defined by UNARC= commands will be converted to the new archive type as defined by ARC=. The following are legal: ZZAP *.ZOO Converts all ZOO files in the default subdirectory to the new archive type or repacks ZOO files if that is the default extension. ZZAP \UPLOADS\AFILE.ZIP Converts AFILE.ZIP, located in the \UPLOADS subdirectory, to the new archiving type. ZZAP *.* Converts all archive types that are not the default format, in the current subdirectory, to the new archive type. When using a wild-card for the extension archives with the default extension will be ignored. To repack archives to the same type, e.g. ZIP to ZIP, you must explicitly state the extension. ZZAP *.ZIP If you wish to repack an archive to the same type you must explicitly name the extension as the default archive type is ignored when doing a wild card conversion (this is to avoid repacking the same archives every time you run ZZAP). If your default archive type is LZH simply give that as the extension to convert: ZZAP *.LZH When repacking an archive, all archive and file comments are lost. Page 26 Chapter 10. Locating The Configuration File Note that the /P and /K options are ignored when doing a repack. ZZAP can also accept multiple file names on the command line: ZZAP /V *.ZIP *.* Assuming a default archive type of ZIP, this example first repacks all ZIP files (and does a virus check) then converts all other types to ZIP format, also with a virus check. If the order had been changed, "ZZAP /V *.* *.ZIP", all archives would be converted to ZIP format then all ZIP files would be repacked, clearly not the intention. Chapter 10. Running ZZAP Page 27 Chapter Eleven Nested Archives It is not uncommon to find archives nested inside an archive. A program that includes source code may have the source code archived and placed within the main archive. ZZAP will properly handle this situation and convert the nested archives to the new format. If fact, it will even convert nested archives of a differing types. Theoretically, an unlimited amount of nesting can be handled, only limited by available memory, but this has only been tested one deep. If you do not wish nested archives to be converted you should use the /N- option on the command line or place it in the configuration file using the SWITCH= command. Page 28 Chapter 11. Running ZZAP Chapter Twelve When Good Files Go Bad If a file is found to be corrupted further processing on that file is halted and the archive is renamed to have a "!" as the second character of the extension, for example, "Z!P". If the corrupted archive is nested only the parent archive is renamed. You will have to manually unarc the archive to find the actual problem. ZZAP assumes that a file is corrupted when the "EXIT CODE" for the unarc program is nonzero. PAK version 1.0 is known to not return a proper error code so ZZAP will not work with it. I'm not sure which version they fixed the bug in. I do know that it works properly with PAK version 1.6. Just because ZZAP says an archive is corrupted does not necessarily mean it is true. When the archiving program returns a nonzero exit code ZZAP has know way of knowing what the code represents. Some of the reasons an archive might be flagged as bad are: o Archive is truly corrupted. o Insufficient memory, there was enough memory to execute the archiving program but not enough for the archiving program to properly process the archive. o Insufficient disk space. A very large archive can quickly eat up disk space. Even a seemingly small archive can suddenly expand into a big file. Font files, for example, typically compress to only 5% of the original size. A 72 point font can take more than 1Meg of disk space while requiring less than 100k when compressed. Keep in mind that ZZAP requires enough disk space to hold the original archive, the expanded files, and the new archive. Therefore, a 100k archive that expands to 500k and recompresses to 75k will temporarily require 675k of disk space. o Invalid archive version. When a new version of an archive program is released it often includes improved compression techniques that older versions of the program can not handle. Upgrade your archive software. Chapter 12. Nested Archives Page 29 o Command line options as defined in the configuration file are incorrect. Double check each ARC= and UNARC= command in the configuration file. o Archive program is corrupted. Make sure that your archiving programs are working properly. o Disk error. If your disk has a bad sector it could result in a unsuccessful archiving or unarchiving. Page 30 Chapter 12. When Good Files Go Bad Chapter Thirteen External Event Conversion Some bulletin board systems support timed "events". These events are used to automate the operation of the board. Using an event can make it possible for the bulletin board to automatically handle the conversion of any archive type to the type supported by the board. A BBS that automatically converts archive types could allow the callers to upload archives of virtually any type. Under FrontDoor, for example, you can use an external event for this process. An external event causes FrontDoor to terminate with a specified error level. The error level can then be queried to decide what should be done. Follows is a fragment from a possible batch file to do just this. This example assumes all new uploads are placed in the subdirectory "C:\UPLOADS". IF ERRORLEVEL 87 GOTO do_this IF ERRORLEVEL 86 GOTO arc_convert IF ERRORLEVEL 85 GOTO do_that REM convert all archive types to ZIP files :arc_convert zzap /f+ c:\uploads\*.* GOTO run_fd There is one problem with this type of system - what happens to the descriptions? Some BBS programs automatically place the file name and description in an ASCII file. If the file is then converted the filename is changed and would no longer match the name given with the description. The /F option and the QFIX program (included) handle the conversion for QuickBBS format file list. See QFIX.DOC for further information. See also the description of the /C options as well as the configuration file option FIXER= and other related options. Chapter 13. When Good Files Go Bad Page 31 Appendix A Sysop Recommendations If your BBS supports them, the following system is recommended: - When a new file is uploaded set its date to "Today's date", using a TOUCH program (or whatever means). - Set up an midnight "event" to process all new uploads. - Use the AGE=2 command in ZZAP.CFG. - Run ZZAP with /T /DO to test files already in the default archive format and retain the original date. - Run ZZAP with /DO to convert all archives to the default format and retain the original date. An alternate configuration is: - Create a subdirectory to hold of "Today's" uploads. - Create a subdirectory to hold all New (or this month's) uploads. - Set your system to convert/test archives at any desired time. - At conversion/test time: * Run ZZAP with /T to test all files already in the default archive format. Use your preferred date (/D) option. * Run ZZAP to convert all archives to the default format. Use your preferred date (/D) option. - Alternately: * Use the /O switch to repack all archives, keeping their original archive formats. Use your preferred /D date/time option. - Move all freshly tested/converted archive to the Monthly/New uploads subdirectory. Page 32 Appendix A. Sysop Recommendations Appendix B Exit Codes ZZAP will return exit codes upon termination. These exit codes can be used by a batch file to decide what steps should be taken after running ZZAP. The exit codes are 0 Normal termination - no errors, viruses, or corrupted archives. 1 Virus detected. 2 Corrupted archive. 3 Configuration file not found. 4 Not configured for given target extension. If you use the /O option ZZAP will continue processing other archives. This is so other archive types can still be repacked. 5 Couldn't create temporary directory. 6 Other fatal error. There is a possibility for both a corrupted archive and a virused archive to have been detected (bad day!). In this case an exit code of 1 (virus detected) will be returned, specifying the more critical situation. Appendix B. Exit Codes Page 33 Appendix C Acknowledgments Thanks to: o Ken Doebler and Dan Geatons for their many suggestions. o Randall Greylock (1:321/202.4) for pointing out an oddity with ZOO and many fine suggestions which were implemented. o Charles Falconer (1:141/488) for pointing out that I didn't handle unusual file attributes (which LHARC and PKZIP archives may retain) and other suggestions. Page 34 Appendix C. Acknowledgments Appendix D My Lawyer Made Me Do It - DWC is copyright (c)1986,87,88 Dean W. Cooper. - LHARC and ICE are copyright (c)1988,89 Haruyasu Yoshizaki-san. - LUE is copyright (c)1985 Vernon D. Buerg. - PAK is copyright (c)1988,89 NoGate Consulting - GSARC is copyright (c)1988 NoGate Consulting - PKARC/PKXARC and PKPAK/PKUNPAK are copyright (c)1986,87,88 PKWare, Inc. - PKZIP/PKUNZIP are copyright (c)1989 PkWare, Inc. - SQZ is copyright (c)1992 J I Hammarberg. - ZOO is copyright (c)1988 Rahul Dhesi - FrontDoor is copyright (c)1988,89 Scandinavian PC Systems and InterZone Software, Inc. - DIRFIX is copyright (c)1990 Gary W. Funk. Appendix D. My Lawyer Made Me Do It Page 35 Appendix E Version History Version 6.6 Changes =================== - Added CRC verification of program files. - Improved the SFX support. - Now, by default, only error messages are sent to the log file. The new /L switch turns on the long form log file with the conversion summaries. - Made a few minor changes to the screen to improve the readability of error messages. - The date and time stamps placed in the log file now use the format as defined by the country code. Version 6.5 Changes =================== - Further enhancements to the SFX routines. Added the NONSFX= and NESTEDSFX= configuration file commands. - Added the WORKDRIVE= configuration file command. - Added the NESTED= configuration file command. Version 6.4 Changes =================== - Added routines to detect and process self-extracting archives (SFX). - Changed the /X switch to /M, /X is now used to enable SFX support. Version 6.3 Changes =================== - Added the /O option (different from the older date related switch). Version 6.2 Changes =================== - The log file must now be specified in the environment. This allows ZZAP to log errors before the configuration file is read. - Can now read a file containing a list of files to convert. - Corrected an error in initialization that caused the /C+ switch to be ignored in some cases. Page 36 Appendix E. Version History Version 6.1 Changes =================== - Added the /B command line switch and support for subdirectory information in archives. - Slightly changed the way temporary files are handled to improve support on networked multi-line BBS's. Version 6.0 Changes =================== - Added the PRE=, MID=, and POST= configuration file commands. - Added support for %COMSPEC% when declaring programs to execute. - Added support for >> type output redirection. - Changed /T to /D. - A new test mode has been added. Using /T now initiates a test mode, no new archives are created. - The date/time stamp is left unaltered when using the /T command unless a /D option is explicitly stated. - Instead of searching the path for all of the UNARC programs at start-up, which can be a slow process if more than a few are defined, ZZAP now only searches for the programs when actually required. The full path, if found, is saved so that subsequent searches are not required. Version 5.9 Changes =================== - Changed the way temporary files are handled, ZZAP can now work with archive programs that insist on using a specific extension. Duplicate archives are not deleted until the new archive has been successfully created. - Added a few new error messages in the log file. - When I added input redirection capabilities I also introduced a bug that would could cause the wrong files to be closed when turning off redirection after an execute. This is now fixed. Version 5.8 Changes =================== - Removed the /O command line option and replaced it with the more versatile /T option. - Added the /I (ignore file age) command to the command line switches. - Added the AGE= command to the configuration file. ZZAP can now be configured to skip processing of files that are more than a specified number of days old. - Added an index to the documents - ZZAP is now DesqView aware. Appendix E. Version History Page 37 Version 5.7 Changes =================== - Added support for redirection of input for called programs. This will allow you to automatically add archives comments when converting to some archive formats. - Deleted the FIXOPT= configuration file command. Now the FIXER= command does double duty - defining the program name and options. Version 5.6 Changes =================== - Corrected a bug where a bad archive could not be successfully moved to a "bad directory" as defined by the BADDIR= configuration option. - If an archive contains subdirectory information and you have the unarc option set to create subdirectories, ZZAP will now handle this in a graceful manner by deleting the subdirectories that were created, treating the archive as bad, and logging an appropriate message. Formerly, ZZAP would crash when it was unable to remove its temporary work subdirectory. - When an archive nested inside another archive is found to be corrupt, only the parent archive (containing the corrupt child archive) will be moved to BADDIR instead of both the parent and child archives. - Stamped a new bug where a nested archive would be stored with its temporary name (*.Z!Z) as well as the old extension, resulting in larger archives. Version 5.5 Changes =================== - Due to a bug in my code the error code returned by SCAN.EXE was not being processed correctly. This could allow archives with infected programs to slip by. - Cleaned up the display of error and warning messages. - The log file is now only date/time stamped if something is actually done. - The number of files skipped due to the /P+ option is now displayed with other status information. Version 5.4 Changes =================== - Added the /C command line option. - Added the FIXER=, FIXOPT= and SCANOPT= configuration file commands. - Corrupted archives are renamed to have a "!" as the second character of the extension instead of "BAD" being the extension. Page 38 Appendix E. Version History Version 5.3 Changes =================== - Added support for "%1" to allow the archive file names to be in any position on the command line. - Corrected a bug where the /N command line switch was being ignored. - Bug corrected where the state of Keep (/K+) and/or PreventOverwrite (/P+) could be lost if more than one file is given on the command line. - On the switch status line, "on" is displayed in high- intensity. - Completely changed the way the /F option works and added the QFIX program. - Conversion of all archive types by indicating the wild- card extension (e.g. '*.*' was not working, corrected as of 5.3b. Version 5.2 Changes =================== - Fixed a bug where the stack would overflow and trash some internal data. - Fixed a bug where if /X- was used it wouldn't properly execute the external programs. - Removed the ZZAPARC= environmental variable, it is not longer needed with the addition of the /E command line switch. - Added the /N switch (convert nested archives). Default ON. Version 5.1 Changes =================== - Added the SWITCH= configuration file option. - Changed the way command line options are used. Version 5.0 Changes =================== - Completely rewrote most of the file searching routines. - Now supports repacking any archive type, e.g. ZIP to ZIP. - Added a switch to prevent overwriting of existing archives. Appendix E. Version History Page 39 Version 4.8 Changes =================== - Added support for output redirection. - ZZAP always thought the bad archive directory (BADDIR=) didn't exist - whether it did or not. - Now supports moving a BAD archive to a different drive. - If BADDIR is defined and the subdirectory exists the file will be moved their and the extension will NOT be changed to .BAD. The extension will be changed to .BAD if BADDIR is not defined or does not exist. Version 4.7 Changes =================== - Added the DEFAULT= command in the configuration file. - Changed the ZZAPARC environmental variable so that it only requires the file extension. - Changed the ARC= command in the configuration file so that multiple archiving programs can be listed. - Added the /S (strip attributes) command line option. - Added support for extended memory during archive program executing. - The BBS list routine was not working properly if the filenames in the list file were not upper-case. Version 4.6 Changes =================== - Added support for virus scanning using McAfee Associates SCAN.EXE program. - Added the BADDIR configuration option. - Improved the error detection code. Version 4.5 Changes =================== - Added support for multiple file names on the command line. - Removed bug where ZZAP returned an error message if no file name was given on the command line. Version 4.4 Changes =================== - ZZAP wasn't properly reading the exit code of the unarcing programs. This resulting in some bad archives slipping by. Version 4.3 Changes =================== - Cosmetic changes and code optimization. Page 40 Appendix E. Version History Version 4.2 Changes =================== - Trivial B.S. hardly worth mentioning. Version 4.1 Changes =================== - Corrected a fatal bug introduced in 4.0 that would cause ZZAP to lose files under PKARC/PKPAK. - Removed a bug which resulted in the "home" path (DOS 3.x only) not being located properly. Version 4.0 Changes =================== - Changed the "/I" option to "/A" - makes more sense. Log more information about nonstandard file attributes in the log file. - Now supports expanded memory (LIM 4.0 only) when shelling, thus making available more conventional memory when running the archiving programs. Appendix E. Version History Page 41 Index A F AGE= 20 File date stamping 10, 17 Archive Programs Supported 4 Filter 20 Attributes 17 Fix-up program 10 Flag funny 17, 23 Strip 17, 18, 22 H Halting ZZAP 3 B BBS download list 10 I I/O redirection 17 C Command Line Options 17 K Command line options Keep 17, 21 /A 17 /B 17, 18 L /C 17, 19 License Agreement 1 /D 10, 17, 19 List 17, 20 /E 17, 19 Locating The Configuration /F 17, 19, 20 File 25 /I 10, 17, 20 Log 15 /K 17, 21 Logging ZZAP Activity 15 /L 17, 21 Long Log File 17 /M 17, 21 /N 17, 21 N /O 17, 21 Nested Archives 17, 28 /P 17, 22 /R 17, 22 O /S 17, 22 Original Format 17 /T 17, 23 /V 17, 23 P /X 17, 23 Path 25 /Y 24 POST= 12 /Z 17, 24 PRE= 12 Configuration File 5 Prevent overwrite 17 Configuration File 25 Q D QuickBBS 10 Default Extension 7, 17, 19 Description fix-up 17, 19 R DIRFIX 20 Redirection 5, 6, 7 Redirection error 6 E Repack 26 Environment 25 Running ZZAP 3, 26 Escape 3 Executing Compsec 16 S Expanded Memory 17, 21 SCANV 14, 17, 23 Extended Memory 17, 21 Self-extracting archives 17, External Event Conversion 31 23 Page 42 Index SFX 17, 23 V Subdirecties 17, 18 Viruses 14, 17, 23 Subdirectories 7 Subdirectory recursion 17 W Summary of Features 2 When Good Files Go Bad 29 Switches 9, 17 Wild-cards 26 T Z Temporary subdirectory 11 ZZAPLOG= 15 Test mode 17, 19, 20, 22, 23 Index Page 43 Contents Chapter 1 License Agreement 1 Chapter 2 Summary of Features 2 Chapter 3 Running ZZAP 3 Chapter 4 Archive Programs Supported 4 Chapter 5 Configuration File 5 5.1 ARC= . . . . . . . . . . . . . . . . . . . . 5 5.2 UNARC= . . . . . . . . . . . . . . . . . . . 6 5.3 DEFAULT= . . . . . . . . . . . . . . . . . . 7 5.4 NESTED= . . . . . . . . . . . . . . . . . . . 8 5.5 WORKDRIVE= . . . . . . . . . . . . . . . . . 8 5.6 NESTEDARC= . . . . . . . . . . . . . . . . . 8 5.7 BADDIR= . . . . . . . . . . . . . . . . . . . 9 5.8 VIRUSDIR= . . . . . . . . . . . . . . . . . . 9 5.9 SWITCH= . . . . . . . . . . . . . . . . . . . 9 5.10 FIXER= . . . . . . . . . . . . . . . . . . 10 5.11 AGE= . . . . . . . . . . . . . . . . . . . 10 5.12 PRE= . . . . . . . . . . . . . . . . . . . 10 5.13 MID= . . . . . . . . . . . . . . . . . . . 11 5.14 POST= . . . . . . . . . . . . . . . . . . 12 5.15 SFX= . . . . . . . . . . . . . . . . . . . 12 5.16 NONSFX= . . . . . . . . . . . . . . . . . 13 5.17 NESTEDSFX= . . . . . . . . . . . . . . . . 13 5.18 SCANOPT= . . . . . . . . . . . . . . . . . 14 5.19 WORKDRV= . . . . . . . . . . . . . . . . . 14 Chapter 6 Logging ZZAP Activity 15 Chapter 7 Executing Compsec 16 Chapter 8 Command Line Options 17 8.1 Flag Odd Attributes - /A . . . . . . . . . 17 8.2 Allow subdirectories - B . . . . . . . . . 18 8.3 Call Update Program - /C . . . . . . . . . 19 8.4 File Date Stamping - /D . . . . . . . . . . 19 8.5 Target Extension - /E . . . . . . . . . . . 19 8.6 File List - /F . . . . . . . . . . . . . . 20 8.7 Ignore File Age - /I . . . . . . . . . . . 20 8.8 Keeping The Original - /K . . . . . . . . . 21 8.9 Long Log file - /L . . . . . . . . . . . . 21 8.10 Expanded/Extended Memory - /M . . . . . . 21 8.11 Convert Nested - /N . . . . . . . . . . . 21 8.12 Keep Original Archive Format - /O . . . . 22 8.13 Prevent Overwriting - /P . . . . . . . . . 22 i 8.14 Subdirectory Recursion - /R . . . . . . . 22 8.15 Strip Attributes - /S . . . . . . . . . . 23 8.16 Test Only - /T . . . . . . . . . . . . . . 23 8.17 Virus Scan - /V . . . . . . . . . . . . . 23 8.18 Self-extracting Archives - /X . . . . . . 23 8.19 Enable/Disable CRC Verification - /Y . . . 24 8.20 Enable/Disable I/O Redirection - /Z . . . 24 Chapter 9 Locating The Configuration File 25 Chapter 10 Running ZZAP 26 Chapter 11 Nested Archives 28 Chapter 12 When Good Files Go Bad 29 Chapter 13 External Event Conversion 31 Appendix A Sysop Recommendations 32 Appendix B Exit Codes 33 Appendix C Acknowledgments 34 Appendix D My Lawyer Made Me Do It 35 Appendix E Version History 36 Index 42 ii