zoo

Hurricane Electric Internet Services: Accounts starting at $9.95/month
Hurricane Electric Internet Services

NAME

       zoo - manipulate archives of files in compressed form


SYNOPSIS

       zoo {acfDeghHlLPTuUvVx}[aAcCdEfghImMnNoOpPqSu1:/.@n+-=]
       archive [file] ...
       zoo -command archive [file] ...
       zoo h


DESCRIPTION

       Zoo is used to create and maintain collections of files in
       compressed form.  It uses a Lempel-Ziv compression algo-
       rithm that gives space savings in the range of 20% to 80%
       depending on the type of file data.  Zoo can store and
       selectively extract multiple generations of the same file.
       Data can be recovered from damaged archives by skipping
       the damaged portion and locating undamaged data with the
       help of fiz(1).

       This documentation is for version 2.1.  Changes from pre-
       vious versions are described in the section labelled
       CHANGES.

       The command zoo h gives a summary of commands.  Extended
       multiscreen help can be obtained with zoo H.

       Zoo will not add an archive to itself, nor add the
       archive's backup (with .bak extension to the filename) to
       the archive.

       Zoo has two types of commands:  Expert commands, which
       consist of one command letter followed by zero or more
       modifier characters, and Novice commands, which consist of
       a hyphen (`-') followed by a command word that may be
       abbreviated.  Expert commands are case-sensitive but
       Novice commands are not.

       When zoo adds a file to an existing archive, the default
       action is to maintain one generation of each file in an
       archive and to mark any older generation as deleted.  A
       limit on the number of generations to save can be speci-
       fied by the user for an entire archive, or for each file
       individually, or both.  Zoo deletes a stored copy of an
       added file if necessary to prevent the number of stored
       generations from exceeding the user-specified limit.

       Deleted files may be later undeleted.  Archives may be
       packed to recover space occupied by deleted files.

       All commands assume that the archive name ends with the
       characters .zoo unless a different extension is supplied.

       Novice commands

       Novice commands may be abbreviated to a hyphen followed by
       at least one command character.  Each Novice command works
       in two stages.  First, the command does its intended work.
       Then, if the result was that one or more files were
       deleted in the specified archive, the archive is packed.
       If packing occurs, the original unpacked archive is always
       left behind with an extension of .bak.

       No Novice command ever stores the directory prefix of a
       file.

       The Novice commands are as follows.


       -add    Adds the specified files to the archive.


       -freshen
              Adds a specified file to the archive if and only if
              an older file by the same name already exists in
              the archive.


       -delete
              Deletes the specified files from the archive.


       -update
              Adds a specified file to the archive either:  if an
              older file by the same name already exists in the
              archive or:  if a file by the same name does not
              already exist in the archive.


       -extract
              Extracts the specified files from the archive.  If
              no file is specified all files are extracted.


       -move  Equivalent to -add except that source files are
              deleted after addition.


       -print Equivalent to -extract except that extracted data
              are sent to standard output.


       -list  Gives information about the specified archived
              files including any attached comments.  If no files
              are specified all files are listed.  Deleted files
              are not listed.


       -test  Equivalent to -extract except that the extracted
              data are not saved but any errors encountered are
              reported.


       -comment
              Allows the user to add or update comments attached
              to archived files.  When prompted, the user may:
              type a carriage return to skip the file, leaving
              any current comment unchanged;  or type a (possibly
              null) comment of up to 32,767 characters terminated
              by /end (case-insensitive) on a separate line;  or
              type the end-of-file character (normally control D)
              to skip all remaining files.


       -delete
              Deletes the specified files.

       The correspondence between Novice and Expert commands is as follows.


       Novice                                        Equivalent
       Command    Description                        Expert Command
       -------------------------------------------------------------
       -add       add files to archive               aP:
       -extract   extract files from archive         x
       -move      move files to archive              aMP:
       -test      test archive integrity             xNd
       -print     extract files to standard output   xp
       -delete    delete files from archive          DP
       -list      list archive contents              VC
       -update    add new or newer files             aunP:
       -freshen   by add newer files                 auP:
       -comment   add comments to files              c


       Expert commands

       The general format of expert commands is:

       zoo {acfDeghHlLPTuUvVx}[aAcCdEfghImMnNoOpPqSu1:/.@n+-=]
       archive [file] ...

       The characters enclosed within {} are commands.  Choose
       any one of these.  The characters enclosed within [] just
       to the right of the {} are modifiers and zero or more of
       these may immediately follow the command character.  All
       combinations of command and modifier characters may not be
       valid.

       Files are added to an archive with the command:

       zoo {au}[cfhIMnPqu:+-] archive [file] ...

       Command characters are:


       a      Add each specified file to archive.  Any already-
              archived copy of the file is deleted if this is
              necessary to avoid exceeding the user-specified
              limit on the number of generations of the file to
              maintain in the archive.


       u      Do an update of the archive.  A specified file is
              added to the archive only if a copy of it is
              already in the archive and the copy being added is
              newer than the copy already in the archive.

       The following modifiers are specific to these commands.


       M      Move files to archive.  This makes zoo delete
              (unlink) the original files after they have been
              added to the archive.  Files are deleted after
              addition of all files to the archive is complete
              and after any requested packing of the archive has
              been done, and only if zoo detected no errors.


       n      Add new files only.  A specified file is added only
              if it isn't already in the archive.


       h      Use the high performance compression algorithm.
              This option may be used with either the add (a) or
              filter (f) commands to gain extra compression at
              the expense of using somewhat more processor time.
              Extracting files compressed with the method is usu-
              ally slightly faster than those saved with the
              default method.


       P      Pack archive after files have been added.


       u      Applied to the a command, this modifier makes it
              behave identically to the u command.

              The combination of the n modifier with the u modi-
              fier or u command causes addition of a file to the
              archive either if the file is not already in the
              archive, or if the file is already in the archive
              but the archived copy is older than the copy being
              added.


       :      Do not store directory names.  In the absence of
              this modifier zoo stores the full pathname of each
              archived file.


       I      Read filenames to be archived from standard input.
              Zoo will read its standard input and assume that
              each line of text contains a filename.  Under Ami-
              gaDOS and the **IX family, the entire line is used.
              Under MS-DOS and VAX/VMS, zoo assumes that the
              filename is terminated by a blank, tab, or newline;
              thus it is permissible for the line of text to con-
              tain more than one field separated by white space,
              and only the first field will be used.

              Under the **IX family of operating systems, zoo can
              be used as follows in a pipeline:

                 find . -print | zoo aI sources



            If the I modifier is specified, no filenames may be
            supplied on the command line itself.


       +,-    These modifiers take effect only if the a command
              results in the creation of a new archive.  + causes
              any newly-created archive to have generations
              enabled.  - is provided for symmetry and causes any
              newly-created archive to have generations disabled;
              this is also the default if neither + nor - is
              specified.

       Files are extracted from an archive with the command:

       zoo {ex}[dNoOpqS./@] archive [file] ...

       The e and x commands are synonymous.  If no file was spec-
       ified, all files are extracted from the archive.

       The following modifiers are specific to the e and x com-
       mands:


       N      Do not save extracted data but report any errors
              encountered.


       O      Overwrite files.  Normally, if a file being
              extracted would overwrite an already-existing file
              of the same name, zoo asks you if you really want
              to overwrite it.  You may answer the question with
              `y', which means yes, overwrite; or `n', which
              means no, don't overwrite; or `a', which means
              assume the answer is `y' for this and all subse-
              quent files.  The O modifier makes zoo assume that
              files may always be overwritten.  Neither answering
              the question affirmatively nor using O alone will
              cause read-only files to be overwritten.

              On **IX systems, however, doubling this modifier as
              OO will force zoo to unconditionally overwrite any
              read-protected files with extracted files if it can
              do so.

              The O, N, and p modifiers are mutually exclusive.


       S      Supersede newer files on disk with older extracted
              files.  Unless this modifier is used, zoo will not
              overwrite a newer existing file with an older
              extracted file.


       o      This is equivalent to the O modifier if and only if
              it is given at least twice.  It is otherwise
              ignored.


       p      Pipe extracted data to standard output.  Error mes-
              sages are piped to standard output as well.  How-
              ever, if a bad CRC is detected, an error message is
              sent both to standard error and to standard output.


       /      Extract to original pathname.  Any needed directo-
              ries must already exist.  In the absence of this
              modifier all files are extracted into the current
              directory.  If this modifier is doubled as //,
              required directories need not exist and are created
              if necessary.

       The management of multiple generations of archived files
       is done with the commands:

       zoo gl[Aq]{+-=}number archive files ..
       zoo gc[q]{+-=}number archive files ..
       zoo gA[q]- archive
       zoo gA[q]+ archive

       The first form, gl, adjusts the generation limit of
       selected files by the specified value.  If the form =n is
       used, where n is a decimal number, this sets the genera-
       tion limit to the specified value.  If + or - are used in
       placed of = the effect is to increment or decrement the
       generation limit by the specified value.  For example, the
       command

            zoo gl=5 xyz :


       sets the generation limit of each file in the archive
       xyz.zoo to a value of 5.  The command

            zoo gl-3 xyz :


       decrements the generation limit of each file in the
       archive to 3 less than it currently is.

       If the A modifier is used, the archive-wide generation
       limit is adjusted instead.

       The number of generations of a file maintained in an
       archive is limited by the file generation limit, or the
       archive generation limit, whichever is lower.  As a spe-
       cial case, a generation limit of 0 stands for no limit.
       Thus the default file generation limit of 0 and archive
       generation limit of 3 limits the number of generations of
       each file in a newly-created archive to three.

       The generation limit specified should be in the range 0
       through 15;  any higher numbers are interpreted modulo 16.

       The second form of the command, using gc, adjusts the gen-
       eration count of selected files.  Each file has a genera-
       tion count of 1 when it is first added to an archive.
       Each time a file by the same name is added again to an
       archive, it receives a generation count that is one higher
       than the highest generation count of the archived copy of
       the file.  The permissible range of generation counts is 1
       through 65535.  If repeated manipulations of an archive
       result in files having very high generation counts, they
       may be set back to lower numbers with the gc command.  The
       syntax of the command is analogous to the syntax of the gl
       command, except that the A modifier is not applicable to
       the gc command.

       The third form, gA-, disables generations in an archive.
       Generations are off when an archive is first created, but
       may be enabled with the fourth form of the command, gA+.
       When generations are disabled in an archive, zoo will not
       display generation numbers in archive listings or maintain
       multiple generations.  Generations can be re-enabled at
       any time, though manipulation of an archive with repeated
       interspersed gA- and gA+ commands may result in an archive
       whose behavior is not easily understandable.

       Archived files are listed with the command:

       zoo {lLvV}[aAcCdfgmqvV@/1+-] archive[.zoo] [file] ...

       l      Information presented includes the date and time of
              each file, its original and current (compressed)
              sizes, and the percentage size decrease due to com-
              pression (labelled CF or compression factor).  If a
              file was added to the archive in a different time-
              zone, the difference between timezones is shown in
              hours as a signed number.  As an example, if the
              difference is listed as +3, this means that the
              file was added to the archive in a timezone that is
              3 hours west of the current timezone.  The file
              time listed is, however, always the original times-
              tamp of the archived file, as observed by the user
              who archived the file, expressed as that user's
              local time.  (Timezone information is stored and
              displayed only if the underlying operating system
              knows about timezones.)

              If no filename is supplied all files are listed
              except deleted files.

              Zoo selects which generation(s) of a file to list
              according to the following algorithm.

              If no filename is supplied, only the latest genera-
              tion of each file is listed.  If any filenames are
              specified, and a generation is specified for an
              argument, only the requested generation is listed.
              If a filename is specified ending with the genera-
              tion character (`:' or `;'), all generations of
              that file are listed.  Thus a filename argument of
              the form zoo.c will cause only the latest genera-
              tion of zoo.c to be listed;  an argument of the
              form zoo.c:4 will cause generation 4 of zoo.c to be
              listed;  and an argument of the form zoo.c: or
              zoo.c:* will cause all generations of zoo.c to be
              listed.


       L      This is similar to the l command except that all
              supplied arguments must be archives and all non-
              deleted generations of all files in each archive
              appear in the listing.

              On **IX systems, on which the shell expands argu-
              ments, if multiple archives are to be listed, the L
              command must be used.  On other systems (VAX/VMS,
              AmigaDOS, MSDOS) on which wildcard expansion is
              done internally by zoo, wildcards may be used in
              the archive name, and a multiple archive listing
              obtained, using the l command.


       v      This causes any comment attached to the archive to
              be listed in addition to the other information.

       V      This causes any comment attached to the archive and
              also any comment attached to each file to be
              listed.

              Both the V and v command characters can also be
              used as modifiers to the l and L commands.

       In addition to the general modifiers described later, the
       following modifiers can be applied to the archive list
       commands.


       a      This gives a single-line format containing both
              each filename and the name of the archive, sorted
              by archive name.  It is especially useful with the
              L command, since the result can be further sorted
              on any field to give a master listing of the entire
              contents of a set of archives.


       A      This causes any comment attached to the archive to
              be listed.


       g      This modifier causes file generation information to
              be listed about the archive.  For each file listed,
              the user-specified generation limit, if any, is
              listed.  For example, `3g' for a file means that
              the user wants no more than three generations of
              the file to be kept.  In archives created by older
              versions of zoo, the listing will show `-g', mean-
              ing that no generation information is kept and mul-
              tiple generations of the file are not being main-
              tained.

              In addition to the generation information for each
              file, the archive-wide generation limit, if any, is
              shown at the end of the listing.  If generations
              have been disabled by the user, this is so indi-
              cated, for example:

                 Archive generation limit is 3 (generations off).

            For more information about generations see the
            description of the g command.


       m      This modifier is currently applicable to **IX sys-
              tems only.  It causes the mode bits (file protec-
              tion code) of each file to be listed as a three-
              digit octal number.  Currently zoo preserves only
              the lowest nine mode bits.  Their meanings are as
              described in the **IX documentation for the
              chmod(1) command.

       C      This modifier causes the stored cyclic redundancy
              code (CRC) for each archived file to be shown as a
              four-digit hexadecimal number.


       1      This forces one filename to be listed per line.  It
              is most useful in combination with the f modifier.

       /      This forces any directory name to be always listed,
              even in fast columnized listings that do not nor-
              mally include any directory names.


       +,-    The - modifier causes trailing generation numbers
              to be omitted from filenames.  The + modifier
              causes the trailing generation numbers to be shown,
              which is also the default if neither - nor + is
              specified.

       Files may be deleted and undeleted from an archive with
       the following commands:

       zoo {DU}[Pq1] archive file ...

       The D command deletes the specified files and the U com-
       mand undeletes the specified files.  The 1 modifier (the
       digit one, not the letter ell) forces deletion or undele-
       tion of at most one file.  If multiple instances of the
       same file exist in an archive, use of the 1 modifier may
       allow selective extraction of one of these.

       Comments may be added to an archive with the command:

       zoo c[A] archive

       Without the modifier A, this behaves identically to the
       -comment command.  With the modifier A, the command serves
       to add or update the comment attached to the archive as a
       whole.  This comment may be listed with the lA, LA, v, and
       V commands.  Applying the cA command to an archive that
       was created with an older version of zoo will result in an
       error message requesting that the user first pack the
       archive with the P command.  This reorganizes the archive
       and creates space for the archive comment.

       The timestamp of an archive may be adjusted with the com-
       mand:

       zoo T[q] archive

       Zoo normally attempts to maintain the timestamp of an
       archive to reflect the age of the newest file stored in
       it.  Should the timestamp ever be incorrect it can be
       fixed with the T command.
       An archive may be packed with the command:

       zoo P[EPq] archive

       If the backup copy of the archive already exists, zoo will
       refuse to pack the archive unless the P modifier is also
       given.  The E modifier causes zoo not to save a backup
       copy of the original archive after packing.  A unique tem-
       porary file in the current directory is used to initially
       hold the packed archive.  This file will be left behind if
       packing is interrupted or if for some reason this file
       cannot be renamed to the name of the original archive when
       packing is complete.

       Packing removes any garbage data appended to an archive
       because of Xmodem file transfer and also recovers any
       wasted space remaining in an archive that has been fre-
       quently updated or in which comments were replaced.  Pack-
       ing also updates the format of any archive that was cre-
       ated by an older version of zoo so that newer features
       (e.g. archive-wide generation limit, archive comment)
       become fully available.

       Zoo can act as a pure compression or uncompression filter,
       reading from standard input and writing to standard out-
       put.  This is achieved with the command:

       zoo f{cu}[h]

       where c specifies compression, u specifies uncompression,
       and h used in addition requests the high-performance com-
       pression be used.  A CRC value is used to check the
       integrity of the data.  The compressed data stream has no
       internal archive structure and contains multiple files
       only if the input data stream was already structured, as
       might be obtained, for example, from tar or cpio.

        Modem transfers can be speeded up with these commands:

                 zoo fc < file | sz ...  rz | zoo fu > file




       General modifiers


       The following modifiers are applicable to several com-
       mands:


       c      Applied to the a and u commands, this causes the
              user to be prompted for a comment for each file
              added to the archive.  If the file being added has
              replaced, or is a newer generation of, a file
              already in the archive, any comment attached to
              that file is shown to the user and becomes attached
              to the newly-added file unless the user changes it.
              Possible user responses are as described for the
              -comment command.  Applied to the archive list com-
              mand l, the c modifier causes the listing of any
              comments attached to archived files.


        .     In conjunction with / or // this modifier causes
              any extracted pathname beginning with `/' to be
              interpreted relative to the current directory,
              resulting in the possible creation of a subtree
              rooted at the current directory.  In conjunction
              with the command P the .  modifier causes the
              packed archive to be created in the current direc-
              tory.  This is intended to allow users with limited
              disk space but multiple disk drives to pack large
              archives.


       d      Most commands that act on an archive act only on
              files that are not deleted.  The d modifier makes
              commands act on both normal and deleted files.  If
              doubled as dd, this modifier forces selection only
              of deleted files.


       f      Applied to the a and u commands, the f modifier
              causes fast archiving by adding files without com-
              pression.  Applied to l it causes a fast listing of
              files in a multicolumn format.


       q      Be quiet.  Normally zoo lists the name of each file
              and what action it is performing.  The q modifier
              suppresses this.  When files are being extracted to
              standard output, the q modifier suppresses the
              header preceding each file.  When archive contents
              are being listed, this modifier suppresses any
              header and trailer.  When a fast columnized listing
              is being obtained, this modifier causes all output
              to be combined into a single set of filenames for
              all archives being listed.

              When doubled as qq, this modifier suppresses WARN-
              ING messages, and when tripled as qqq, ERROR mes-
              sages are suppressed too.  FATAL error messages are
              never suppressed.




       Recovering data from damaged archives

       The @ modifier allows the user to specify the exact posi-
       tion in an archive where zoo should extract a file from,
       allowing damaged portions of an archive to be skipped.
       This modifier must be immediately followed by a decimal
       integer without intervening spaces, and possibly by a
       comma and another decimal integer, giving a command of the
       form l@m or l@m,n (to list archive contents) or x@m or
       x@m,n (to extract files from an archive).  Listing or
       extraction begin at position m in the archive.  The value
       of m must be the position within the archive of an undam-
       aged directory entry.  This position is usually obtained
       from fiz(1) version 2.0 or later.

       If damage to the archive has shortened or lengthened it,
       all positions within the archive may be changed by some
       constant amount.  To compensate for this, the value of n
       may be specified.  This value is also usually obtained
       from fiz(1).  It should be the position in the archive of
       the file data corresponding to the directory entry that
       has been specified with m.  Thus if the command x@456,575
       is given, it will cause the first 456 bytes of the archive
       to be skipped and extraction to begin at offset 456;  in
       addition, zoo will attempt to extract the file data from
       position 575 in the archive instead of the value that is
       found in the directory entry read from the archive.  For
       example, here is some of the output of fiz when it acts on
       a damaged zoo archive:

       ****************
           2526: DIR  [changes] ==>   95
           2587: DATA
       ****************
           3909: DIR  [copyrite] ==> 1478
           3970: DATA
           4769: DATA
       ****************

       In such output, DIR indicates where fiz found a directory
       entry in the archive, and DATA indicates where fiz found
       file data in the archive.  Filenames located by fiz are
       enclosed in square brackets, and the notation "==>   95"
       indicates that the directory entry found by fiz at posi-
       tion 2526 has a file data pointer to position 95.  (This
       is clearly wrong, since file data always occur in an
       archive after their directory entry.)  In actuality, fiz
       found file data at positions 2587, 3970, and 4769.  Since
       fiz found only two directory entries, and each directory
       entry corresponds to one file, one of the file data posi-
       tions is an artifact.


       In this case, commands to try giving to zoo might be
       x@2526,2587 (extract beginning at position 2526, and get
       file data from position 2587), x@3090,3970 (extract at
       3090, get data from 3970) and x@3909,4769 (extract at
       3909, get data from 4769).  Once a correctly-matched
       directory entry/file data pair is found, zoo will in most
       cases synchronize with and correctly extract all files
       subsequently found in the archive.  Trial and error should
       allow all undamaged files to be extracted.  Also note that
       self-extracting archives created using sez (the Self-
       Extracting Zoo utility for MS-DOS), which are normally
       executed on an MS-DOS system for extraction, can be
       extracted on non-MSDOS systems using zoo's damaged-archive
       recovery method using the @ modifier.


       Wildcard handling

       Under the **IX family of operating systems, the shell nor-
       mally expands wildcards to a list of matching files.
       Wildcards that are meant to match files within an archive
       must therefore be escaped or quoted.  When selecting files
       to be added to an archive, wildcard conventions are as
       defined for the shell.  When selecting files from within
       an archive, wildcard handling is done by zoo as described
       below.

       Under MS-DOS and AmigaDOS, quoting of wildcards is not
       needed.  All wildcard expansion of filenames is done by
       zoo, and wildcards inside directory names are expanded
       only when listing or extracting files but not when adding
       them.

       The wildcard syntax interpreted by zoo is limited to the
       following characters.


       *      Matches any sequence of zero or more characters.


       Matches any single character.

              Arbitrary combinations of * and ?  are allowed.


       /      If a supplied pattern contains a slash anywhere in
              it, then the slash separating any directory prefix
              from the filename must be matched explicitly.  If a
              supplied pattern contains no slashes, the match is
              selective only on the filename.


       c-c    Two characters separated by a hyphen specify a
              character range.  All filenames beginning with
              those characters will match.  The character range
              is meaningful only by itself or preceded by a
              directory name.  It is not specially interpreted if
              it is part of a filename.


       : and ;
              These characters are used to separate a filename
              from a generation number and are used when select-
              ing specific generations of archived files.  If no
              generation character is used, the filename speci-
              fied matches only the latest generation of the
              file.  If the generation character is specified,
              the filename and the generation are matched inde-
              pendently by zoo's wildcard mechanism.  If no gen-
              eration is specified following the : or ; charac-
              ter, all generations of that file will match.  As a
              special case, a generation number of 0 matches only
              the latest generation of a file, while ^0 matches
              all generations of a file except the latest one.
              If no filename is specified preceding the genera-
              tion character, all filenames will match.  As a
              corollary, the generation character by itself
              matches all generations of all files.

       MS-DOS users should note that zoo does not treat the dot
       as a special character, and it does not ignore characters
       following an asterisk.  Thus * matches all filenames; *.*
       matches filenames containing a dot; *_* matches filenames
       containing an underscore;  and *z matches all filenames
       that end with the character z, whether or not they contain
       a dot.


       Usage hints

       The Novice command set in zoo is meant to provide an
       interface with functionality and format that will be
       familiar to users of other similar archive utilities.  In
       keeping with this objective, the Novice commands do not
       maintain or use any subdirectory information or allow the
       use of zoo's ability to maintain multiple generations of
       files.  For this reason, users should switch to exclu-
       sively using the Expert commands as soon as possible.

       Although the Expert command set is quite large, it should
       be noted that in almost every case, all legal modifiers
       for a command are fully orthogonal.  This means that the
       user can select any combination of modifiers, and when
       they act together, they will have the intuitively obvious
       effect.  Thus the user need only memorize what each modi-
       fier does, and then can combine them as needed without
       much further thought.

       For example, consider the a command which is used to add
       files to an archive.  By itself, it simply adds the speci-
       fied files.  To cause only already-archived files to be
       updated if their disk copies have been modified, it is
       only necessary to add the u modifier, making the command
       au.  To cause only new files (i.e., files not already in
       the archive) to be added, the n modifier is used to create
       the command an.  To cause both already-archived files to
       be updated and new files to be added, the u and n modi-
       fiers can be used together, giving the command aun.  Since
       the order of modifiers is not significant, the command
       could also be anu.

       Further, the c modifier can be used to cause zoo to prompt
       the user for a comment to attach to each file added.  And
       the f modifier can cause fast addition (addition without
       compression).  It should be obvious then that the command
       auncf will cause zoo to update already-archived files, add
       new files, prompt the user for comments, and do the addi-
       tion of files without any compression.  Furthermore, if
       the user wishes to move files to the archive, i.e., delete
       the disk copy of each file after it is added to the
       archive, it is only necessary to add the M modifier to the
       command, so it becomes auncfM.  And if the user also
       wishes to cause the archive to be packed as part of the
       command, thus recovering space from any files that are
       replaced, the command can be modified to auncfMP by adding
       the P modifier that causes packing.

       Similarly, the archive listing commands can be built up by
       combining modifiers.  The basic command to list the con-
       tents of an archive is l.  If the user wants a fast colum-
       nized listing, the f modifier can be added to give the lf
       command.  Since this listing will have a header giving the
       archive name and a trailer summarizing interesting infor-
       mation about the archive, such as the number of deleted
       files, the user may wish to "quieten" the listing by sup-
       pressing these;  the relevant modifier is q, which when
       added to the command gives lfq.  If the user wishes to see
       the **IX mode (file protection) bits, and also information
       about multiple generations, the modifiers m (show mode
       bits) and g (show generation information) can be added,
       giving the command lfqmg.  If the user also wishes to see
       an attached archive comment, the modifier A (for archive)
       will serve.  Thus the command lfqmgA will give a fast
       columnized listing of the archive, suppressing any header
       and trailer, showing mode bits and generation information,
       and showing any comment attached to the archive as a
       whole.  If in addition individual comments attached to
       files are also needed, simply append the c modifier to the
       command, making it lfqmgAc.  The above command will not
       show any deleted files, however;  to see them, use the d
       modifier, making the command lfqmgAcd (or double it as in
       lfqmgAcdd if only the deleted files are to be listed).
       And if the user also wishes to see the CRC value for each
       file being listed, the modifier C will do this, as in the
       command lfqmgAcdC, which gives a fast columnized listing
       of all files, including deleted files, showing any archive
       comment and file comments, and file protection codes and
       generation information, as well as the CRC value of each
       file.

       Note that the above command lfqmgAcdC could also be abbre-
       viated to VfqmgdC because the command V is shorthand for
       lcA (archive listing with all comments shown).  Similarly
       the command v is shorthand for lA (archive listing with
       archive comment shown).  Both V and v can be used as modi-
       fiers to any of the other archive listing commands.


       Generations

       By default, zoo assumes that only the latest generation of
       a specified file is needed.  If generations other than the
       latest one need to be selected, this may be done by speci-
       fying them in the filename.  For example, the name stdio.h
       would normally refer to the latest generation of the file
       stdio.h stored in a zoo archive.  To get an archive list-
       ing showing all generations of stdio.h in the archive, the
       specification stdio.h:* could be used (enclosed in single
       quotes if necessary to protect the wildcard character *
       from the shell).  Also, stdio.h:0 selects only the latest
       generation of stdio.h, while stdio.h:^0 selects all gener-
       ations except the latest one.  The : character here sepa-
       rates the filename from the generation number, and the
       character * is a wildcard that matches all possible gener-
       ations.  For convenience, the generation itself may be
       left out, so that the name stdio.h: (with the : but with-
       out a generation number or a wildcard) matches all genera-
       tions exactly as stdio.h:* does.

       If a generation is specified but no filename is present,
       as in :5, :*, or just :, all filenames of the specified
       generation will be selected.  Thus :5 selects generation 5
       of each file, and :* and : select all generations of all
       files.

       It is important to note that zoo's idea of the latest gen-
       eration of a file is not based upon searching the entire
       archive.  Instead, whenever zoo adds a file to an archive,
       it is marked as being the latest generation.  Thus, if the
       latest generation of a file is deleted, then no generation
       of that file is considered the latest any more.  This can
       be surprising to the user.  For example, if an archive
       already contains the file stdio.h:5 and a new copy is
       added, appearing in the archive listing as stdio.h:6, and
       then stdio.h:6 is deleted, the remaining copy stdio.h:5
       will no longer be considered to be the latest generation,
       and the file stdio.h:5, even if undeleted, will no longer
       appear in an archive listing unless generation 5 (or every
       generation) is specifically requested.  This behavior will
       likely be improved in future releases of zoo.


FILES

       xXXXXXX - temporary file used during packing
       archive_name.bak - backup of archive


SEE ALSO

       compress(1), fiz(1)


BUGS

       When files are being added to an archive on a non-MS-DOS
       system, it is possible for zoo to fail to detect a full
       disk and hence create an invalid archive.  This bug will
       be fixed in a future release.

       Files with generation counts that wrap around from 65535
       to 1 are not currently handled correctly.  If a file's
       generation count reaches a value close to 65535, it should
       be manually set back down to a low number.  This may be
       easily done with a command such as gc-65000, which sub-
       tracts 65000 from the generation count of each specified
       file.  This problem will be fixed in a future release.

       Although zoo on **IX systems preserves the lowest nine
       mode bits of regular files, it does not currently do the
       same for directories.

       Currently zoo's handling of the characters : and ; in
       filenames is not robust, because it interprets these to
       separate a filename from a generation number.  A quoting
       mechanism will eventually be implemented.

       Standard input cannot be archived nor can a created
       archive be sent to standard output.  Spurious error mes-
       sages may appear if the filename of an archive is too
       long.

       Since zoo never archives any file with the same name as
       the archive or its backup (regardless of any path pre-
       fixes), care should be taken to make sure that a file to
       be archived does not coincidentally have the same name as
       the archive it is being added to.  It usually suffices to
       make sure that no file being archived is itself a zoo
       archive.  (Previous versions of zoo sometimes tried to add
       an archive to itself. This bug now seems to be fixed.)

       Only regular files are archived; devices and empty direc-
       tories are not.  Support for archiving empty directories
       and for preserving directory attributes is planned for the
       near future.

       Early versions of MS-DOS have a bug that prevents "." from
       referring to the root directory;  this leads to anomalous
       results if the extraction of paths beginning with a dot is
       attempted.

       VAX/VMS destroys case information unless arguments are
       enclosed in double quotes.  For this reason if a command
       given to zoo on a VAX/VMS system includes any uppercase
       characters, it must be enclosed in double quotes.  Under
       VAX/VMS, zoo does not currently restore file timestamps;
       this will be fixed as soon as I figure out RMS extended
       attribute blocks, or DEC supplies a utime() function,
       whichever occurs first.  Other VMS bugs, related to file
       structures, can often be overcome by using the program
       bilf.c that is supplied with zoo.

       It is not currently possible to create a zoo archive con-
       taining all zoo archives that do not contain themselves.


DIAGNOSTICS

       Error messages are intended to be self-explanatory and are
       divided into three categories.  WARNINGS are intended to
       inform the user of an unusual situation, such as a CRC
       error during extraction, or -freshening of an archive con-
       taining a file newer than one specified on the command
       line.  ERRORS are fatal to one file, but execution contin-
       ues with the next file if any.  FATAL errors cause execu-
       tion to be aborted.  The occurrence of any of these causes
       an exit status of 1.  Normal termination without any
       errors gives an exit status of 0.  (Under VAX/VMS, how-
       ever, to avoid an annoying message, zoo always exits with
       an error code of 1.)


COMPATIBILITY

       All versions of zoo on all systems are required to create
       archives that can be extracted and listed with all ver-
       sions of zoo on all systems, regardless of filename and
       directory syntax or archive structure;  furthermore, any
       version of zoo must be able to fully manipulate all
       archives created by all lower-numbered versions of zoo on
       all systems.  So far as I can tell, this upward compati-
       bility (all manipulations) and downward compatiblity
       (ability to extract and list) is maintained by zoo ver-
       sions up to 2.01.  Version 2.1 adds the incompatibility
       that if high-performance compression is used, earlier ver-
       sions cannot extract files compressed with version 2.1.
       This is the only incompatibility that is permissible.  You
       are forbidden, with the force of copyright law, to create
       from the zoo source code any derivative work that violates
       this compatibility goal, whether knowingly or through neg-
       ligence.  If any violation of this compatibility goal is
       observed, this should be considered a serious problem and
       reported to me.



CHANGES

       Here is a list of changes occurring from version 1.50 to
       version 2.01.  In parentheses is given the version in
       which each change occurred.

       -      (1.71) New modifiers to the list commands permit
              optional suppression of header and trailer informa-
              tion, inclusion of directory names in columnized
              listings, and fast one-column listings.

       -      (1.71) Timezones are handled.

       -      (1.71) A bug was fixed that had made it impossible
              to individually update comments for a file whose
              name did not correspond to MS-DOS format.

       -      (1.71) A change was made that now permits use of
              the shared library on the **IX PC.

       -      (1.71) VAX/VMS is now supported reasonably well.

       -      (2.00) A comment may now be attached to the archive
              itself.

       -      (2.00) The OO option allows forced overwriting of
              read-only files.

       -      (2.00) Zoo will no longer extract a file if a newer
              copy already exists on disk;  the S option will
              override this.

       -      (2.00) File attributes are preserved for **IX sys-
              tems.

       -      (2.00) Multiple generations of the same file are
              supported.

       -      (2.00) Zoo will now act as a compression or decom-
              pression filter on a stream of data and will use a
              CRC value to check the integrity of a data stream
              that is uncompressed.

       -      (2.00) A bug was fixed that caused removal of a
              directory link if files were moved to an archive by
              the superuser on a **IX system.

       -      (2.00) The data recovery modifier @ was greatly
              enhanced.  Self-extracting archives created for MS-
              DOS systems can now be extracted by zoo on any sys-
              tem with help from fiz(1).

       -      (2.01) A bug was fixed that had caused the first
              generation of a file to sometimes unexpectedly show
              up in archive listings.

       -      (2.01) A bug was fixed that had caused the MS-DOS
              version to silently skip files that could not be
              extracted because of insufficient disk space.

       -      (2.01) A bug was fixed that had sometimes made it
              impossible to selectively extract a file by speci-
              fying its name, even though all files could be
              extracted from the archive by not specifying any
              filenames.  This occurred when a file had been
              archived on a longer-filename system (e.g. Amiga-
              DOS) and extraction was attempted on a shorter-
              filename system (e.g. MS-DOS).

       -      (2.01) A change was made that will make zoo pre-
              serve the mode (file protection) of a zoo archive
              when it is packed.  This is effective only if zoo
              is compiled to preserve and restore file
              attributes.  Currently this is so only for **IX
              systems.

       -      (2.01) A bug was fixed that had caused an update of
              an archive to not always add all newer files.

       -      (2.01) Blanks around equal signs in commands given
              to "make" were removed from the mk* scripts for
              better compatiblity with more **IX implementations
              including Sun's.

       -      (2.1) Compression is now greatly improved if the
              "h" option is used.

       -      (2.1) The default behavior is to preserve full
              pathnames during extraction.

       -      (2.1) On some systems, extraction of files using
              the older (default) compression method is greatly
              speeded up.

       -      (2.1) Extended multiscreen help is available.

       -      (2.1) Memory allocation is improved, so that the
              MS-DOS version will not prematurely abort when
              updating a large archive.

       -      (2.1) The VAX/VMS version preserves file timestamps
              during extraction.

       -      (2.1) The default archive-wide generation limit,
              when generations are enabled, is 3.


FUTURE DIRECTIONS

       A revised version of zoo is in the works that will be able
       to write newly-created archives to standard output and
       will support multivolume archives.  It will be upward and
       downward compatible with this version of zoo.


ACKNOWLEDGEMENTS

       The zoo archiver was initially developed using Microsoft C
       3.0 on a PC clone manufactured by Toshiba of Japan and
       almost sold by Xerox.  Availability of the following sys-
       tems was helpful in achieving portability: Paul Homchick's
       Compaq running Microport System V/AT;  The Eskimo BBS
       somewhere in Oregon running Xenix/68000; Greg Laskin's
       system 'gryphon' which is an Intel 310 running Xenix/286;
       Ball State University's AT&T 3B2/300, UNIX PC, and
       VAX-11/785 (4.3BSD and VAX/VMS) systems.  In addition J.
       Brian Waters provided feedback to help me make the code
       compilable on his Amiga using Manx/Aztec C.  The exe-
       cutable version 2.0 for MS-DOS is currently compiled with
       Borland's Turbo C++ 1.0.

       Thanks are due to the following people and many others too
       numerous to mention.

       J. Brian Waters <jbwaters@bsu-cs.bsu.edu>, who has worked
       diligently to port zoo to AmigaDOS, created Amiga-specific
       code, and continues keeping it updated.

       Paul Homchick <rutgers!cgh!paul>, who provided numerous
       detailed reports about some nasty bugs.

       Bill Davidsen <davidsen@crdos1.crd.ge.com>, who provided
       numerous improvements to this manual, contributed multi-
       screen help, and provided many useful bug reports, bug
       fixes, code improvements, and suggestions.

       Mark Alexander <amdahl!drivax!alexande>, who provided me
       with some bug fixes.

       Haruhiko Okumura, who wrote the ar archiver and some
       excellent compression code, which I adapted for use in
       zoo.

       Randal L. Barnes <rlb@skyler.mavd.honeywell.com>, who
       (with Randy Magnuson) wrote the code to support the
       preservation of file timestamps under VAX/VMS.

       Raymond D. Gardner, who contributed replacement uncompres-
       sion code that on some systems is twice as fast as the
       original.

       Greg Yachuk and Andre Van Dalen, who independently modi-
       fied MS-DOS zoo to support multivolume archives.  (This
       support is not yet in this official release.)


AUTHOR

       Rahul Dhesi
Hurricane Electric Internet Services: Accounts starting at $9.95/month
Hurricane Electric Internet Services
Copyright (C) 1998 Hurricane Electric. All Rights Reserved.