unzipsfx
self-extracting stub for prepending to ZIP archives
see also :
funzip - unzip - zip - zipcloak - zipgrep - zipinfo - zipnote - zipsplit
Synopsis
<name of
unzipsfx+archive combo>
[-cfptuz[ajnoqsCLV$]]
[file(s) ...
[-x xfile(s) ...]]
add an example, a script, a trick and tips
examples
To create a self-extracting archive letters from a regular
zipfile letters.zip and change the new archive’s
permissions to be world-executable under Unix:
cat unzipsfx letters.zip > letters
chmod 755 letters
zip -A letters
To create the same archive under MS-DOS, OS/2 or NT (note the use
of the /b [binary] option to the copy command):
copy /b unzipsfx.exe+letters.zip letters.exe
zip -A letters.exe
Under VMS:
copy unzipsfx.exe,letters.zip letters.exe
letters == "$currentdisk:[currentdir]letters.exe"
zip -A letters.exe
(The VMS append command may also be used. The second
command installs the new program as a ’’foreign command’’ capable
of taking arguments. The third line assumes that Zip is already
installed as a foreign command.) Under AmigaDOS:
MakeSFX letters letters.zip UnZipSFX
(MakeSFX is included with the UnZip source distribution and with
Amiga binary distributions. ’’zip -A’’ doesn’t work on
Amiga self-extracting archives.) To test (or list) the newly
created self-extracting archive:
letters -t
To test letters quietly, printing only a summary message
indicating whether the archive is OK or not:
letters -tqq
To extract the complete contents into the current directory,
recreating all files and subdirectories as necessary:
letters
To extract all *.txt files (in Unix quote the ’*’):
letters *.txt
To extract everything except the *.txt files:
letters -x *.txt
To extract only the README file to standard output (the screen):
letters -c README
To print only the zipfile comment:
letters -z
description
unzipsfx
is a modified version of unzip(1) designed to be
prepended to existing ZIP archives in order to form
self-extracting archives. Instead of taking its first
non-flag argument to be the zipfile(s) to be extracted,
unzipsfx seeks itself under the name by which it was
invoked and tests or extracts the contents of the appended
archive. Because the executable stub adds bulk to the
archive (the whole purpose of which is to be as small as
possible), a number of the less-vital capabilities in
regular unzip have been removed. Among these are the
usage (or help) screen, the listing and diagnostic functions
(-l and -v), the ability to
decompress older compression formats (the
’’reduce,’’
’’shrink’’ and
’’implode’’ methods). The ability to
extract to a directory other than the current one can be
selected as a compile-time option, which is now enabled by
default since UnZipSFX version 5.5. Similarly, decryption is
supported as a compile-time option but should be avoided
unless the attached archive contains encrypted files.
Starting with release 5.5, another compile-time option adds
a simple ’’run command after
extraction’’ feature. This feature is currently
incompatible with the ’’extract to different
directory’’ feature and remains disabled by
default.
Note that
self-extracting archives made with unzipsfx
are no more (or less) portable across different operating
systems than is the unzip executable
itself. In general a self-extracting archive made on a
particular Unix system, for example, will only self-extract
under the same flavor of Unix. Regular unzip may
still be used to extract the embedded archive as with any
normal zipfile, although it will generate a harmless warning
about extra bytes at the beginning of the zipfile.
Despite this, however, the self-extracting archive is
technically not a valid ZIP archive, and PKUNZIP may
be unable to test or extract it. This limitation is due to
the simplistic manner in which the archive is created; the
internal directory structure is not updated to reflect the
extra bytes prepended to the original zipfile.
options
unzipsfx
supports the following unzip(1) options:
-c and -p (extract to standard
output/screen), -f and -u (freshen
and update existing files upon extraction), -t
(test archive) and -z (print archive comment).
All normal listing options (-l, -v
and -Z) have been removed, but the testing
option (-t) may be used as a ’’poor
man’s’’ listing. Alternatively, those
creating self-extracting archives may wish to include a
short listing in the zipfile comment.
See
unzip(1) for a more complete description of these
options.
arguments
[file(s)]
An optional list of archive members to be processed. Regular
expressions (wildcards) similar to those in Unix egrep(1)
may be used to match multiple members. These wildcards may
contain:
*
matches a sequence of 0 or more characters
?
matches exactly 1 character
[...]
matches any single character found inside the brackets; ranges
are specified by a beginning character, a hyphen, and an ending
character. If an exclamation point or a caret (’!’ or ’^’)
follows the left bracket, then the range of characters within the
brackets is complemented (that is, anything except the
characters inside the brackets is considered a match).
(Be sure to quote any character that might otherwise be
interpreted or modified by the operating system, particularly
under Unix and VMS.)
[-x xfile(s)]
An optional list of archive members to be excluded from
processing. Since wildcard characters match directory separators
(’/’), this option may be used to exclude any files that are in
subdirectories. For example, ’’foosfx *.[ch] -x */*’’
would extract all C source files in the main directory, but none
in any subdirectories. Without the -x option, all C source
files in all directories within the zipfile would be extracted.
If unzipsfx is compiled with SFX_EXDIR defined, the
following option is also enabled:
[-d exdir]
An optional directory to which to extract files. By default, all
files and subdirectories are recreated in the current directory;
the -d option allows extraction in an arbitrary directory
(always assuming one has permission to write to the directory).
The option and directory may be concatenated without any white
space between them, but note that this may cause normal shell
behavior to be suppressed. In particular, ’’-d ~’’
(tilde) is expanded by Unix C shells into the name of the user’s
home directory, but ’’-d~’’ is treated as a literal
subdirectory ’’~’’ of the current directory.
autorun command
When unzipsfx was compiled with CHEAP_SFX_AUTORUN defined,
a simple ’’command autorun’’ feature is supported. You may enter
a command into the Zip archive comment, using the following
format:
$AUTORUN$>[command line string]
When unzipsfx recognizes the ’’$AUTORUN$>’’ token at
the beginning of the Zip archive comment, the remainder of the
first line of the comment (until the first newline character) is
passed as a shell command to the operating system using the C rtl
’’system’’ function. Before executing the command,
unzipsfx displays the command on the console and prompts
the user for confirmation. When the user has switched off
prompting by specifying the -q option, autorun commands
are never executed.
In case the archive comment contains additional lines of text,
the remainder of the archive comment following the first line is
displayed normally, unless quiet operation was requested by
supplying a -q option.
decryption
Decryption is supported exactly as in unzip(1); that is,
interactively with a non-echoing prompt for the password(s). See
unzip(1) for details. Once again, note that if the archive
has no encrypted files there is no reason to use a version of
unzipsfx with decryption support; that only adds to the
size of the archive.
diagnostics
unzipsfx’s exit status (error level) is identical to that
of unzip(1); see the corresponding man page.
environment options
unzipsfx uses the same environment variables as
unzip(1) does, although this is likely to be an issue only
for the person creating and testing the self-extracting archive.
See unzip(1) for details.
limitations
The principle and fundamental limitation of unzipsfx is
that it is not portable across architectures or operating
systems, and therefore neither are the resulting archives. For
some architectures there is limited portability, however (e.g.,
between some flavors of Intel-based Unix).
Another problem with the current implementation is that any
archive with ’’junk’’ prepended to the beginning technically is
no longer a zipfile (unless zip(1) is used to adjust the
zipfile offsets appropriately, as noted above). unzip(1)
takes note of the prepended bytes and ignores them since some
file-transfer protocols, notably MacBinary, are also known to
prepend junk. But PKWARE’s archiver suite may not be able to deal
with the modified archive unless its offsets have been adjusted.
unzipsfx has no knowledge of the user’s PATH, so in
general an archive must either be in the current directory when
it is invoked, or else a full or relative path must be given. If
a user attempts to extract the archive from a directory in the
PATH other than the current one, unzipsfx will print a
warning to the effect, ’’can’t find myself.’’ This is always true
under Unix and may be true in some cases under MS-DOS, depending
on the compiler used (Microsoft C fully qualifies the program
name, but other compilers may not). Under OS/2 and NT there are
operating-system calls available that provide the full path name,
so the archive may be invoked from anywhere in the user’s path.
The situation is not known for AmigaDOS, Atari TOS, MacOS, etc.
As noted above, a number of the normal unzip(1) functions
have been removed in order to make unzipsfx smaller: usage
and diagnostic info, listing functions and extraction to other
directories. Also, only stored and deflated files are supported.
The latter limitation is mainly relevant to those who create SFX
archives, however.
VMS users must know how to set up self-extracting archives as
foreign commands in order to use any of unzipsfx’s
options. This is not necessary for simple extraction, but the
command to do so then becomes, e.g., ’’run letters’’ (to
continue the examples given above).
unzipsfx on the Amiga requires the use of a special
program, MakeSFX, in order to create working self-extracting
archives; simple concatenation does not work. (For technically
oriented users, the attached archive is defined as a ’’debug
hunk.’’) There may be compatibility problems between the ROM
levels of older Amigas and newer ones.
All current bugs in unzip(1) exist in unzipsfx as
well.
modifiers
unzipsfx currently supports all unzip(1) modifiers:
-a (convert text files), -n (never overwrite),
-o (overwrite without prompting), -q (operate
quietly), -C (match names case-insensitively), -L
(convert uppercase-OS names to lowercase), -j (junk paths)
and -V (retain version numbers); plus the following
operating-system specific options: -X (restore VMS
owner/protection info), -s (convert spaces in filenames to
underscores [DOS, OS/2, NT]) and -$ (restore volume label
[DOS, OS/2, NT, Amiga]).
(Support for regular ASCII text-conversion may be removed in
future versions, since it is simple enough for the archive’s
creator to ensure that text files have the appropriate format for
the local OS. EBCDIC conversion will of course continue to be
supported since the zipfile format implies ASCII storage of text
files.)
See unzip(1) for a more complete description of these
modifiers.
url
The Info-ZIP home page is currently at
http://www.info-zip.org/pub/infozip/
or
ftp://ftp.info-zip.org/pub/infozip/ .
see also
funzip ,
unzip , zip , zipcloak ,
zipgrep , zipinfo , zipnote ,
zipsplit
authors
Greg Roelofs
was responsible for the basic modifications to UnZip
necessary to create UnZipSFX. See unzip(1) for the
current list of Zip-Bugs authors, or the file CONTRIBS in
the UnZip source distribution for the full list of Info-ZIP
contributors.