Module Name: src
Committed By: wiz
Date: Mon May 7 00:30:06 UTC 2012
Modified Files:
src/external/bsd/bzip2: bzip2.1 bzip2.c bzip2recover.c bzlib.c
bzlib_private.h decompress.c
Added Files:
src/external/bsd/bzip2: bzip2netbsd
Removed Files:
src/external/bsd/bzip2: manual.pdf manual.ps
Log Message:
Merge changes from dist/bzip2:
man page converted to mdoc
compiler warning fixes
integer overflow fix
remove files that aren't used on NetBSD
Add adapted bzip2netbsd script.
To generate a diff of this commit:
cvs rdiff -u -r1.1.1.1 -r1.2 src/external/bsd/bzip2/bzip2.1 \
src/external/bsd/bzip2/bzip2.c src/external/bsd/bzip2/bzip2recover.c \
src/external/bsd/bzip2/bzlib.c src/external/bsd/bzip2/bzlib_private.h \
src/external/bsd/bzip2/decompress.c
cvs rdiff -u -r0 -r1.1 src/external/bsd/bzip2/bzip2netbsd
cvs rdiff -u -r1.1.1.1 -r0 src/external/bsd/bzip2/manual.pdf \
src/external/bsd/bzip2/manual.ps
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/bsd/bzip2/bzip2.1
diff -u src/external/bsd/bzip2/bzip2.1:1.1.1.1 src/external/bsd/bzip2/bzip2.1:1.2
--- src/external/bsd/bzip2/bzip2.1:1.1.1.1 Mon May 7 00:21:47 2012
+++ src/external/bsd/bzip2/bzip2.1 Mon May 7 00:30:05 2012
@@ -1,456 +1,510 @@
-.\" $NetBSD: bzip2.1,v 1.1.1.1 2012/05/07 00:21:47 wiz Exp $
+.\" $NetBSD: bzip2.1,v 1.2 2012/05/07 00:30:05 wiz Exp $
.\"
-.PU
-.TH bzip2 1
-.SH NAME
-bzip2, bunzip2 \- a block-sorting file compressor, v1.0.4
-.br
-bzcat \- decompresses files to stdout
-.br
-bzip2recover \- recovers data from damaged bzip2 files
-
-.SH SYNOPSIS
-.ll +8
-.B bzip2
-.RB [ " \-cdfkqstvzVL123456789 " ]
-[
-.I "filenames \&..."
-]
-.ll -8
-.br
-.B bunzip2
-.RB [ " \-fkvsVL " ]
-[
-.I "filenames \&..."
-]
-.br
-.B bzcat
-.RB [ " \-s " ]
-[
-.I "filenames \&..."
-]
-.br
-.B bzip2recover
-.I "filename"
-
-.SH DESCRIPTION
-.I bzip2
+.Dd May 14, 2010
+.Dt BZIP2 1
+.Os
+.Sh NAME
+.Nm bzip2 ,
+.Nm bunzip2 ,
+.Nm bzcat ,
+.Nm bzip2recover
+.Nd block-sorting file compressor
+.Sh SYNOPSIS
+.Nm bzip2
+.Op Fl 123456789cdfkLqstVvz
+.Op Ar filename Ar
+.Pp
+.Nm bunzip2
+.Op Fl fkLVvs
+.Op Ar filename Ar
+.Pp
+.Nm bzcat
+.Op Fl s
+.Op Ar filename Ar
+.Pp
+.Nm bzip2recover
+.Ar filename
+.Sh DESCRIPTION
+.Nm bzip2
compresses files using the Burrows-Wheeler block sorting
-text compression algorithm, and Huffman coding. Compression is
-generally considerably better than that achieved by more conventional
-LZ77/LZ78-based compressors, and approaches the performance of the PPM
-family of statistical compressors.
-
-The command-line options are deliberately very similar to
-those of
-.I GNU gzip,
+text compression algorithm, and Huffman coding.
+Compression is generally considerably better than that achieved by
+more conventional LZ77/LZ78-based compressors, and approaches the
+performance of the PPM family of statistical compressors.
+.Pp
+.Nm bzcat
+decompresses files to stdout, and
+.Nm bzip2recover
+recovers data from damaged bzip2 files.
+.Pp
+The command-line options are deliberately very similar to
+those of
+.Xr gzip 1 ,
but they are not identical.
-
-.I bzip2
-expects a list of file names to accompany the
-command-line flags. Each file is replaced by a compressed version of
-itself, with the name "original_name.bz2".
-Each compressed file
-has the same modification date, permissions, and, when possible,
-ownership as the corresponding original, so that these properties can
-be correctly restored at decompression time. File name handling is
-naive in the sense that there is no mechanism for preserving original
-file names, permissions, ownerships or dates in filesystems which lack
-these concepts, or have serious file name length restrictions, such as
-MS-DOS.
-
-.I bzip2
+.Pp
+.Nm bzip2
+expects a list of file names to accompany the command-line flags.
+Each file is replaced by a compressed version of
+itself, with the name
+.Dq Pa original_name.bz2 .
+Each compressed file has the same modification date, permissions, and,
+when possible, ownership as the corresponding original, so that these
+properties can be correctly restored at decompression time.
+File name handling is naive in the sense that there is no mechanism
+for preserving original file names, permissions, ownerships or dates
+in filesystems which lack these concepts, or have serious file name
+length restrictions, such as
+.Tn MS-DOS .
+.Nm bzip2
and
-.I bunzip2
-will by default not overwrite existing
-files. If you want this to happen, specify the \-f flag.
-
+.Nm bunzip2
+will by default not overwrite existing files.
+If you want this to happen, specify the
+.Fl f
+flag.
+.Pp
If no file names are specified,
-.I bzip2
-compresses from standard
-input to standard output. In this case,
-.I bzip2
-will decline to
-write compressed output to a terminal, as this would be entirely
-incomprehensible and therefore pointless.
-
-.I bunzip2
+.Nm bzip2
+compresses from standard input to standard output.
+In this case,
+.Nm bzip2
+will decline to write compressed output to a terminal, as this would
+be entirely incomprehensible and therefore pointless.
+.Pp
+.Nm bunzip2
(or
-.I bzip2 \-d)
-decompresses all
-specified files. Files which were not created by
-.I bzip2
-will be detected and ignored, and a warning issued.
-.I bzip2
-attempts to guess the filename for the decompressed file
+.Nm bzip2 Fl d )
+decompresses all specified files.
+Files which were not created by
+.Nm bzip2
+will be detected and ignored, and a warning issued.
+.Nm bzip2
+attempts to guess the filename for the decompressed file
from that of the compressed file as follows:
-
- filename.bz2 becomes filename
- filename.bz becomes filename
- filename.tbz2 becomes filename.tar
- filename.tbz becomes filename.tar
- anyothername becomes anyothername.out
-
-If the file does not end in one of the recognised endings,
-.I .bz2,
-.I .bz,
-.I .tbz2
+.Bl -column "filename.tbz2" "becomes" -offset indent
+.It Pa filename.bz2 Ta becomes Ta Pa filename
+.It Pa filename.bz Ta becomes Ta Pa filename
+.It Pa filename.tbz2 Ta becomes Ta Pa filename.tar
+.It Pa filename.tbz Ta becomes Ta Pa filename.tar
+.It Pa anyothername Ta becomes Ta Pa anyothername.out
+.El
+.Pp
+If the file does not end in one of the recognised endings,
+.Pa .bz2 ,
+.Pa .bz ,
+.Pa .tbz2 ,
or
-.I .tbz,
-.I bzip2
-complains that it cannot
-guess the name of the original file, and uses the original name
-with
-.I .out
+.Pa .tbz ,
+.Nm bzip2
+complains that it cannot guess the name of the original file, and uses
+the original name with
+.Pa .out
appended.
-
-As with compression, supplying no
-filenames causes decompression from
+.Pp
+As with compression, supplying no filenames causes decompression from
standard input to standard output.
-
-.I bunzip2
-will correctly decompress a file which is the
-concatenation of two or more compressed files. The result is the
-concatenation of the corresponding uncompressed files. Integrity
-testing (\-t)
-of concatenated
-compressed files is also supported.
-
+.Pp
+.Nm bunzip2
+will correctly decompress a file which is the concatenation of two or
+more compressed files.
+The result is the concatenation of the corresponding uncompressed
+files.
+Integrity testing
+.Pq Fl t
+of concatenated compressed files is also supported.
+.Pp
You can also compress or decompress files to the standard output by
-giving the \-c flag. Multiple files may be compressed and
-decompressed like this. The resulting outputs are fed sequentially to
-stdout. Compression of multiple files
-in this manner generates a stream
-containing multiple compressed file representations. Such a stream
-can be decompressed correctly only by
-.I bzip2
-version 0.9.0 or
-later. Earlier versions of
-.I bzip2
+giving the
+.Fl c
+flag.
+Multiple files may be compressed and decompressed like this.
+The resulting outputs are fed sequentially to stdout.
+Compression of multiple files in this manner generates a stream
+containing multiple compressed file representations.
+Such a stream can be decompressed correctly only by
+.Nm bzip2
+version 0.9.0 or later.
+Earlier versions of
+.Nm bzip2
will stop after decompressing
the first file in the stream.
-
-.I bzcat
+.Pp
+.Nm bzcat
(or
-.I bzip2 -dc)
-decompresses all specified files to
-the standard output.
-
-.I bzip2
-will read arguments from the environment variables
-.I BZIP2
-and
-.I BZIP,
-in that order, and will process them
-before any arguments read from the command line. This gives a
-convenient way to supply default arguments.
-
-Compression is always performed, even if the compressed
-file is slightly
-larger than the original. Files of less than about one hundred bytes
-tend to get larger, since the compression mechanism has a constant
-overhead in the region of 50 bytes. Random data (including the output
-of most file compressors) is coded at about 8.05 bits per byte, giving
-an expansion of around 0.5%.
-
-As a self-check for your protection,
-.I
-bzip2
-uses 32-bit CRCs to
-make sure that the decompressed version of a file is identical to the
-original. This guards against corruption of the compressed data, and
-against undetected bugs in
-.I bzip2
-(hopefully very unlikely). The
-chances of data corruption going undetected is microscopic, about one
-chance in four billion for each file processed. Be aware, though, that
-the check occurs upon decompression, so it can only tell you that
-something is wrong. It can't help you
-recover the original uncompressed
-data. You can use
-.I bzip2recover
+.Nm bzip2 Fl dc )
+decompresses all specified files to the standard output.
+.Pp
+Compression is always performed, even if the compressed file is
+slightly larger than the original.
+Files of less than about one hundred bytes tend to get larger, since
+the compression mechanism has a constant overhead in the region of 50
+bytes.
+Random data (including the output of most file compressors) is coded
+at about 8.05 bits per byte, giving an expansion of around 0.5%.
+.Pp
+As a self-check for your protection,
+.Nm bzip2
+uses 32-bit CRCs to make sure that the decompressed version of a file
+is identical to the original.
+This guards against corruption of the compressed data, and against
+undetected bugs in
+.Nm bzip2
+(hopefully very unlikely).
+The chances of data corruption going undetected is microscopic, about
+one chance in four billion for each file processed.
+Be aware, though, that the check occurs upon decompression, so it can
+only tell you that something is wrong.
+It can't help you recover the original uncompressed data.
+You can use
+.Nm bzip2recover
to try to recover data from
damaged files.
-
-Return values: 0 for a normal exit, 1 for environmental problems (file
-not found, invalid flags, I/O errors, &c), 2 to indicate a corrupt
-compressed file, 3 for an internal consistency error (eg, bug) which
-caused
-.I bzip2
-to panic.
-
-.SH OPTIONS
-.TP
-.B \-c --stdout
+.Sh OPTIONS
+.Bl -tag -width "XXrepetitiveXfastXX"
+.It Fl Fl
+Treats all subsequent arguments as file names, even if they start with
+a dash.
+This is so you can handle files with names beginning with a dash, for
+example:
+.Dl bzip2 -- -myfilename .
+.It Fl 1 , Fl Fl fast
+to
+.It Fl 9 , Fl Fl best
+Set the block size to 100 k, 200 k ... 900 k when compressing.
+Has no effect when decompressing.
+See
+.Sx MEMORY MANAGEMENT
+below.
+The
+.Fl Fl fast
+and
+.Fl Fl best
+aliases are primarily for GNU
+.Xr gzip 1
+compatibility.
+In particular,
+.Fl Fl fast
+doesn't make things significantly faster, and
+.Fl Fl best
+merely selects the default behaviour.
+.It Fl c , Fl Fl stdout
Compress or decompress to standard output.
-.TP
-.B \-d --decompress
-Force decompression.
-.I bzip2,
-.I bunzip2
+.It Fl d , Fl Fl decompress
+Force decompression.
+.Nm bzip2 ,
+.Nm bunzip2 ,
and
-.I bzcat
-are
-really the same program, and the decision about what actions to take is
-done on the basis of which name is used. This flag overrides that
-mechanism, and forces
-.I bzip2
+.Nm bzcat
+are really the same program, and the decision about what actions to
+take is done on the basis of which name is used.
+This flag overrides that mechanism, and forces
+.Nm bzip2
to decompress.
-.TP
-.B \-z --compress
-The complement to \-d: forces compression, regardless of the
-invocation name.
-.TP
-.B \-t --test
-Check integrity of the specified file(s), but don't decompress them.
-This really performs a trial decompression and throws away the result.
-.TP
-.B \-f --force
-Force overwrite of output files. Normally,
-.I bzip2
-will not overwrite
-existing output files. Also forces
-.I bzip2
+.It Fl f , Fl Fl force
+Force overwrite of output files.
+Normally,
+.Nm bzip2
+will not overwrite existing output files.
+Also forces
+.Nm bzip2
to break hard links
to files, which it otherwise wouldn't do.
-
-bzip2 normally declines to decompress files which don't have the
-correct magic header bytes. If forced (-f), however, it will pass
-such files through unmodified. This is how GNU gzip behaves.
-.TP
-.B \-k --keep
+.Pp
+.Nm bzip2
+normally declines to decompress files which don't have the correct
+magic header bytes.
+If forced
+.Pq Fl f ,
+however, it will pass such files through unmodified.
+This is how GNU
+.Xr gzip 1
+behaves.
+.It Fl k , Fl Fl keep
Keep (don't delete) input files during compression
or decompression.
-.TP
-.B \-s --small
-Reduce memory usage, for compression, decompression and testing. Files
-are decompressed and tested using a modified algorithm which only
-requires 2.5 bytes per block byte. This means any file can be
-decompressed in 2300k of memory, albeit at about half the normal speed.
-
-During compression, \-s selects a block size of 200k, which limits
-memory use to around the same figure, at the expense of your compression
-ratio. In short, if your machine is low on memory (8 megabytes or
-less), use \-s for everything. See MEMORY MANAGEMENT below.
-.TP
-.B \-q --quiet
-Suppress non-essential warning messages. Messages pertaining to
-I/O errors and other critical events will not be suppressed.
-.TP
-.B \-v --verbose
-Verbose mode -- show the compression ratio for each file processed.
-Further \-v's increase the verbosity level, spewing out lots of
-information which is primarily of interest for diagnostic purposes.
-.TP
-.B \-L --license -V --version
-Display the software version, license terms and conditions.
-.TP
-.B \-1 (or \-\-fast) to \-9 (or \-\-best)
-Set the block size to 100 k, 200 k .. 900 k when compressing. Has no
-effect when decompressing. See MEMORY MANAGEMENT below.
-The \-\-fast and \-\-best aliases are primarily for GNU gzip
-compatibility. In particular, \-\-fast doesn't make things
-significantly faster.
-And \-\-best merely selects the default behaviour.
-.TP
-.B \--
-Treats all subsequent arguments as file names, even if they start
-with a dash. This is so you can handle files with names beginning
-with a dash, for example: bzip2 \-- \-myfilename.
-.TP
-.B \--repetitive-fast --repetitive-best
-These flags are redundant in versions 0.9.5 and above. They provided
-some coarse control over the behaviour of the sorting algorithm in
-earlier versions, which was sometimes useful. 0.9.5 and above have an
-improved algorithm which renders these flags irrelevant.
-
-.SH MEMORY MANAGEMENT
-.I bzip2
-compresses large files in blocks. The block size affects
-both the compression ratio achieved, and the amount of memory needed for
-compression and decompression. The flags \-1 through \-9
+.It Fl L , Fl Fl license
+Display the license terms and conditions.
+.It Fl q , Fl Fl quiet
+Suppress non-essential warning messages.
+Messages pertaining to I/O errors and other critical events will not
+be suppressed.
+.It Fl Fl repetitive-fast
+.It Fl Fl repetitive-best
+These flags are redundant in versions 0.9.5 and above.
+They provided some coarse control over the behaviour of the sorting
+algorithm in earlier versions, which was sometimes useful.
+0.9.5 and above have an improved algorithm which renders these flags
+irrelevant.
+.It Fl s , Fl Fl small
+Reduce memory usage, for compression, decompression and testing.
+Files are decompressed and tested using a modified algorithm which
+only requires 2.5 bytes per block byte.
+This means any file can be decompressed in 2300k of memory, albeit at
+about half the normal speed.
+During compression,
+.Fl s
+selects a block size of 200k, which limits memory use to around the
+same figure, at the expense of your compression ratio.
+In short, if your machine is low on memory (8 megabytes or less), use
+.Fl s
+for everything.
+See
+.Sx MEMORY MANAGEMENT
+below.
+.It Fl t , Fl Fl test
+Check integrity of the specified file(s), but don't decompress them.
+This really performs a trial decompression and throws away the result.
+.It Fl V , Fl Fl version
+Display the software version.
+.It Fl v , Fl Fl verbose
+Verbose mode: show the compression ratio for each file processed.
+Further
+.Fl v Ap s
+increase the verbosity level, spewing out lots of information which is
+primarily of interest for diagnostic purposes.
+.It Fl z , Fl Fl compress
+The complement to
+Fl d :
+forces compression, regardless of the invocation name.
+.El
+.Ss MEMORY MANAGEMENT
+.Nm bzip2
+compresses large files in blocks.
+The block size affects both the compression ratio achieved, and the
+amount of memory needed for compression and decompression.
+The flags
+.Fl 1
+through
+.Fl 9
specify the block size to be 100,000 bytes through 900,000 bytes (the
-default) respectively. At decompression time, the block size used for
-compression is read from the header of the compressed file, and
-.I bunzip2
-then allocates itself just enough memory to decompress
-the file. Since block sizes are stored in compressed files, it follows
-that the flags \-1 to \-9 are irrelevant to and so ignored
-during decompression.
-
-Compression and decompression requirements,
-in bytes, can be estimated as:
-
- Compression: 400k + ( 8 x block size )
-
- Decompression: 100k + ( 4 x block size ), or
- 100k + ( 2.5 x block size )
-
-Larger block sizes give rapidly diminishing marginal returns. Most of
-the compression comes from the first two or three hundred k of block
-size, a fact worth bearing in mind when using
-.I bzip2
+default) respectively.
+At decompression time, the block size used for compression is read
+from the header of the compressed file, and
+.Nm bunzip2
+then allocates itself just enough memory to decompress the file.
+Since block sizes are stored in compressed files, it follows that the
+flags
+.Fl 1
+to
+.Fl 9
+are irrelevant to and so ignored during decompression.
+.Pp
+Compression and decompression requirements, in bytes, can be estimated
+as:
+.Bl -tag -width "Decompression:" -offset indent
+.It Compression :
+400k + ( 8 x block size )
+.It Decompression :
+100k + ( 4 x block size ), or 100k + ( 2.5 x block size )
+.El
+Larger block sizes give rapidly diminishing marginal returns.
+Most of the compression comes from the first two or three hundred k of
+block size, a fact worth bearing in mind when using
+.Nm bzip2
on small machines.
It is also important to appreciate that the decompression memory
requirement is set at compression time by the choice of block size.
-
+.Pp
For files compressed with the default 900k block size,
-.I bunzip2
-will require about 3700 kbytes to decompress. To support decompression
-of any file on a 4 megabyte machine,
-.I bunzip2
-has an option to
-decompress using approximately half this amount of memory, about 2300
-kbytes. Decompression speed is also halved, so you should use this
-option only where necessary. The relevant flag is -s.
-
-In general, try and use the largest block size memory constraints allow,
-since that maximises the compression achieved. Compression and
-decompression speed are virtually unaffected by block size.
-
+.Nm bunzip2
+will require about 3700 kbytes to decompress.
+To support decompression of any file on a 4 megabyte machine,
+.Nm bunzip2
+has an option to decompress using approximately half this amount of
+memory, about 2300 kbytes.
+Decompression speed is also halved, so you should use this option only
+where necessary.
+The relevant flag is
+.Fl s .
+.Pp
+In general, try and use the largest block size memory constraints
+allow, since that maximises the compression achieved.
+Compression and decompression speed are virtually unaffected by block
+size.
+.Pp
Another significant point applies to files which fit in a single block
--- that means most files you'd encounter using a large block size. The
-amount of real memory touched is proportional to the size of the file,
-since the file is smaller than a block. For example, compressing a file
-20,000 bytes long with the flag -9 will cause the compressor to
-allocate around 7600k of memory, but only touch 400k + 20000 * 8 = 560
-kbytes of it. Similarly, the decompressor will allocate 3700k but only
-touch 100k + 20000 * 4 = 180 kbytes.
-
+-- that means most files you'd encounter using a large block size.
+The amount of real memory touched is proportional to the size of the
+file, since the file is smaller than a block.
+For example, compressing a file 20,000 bytes long with the flag
+.Fl 9
+will cause the compressor to allocate around 7600k of memory, but only
+touch 400k + 20000 * 8 = 560 kbytes of it.
+Similarly, the decompressor will allocate 3700k but only touch 100k +
+20000 * 4 = 180 kbytes.
+.Pp
Here is a table which summarises the maximum memory usage for different
-block sizes. Also recorded is the total compressed size for 14 files of
-the Calgary Text Compression Corpus totalling 3,141,622 bytes. This
-column gives some feel for how compression varies with block size.
-These figures tend to understate the advantage of larger block sizes for
-larger files, since the Corpus is dominated by smaller files.
-
- Compress Decompress Decompress Corpus
- Flag usage usage -s usage Size
-
- -1 1200k 500k 350k 914704
- -2 2000k 900k 600k 877703
- -3 2800k 1300k 850k 860338
- -4 3600k 1700k 1100k 846899
- -5 4400k 2100k 1350k 845160
- -6 5200k 2500k 1600k 838626
- -7 6100k 2900k 1850k 834096
- -8 6800k 3300k 2100k 828642
- -9 7600k 3700k 2350k 828642
-
-.SH RECOVERING DATA FROM DAMAGED FILES
-.I bzip2
-compresses files in blocks, usually 900kbytes long. Each
-block is handled independently. If a media or transmission error causes
-a multi-block .bz2
-file to become damaged, it may be possible to
-recover data from the undamaged blocks in the file.
-
+block sizes.
+Also recorded is the total compressed size for 14 files of the Calgary
+Text Compression Corpus totalling 3,141,622 bytes.
+This column gives some feel for how compression varies with block size.
+These figures tend to understate the advantage of larger block sizes
+for larger files, since the Corpus is dominated by smaller files.
+.Bl -column "Flag" "Compression" "Decompression" "DecompressionXXs" "Corpus size"
+.It Sy Flag Ta Sy Compression Ta Sy Decompression Ta Sy Decompression Fl s Ta Sy Corpus size
+.It -1 Ta 1200k Ta 500k Ta 350k Ta 914704
+.It -2 Ta 2000k Ta 900k Ta 600k Ta 877703
+.It -3 Ta 2800k Ta 1300k Ta 850k Ta 860338
+.It -4 Ta 3600k Ta 1700k Ta 1100k Ta 846899
+.It -5 Ta 4400k Ta 2100k Ta 1350k Ta 845160
+.It -6 Ta 5200k Ta 2500k Ta 1600k Ta 838626
+.It -7 Ta 6100k Ta 2900k Ta 1850k Ta 834096
+.It -8 Ta 6800k Ta 3300k Ta 2100k Ta 828642
+.It -9 Ta 7600k Ta 3700k Ta 2350k Ta 828642
+.El
+.Ss RECOVERING DATA FROM DAMAGED FILES
+.Nm bzip2
+compresses files in blocks, usually 900kbytes long.
+Each block is handled independently.
+If a media or transmission error causes a multi-block
+.Pa .bz2
+file to become damaged, it may be possible to recover data from the
+undamaged blocks in the file.
+.Pp
The compressed representation of each block is delimited by a 48-bit
pattern, which makes it possible to find the block boundaries with
-reasonable certainty. Each block also carries its own 32-bit CRC, so
-damaged blocks can be distinguished from undamaged ones.
-
-.I bzip2recover
-is a simple program whose purpose is to search for
-blocks in .bz2 files, and write each block out into its own .bz2
-file. You can then use
-.I bzip2
-\-t
-to test the
-integrity of the resulting files, and decompress those which are
-undamaged.
-
-.I bzip2recover
-takes a single argument, the name of the damaged file,
-and writes a number of files "rec00001file.bz2",
-"rec00002file.bz2", etc, containing the extracted blocks.
-The output filenames are designed so that the use of
-wildcards in subsequent processing -- for example,
-"bzip2 -dc rec*file.bz2 > recovered_data" -- processes the files in
-the correct order.
-
-.I bzip2recover
-should be of most use dealing with large .bz2
-files, as these will contain many blocks. It is clearly
-futile to use it on damaged single-block files, since a
-damaged block cannot be recovered. If you wish to minimise
-any potential data loss through media or transmission errors,
-you might consider compressing with a smaller
+reasonable certainty.
+Each block also carries its own 32-bit CRC, so damaged blocks can be
+distinguished from undamaged ones.
+.Pp
+.Nm bzip2recover
+is a simple program whose purpose is to search for blocks in
+.Pa .bz2
+files, and write each block out into its own
+.Pa .bz2
+file.
+You can then use
+.Nm bzip2
+.Fl t
+to test the integrity of the resulting files, and decompress those
+which are undamaged.
+.Pp
+.Nm bzip2recover
+takes a single argument, the name of the damaged file, and writes a
+number of files
+.Dq Pa rec00001file.bz2 ,
+.Dq Pa rec00002file.bz2 ,
+etc., containing the extracted blocks.
+The output filenames are designed so that the use of wildcards in
+subsequent processing -- for example,
+.Dl bzip2 -dc rec*file.bz2 \*[Gt] recovered_data
+-- processes the files in the correct order.
+.Pp
+.Nm bzip2recover
+should be of most use dealing with large
+.Pa .bz2
+files, as these will contain many blocks.
+It is clearly futile to use it on damaged single-block files, since a
+damaged block cannot be recovered.
+If you wish to minimise any potential data loss through media or
+transmission errors, you might consider compressing with a smaller
block size.
-
-.SH PERFORMANCE NOTES
-The sorting phase of compression gathers together similar strings in the
-file. Because of this, files containing very long runs of repeated
-symbols, like "aabaabaabaab ..." (repeated several hundred times) may
-compress more slowly than normal. Versions 0.9.5 and above fare much
-better than previous versions in this respect. The ratio between
-worst-case and average-case compression time is in the region of 10:1.
-For previous versions, this figure was more like 100:1. You can use the
-\-vvvv option to monitor progress in great detail, if you want.
-
+.Ss PERFORMANCE NOTES
+The sorting phase of compression gathers together similar strings in
+the file.
+Because of this, files containing very long runs of repeated
+symbols, like
+.Dq aabaabaabaab...
+(repeated several hundred times) may compress more slowly than normal.
+Versions 0.9.5 and above fare much better than previous versions in
+this respect.
+The ratio between worst-case and average-case compression time is in
+the region of 10:1.
+For previous versions, this figure was more like 100:1.
+You can use the
+.Fl vvvv
+option to monitor progress in great detail, if you want.
+.Pp
Decompression speed is unaffected by these phenomena.
-
-.I bzip2
-usually allocates several megabytes of memory to operate
-in, and then charges all over it in a fairly random fashion. This means
-that performance, both for compressing and decompressing, is largely
-determined by the speed at which your machine can service cache misses.
-Because of this, small changes to the code to reduce the miss rate have
-been observed to give disproportionately large performance improvements.
-I imagine
-.I bzip2
+.Pp
+.Nm bzip2
+usually allocates several megabytes of memory to operate in, and then
+charges all over it in a fairly random fashion.
+This means that performance, both for compressing and decompressing,
+is largely determined by the speed at which your machine can service
+cache misses.
+Because of this, small changes to the code to reduce the miss rate
+have been observed to give disproportionately large performance
+improvements.
+I imagine
+.Nm bzip2
will perform best on machines with very large caches.
-
-.SH CAVEATS
+.Sh ENVIRONMENT
+.Nm bzip2
+will read arguments from the environment variables
+.Ev BZIP2
+and
+.Ev BZIP ,
+in that order, and will process them before any arguments read from
+the command line.
+This gives a convenient way to supply default arguments.
+.Sh EXIT STATUS
+0 for a normal exit, 1 for environmental problems (file not found,
+invalid flags, I/O errors, etc.), 2 to indicate a corrupt compressed
+file, 3 for an internal consistency error (e.g., bug) which caused
+.Nm bzip2
+to panic.
+.Sh AUTHORS
+.An -nosplit
+.An Julian Seward
+.Aq [email protected]
+.Pp
+.Pa http://www.bzip.org
+.Pp
+The ideas embodied in
+.Nm bzip2
+are due to (at least) the following people:
+.An Michael Burrows
+and
+.An David Wheeler
+(for the block sorting transformation),
+.An David Wheeler
+(again, for the Huffman coder),
+.An Peter Fenwick
+(for the structured coding model in the original
+.Nm bzip ,
+and many refinements), and
+.An Alistair Moffat ,
+.An Radford Neal ,
+and
+.An Ian Witten
+(for the arithmetic coder in the original
+.Nm bzip ) .
+I am much indebted for their help, support and advice.
+See the manual in the source distribution for pointers to sources of
+documentation.
+Christian von Roques encouraged me to look for faster sorting
+algorithms, so as to speed up compression.
+Bela Lubkin encouraged me to improve the worst-case compression
+performance.
+Donna Robinson XMLised the documentation.
+The bz* scripts are derived from those of GNU gzip.
+Many people sent patches, helped with portability problems, lent
+machines, gave advice and were generally helpful.
+.Sh CAVEATS
I/O error messages are not as helpful as they could be.
-.I bzip2
+.Nm bzip2
tries hard to detect I/O errors and exit cleanly, but the details of
what the problem is sometimes seem rather misleading.
-
-This manual page pertains to version 1.0.4 of
-.I bzip2.
+.Pp
+This manual page pertains to version 1.0.5 of
+.Nm bzip2 .
Compressed data created by this version is entirely forwards and
backwards compatible with the previous public releases, versions
-0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, 1.0.2 and 1.0.3, but with the following
-exception: 0.9.0 and above can correctly decompress multiple
-concatenated compressed files. 0.1pl2 cannot do this; it will stop
-after decompressing just the first file in the stream.
-
-.I bzip2recover
-versions prior to 1.0.2 used 32-bit integers to represent
-bit positions in compressed files, so they could not handle compressed
-files more than 512 megabytes long. Versions 1.0.2 and above use
-64-bit ints on some platforms which support them (GNU supported
-targets, and Windows). To establish whether or not bzip2recover was
-built with such a limitation, run it without arguments. In any event
-you can build yourself an unlimited version if you can recompile it
-with MaybeUInt64 set to be an unsigned 64-bit integer.
-
-
-
-.SH AUTHOR
-Julian Seward, jsewardbzip.org.
-
-http://www.bzip.org
-
-The ideas embodied in
-.I bzip2
-are due to (at least) the following
-people: Michael Burrows and David Wheeler (for the block sorting
-transformation), David Wheeler (again, for the Huffman coder), Peter
-Fenwick (for the structured coding model in the original
-.I bzip,
-and many refinements), and Alistair Moffat, Radford Neal and Ian Witten
-(for the arithmetic coder in the original
-.I bzip).
-I am much
-indebted for their help, support and advice. See the manual in the
-source distribution for pointers to sources of documentation. Christian
-von Roques encouraged me to look for faster sorting algorithms, so as to
-speed up compression. Bela Lubkin encouraged me to improve the
-worst-case compression performance.
-Donna Robinson XMLised the documentation.
-The bz* scripts are derived from those of GNU gzip.
-Many people sent patches, helped
-with portability problems, lent machines, gave advice and were generally
-helpful.
+0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, 1.0.2 and 1.0.3, but with the
+following exception: 0.9.0 and above can correctly decompress multiple
+concatenated compressed files.
+0.1pl2 cannot do this; it will stop after decompressing just the first
+file in the stream.
+.Pp
+.Nm bzip2recover
+versions prior to 1.0.2 used 32-bit integers to represent bit
+positions in compressed files, so they could not handle compressed
+files more than 512 megabytes long.
+Versions 1.0.2 and above use 64-bit ints on some platforms which
+support them (GNU supported targets, and Windows).
+To establish whether or not
+.Nm bzip2recover
+was built with such a limitation, run it without arguments.
+In any event you can build yourself an unlimited version if you can
+recompile it with MaybeUInt64 set to be an unsigned 64-bit integer.
Index: src/external/bsd/bzip2/bzip2.c
diff -u src/external/bsd/bzip2/bzip2.c:1.1.1.1 src/external/bsd/bzip2/bzip2.c:1.2
--- src/external/bsd/bzip2/bzip2.c:1.1.1.1 Mon May 7 00:21:46 2012
+++ src/external/bsd/bzip2/bzip2.c Mon May 7 00:30:05 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: bzip2.c,v 1.1.1.1 2012/05/07 00:21:46 wiz Exp $ */
+/* $NetBSD: bzip2.c,v 1.2 2012/05/07 00:30:05 wiz Exp $ */
/*-----------------------------------------------------------*/
@@ -220,11 +220,12 @@ static void crcError ( v
static void cleanUpAndFail ( Int32 ) NORETURN;
static void compressedStreamEOF ( void ) NORETURN;
-static void copyFileName ( Char*, Char* );
+static void copyFileName ( Char*, const Char* );
static void* myMalloc ( Int32 );
static void applySavedFileAttrToOutputFile ( IntNative fd );
+static FILE* fopen_output_safely ( Char*, const char* );
/*---------------------------------------------------*/
/*--- An implementation of 64-bit ints. Sigh. ---*/
@@ -439,7 +440,7 @@ Bool uncompressStream ( FILE *zStream, F
UChar obuf[5000];
UChar unused[BZ_MAX_UNUSED];
Int32 nUnused;
- void* unusedTmpV;
+ void* unusedTmpV = NULL;
UChar* unusedTmp;
nUnused = 0;
@@ -469,7 +470,7 @@ Bool uncompressStream ( FILE *zStream, F
}
if (bzerr != BZ_STREAM_END) goto errhandler;
- BZ2_bzReadGetUnused ( &bzerr, bzf, &unusedTmpV, &nUnused );
+ BZ2_bzReadGetUnused ( &bzerr, bzf, (void*)(&unusedTmpV), &nUnused );
if (bzerr != BZ_OK) panic ( "decompress:bzReadGetUnused" );
unusedTmp = (UChar*)unusedTmpV;
@@ -560,8 +561,8 @@ Bool testStream ( FILE *zStream )
UChar obuf[5000];
UChar unused[BZ_MAX_UNUSED];
Int32 nUnused;
- void* unusedTmpV;
- UChar* unusedTmp;
+ void* unusedTmpV = NULL;
+ UChar* unusedTmp = NULL;
nUnused = 0;
streamNo = 0;
@@ -584,7 +585,7 @@ Bool testStream ( FILE *zStream )
}
if (bzerr != BZ_STREAM_END) goto errhandler;
- BZ2_bzReadGetUnused ( &bzerr, bzf, &unusedTmpV, &nUnused );
+ BZ2_bzReadGetUnused ( &bzerr, bzf, (void*)(&unusedTmpV), &nUnused );
if (bzerr != BZ_OK) panic ( "test:bzReadGetUnused" );
unusedTmp = (UChar*)unusedTmpV;
@@ -803,7 +804,7 @@ void ioError ( void )
/*---------------------------------------------*/
-static
+NORETURN static
void mySignalCatcher ( IntNative n )
{
fprintf ( stderr,
@@ -814,7 +815,8 @@ void mySignalCatcher ( IntNative n )
/*---------------------------------------------*/
-static
+#ifndef SMALL
+NORETURN static
void mySIGSEGVorSIGBUScatcher ( IntNative n )
{
if (opMode == OM_Z)
@@ -867,6 +869,7 @@ void mySIGSEGVorSIGBUScatcher ( IntNativ
cleanUpAndFail( 3 ); else
{ cadvise(); cleanUpAndFail( 2 ); }
}
+#endif
/*---------------------------------------------*/
@@ -918,7 +921,7 @@ void pad ( Char *s )
/*---------------------------------------------*/
static
-void copyFileName ( Char* to, Char* from )
+void copyFileName ( Char* to, const Char* from )
{
if ( strlen(from) > FILE_NAME_LEN-10 ) {
fprintf (
@@ -1146,8 +1149,8 @@ void compress ( Char *name )
switch (srcMode) {
case SM_I2O:
- copyFileName ( inName, (Char*)"(stdin)" );
- copyFileName ( outName, (Char*)"(stdout)" );
+ copyFileName ( inName, "(stdin)" );
+ copyFileName ( outName, "(stdout)" );
break;
case SM_F2F:
copyFileName ( inName, name );
@@ -1156,7 +1159,7 @@ void compress ( Char *name )
break;
case SM_F2O:
copyFileName ( inName, name );
- copyFileName ( outName, (Char*)"(stdout)" );
+ copyFileName ( outName, "(stdout)" );
break;
}
@@ -1330,8 +1333,8 @@ void uncompress ( Char *name )
cantGuess = False;
switch (srcMode) {
case SM_I2O:
- copyFileName ( inName, (Char*)"(stdin)" );
- copyFileName ( outName, (Char*)"(stdout)" );
+ copyFileName ( inName, "(stdin)" );
+ copyFileName ( outName, "(stdout)" );
break;
case SM_F2F:
copyFileName ( inName, name );
@@ -1344,7 +1347,7 @@ void uncompress ( Char *name )
break;
case SM_F2O:
copyFileName ( inName, name );
- copyFileName ( outName, (Char*)"(stdout)" );
+ copyFileName ( outName, "(stdout)" );
break;
}
@@ -1522,9 +1525,9 @@ void testf ( Char *name )
if (name == NULL && srcMode != SM_I2O)
panic ( "testf: bad modes\n" );
- copyFileName ( outName, (Char*)"(none)" );
+ copyFileName ( outName, "(none)" );
switch (srcMode) {
- case SM_I2O: copyFileName ( inName, (Char*)"(stdin)" ); break;
+ case SM_I2O: copyFileName ( inName, "(stdin)" ); break;
case SM_F2F: copyFileName ( inName, name ); break;
case SM_F2O: copyFileName ( inName, name ); break;
}
@@ -1746,7 +1749,7 @@ Cell *snocString ( Cell *root, Char *nam
/*---------------------------------------------*/
static
-void addFlagsFromEnvVar ( Cell** argList, Char* varName )
+void addFlagsFromEnvVar ( Cell** argList, const Char* varName )
{
Int32 i, j, k;
Char *envbase, *p;
@@ -1806,6 +1809,7 @@ IntNative main ( IntNative argc, Char *a
exitValue = 0;
i = j = 0; /* avoid bogus warning from egcs-1.1.X */
+#ifndef SMALL
/*-- Set up signal handlers for mem access errors --*/
signal (SIGSEGV, mySIGSEGVorSIGBUScatcher);
# if BZ_UNIX
@@ -1813,9 +1817,10 @@ IntNative main ( IntNative argc, Char *a
signal (SIGBUS, mySIGSEGVorSIGBUScatcher);
# endif
# endif
+#endif
- copyFileName ( inName, (Char*)"(none)" );
- copyFileName ( outName, (Char*)"(none)" );
+ copyFileName ( inName, "(none)" );
+ copyFileName ( outName, "(none)" );
copyFileName ( progNameReally, argv[0] );
progName = &progNameReally[0];
@@ -1827,8 +1832,8 @@ IntNative main ( IntNative argc, Char *a
expand filename wildcards in arg list.
--*/
argList = NULL;
- addFlagsFromEnvVar ( &argList, (Char*)"BZIP2" );
- addFlagsFromEnvVar ( &argList, (Char*)"BZIP" );
+ addFlagsFromEnvVar ( &argList, "BZIP2" );
+ addFlagsFromEnvVar ( &argList, "BZIP" );
for (i = 1; i <= argc-1; i++)
APPEND_FILESPEC(argList, argv[i]);
Index: src/external/bsd/bzip2/bzip2recover.c
diff -u src/external/bsd/bzip2/bzip2recover.c:1.1.1.1 src/external/bsd/bzip2/bzip2recover.c:1.2
--- src/external/bsd/bzip2/bzip2recover.c:1.1.1.1 Mon May 7 00:21:46 2012
+++ src/external/bsd/bzip2/bzip2recover.c Mon May 7 00:30:05 2012
@@ -1,4 +1,5 @@
-/* $NetBSD: bzip2recover.c,v 1.1.1.1 2012/05/07 00:21:46 wiz Exp $ */
+/* $NetBSD: bzip2recover.c,v 1.2 2012/05/07 00:30:05 wiz Exp $ */
+
/*-----------------------------------------------------------*/
/*--- Block recoverer program for bzip2 ---*/
@@ -22,6 +23,7 @@
/* This program is a complete hack and should be rewritten properly.
It isn't very complicated. */
+#include <inttypes.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
@@ -37,9 +39,9 @@
This change occurred in version 1.0.2; all prior versions have
the 512MB limitation.
*/
-#ifdef __GNUC__
- typedef unsigned long long int MaybeUInt64;
-# define MaybeUInt64_FMT "%Lu"
+#if 1
+ typedef uint64_t MaybeUInt64;
+# define MaybeUInt64_FMT "%" PRIu64
#else
#ifdef _MSC_VER
typedef unsigned __int64 MaybeUInt64;
@@ -68,6 +70,32 @@ Char progName[BZ_MAX_FILENAME];
MaybeUInt64 bytesOut = 0;
MaybeUInt64 bytesIn = 0;
+/*---------------------------------------------------*/
+/*--- Bit stream I/O ---*/
+/*---------------------------------------------------*/
+
+typedef
+ struct {
+ FILE* handle;
+ Int32 buffer;
+ Int32 buffLive;
+ Char mode;
+ }
+ BitStream;
+
+static void readError ( void );
+static void writeError ( void );
+static void mallocFail ( Int32 n );
+static BitStream* bsOpenReadStream ( FILE* stream );
+static BitStream* bsOpenWriteStream ( FILE* stream );
+static void bsPutBit ( BitStream* bs, Int32 bit );
+static Int32 bsGetBit ( BitStream* bs );
+static void bsClose ( BitStream* bs );
+static void bsPutUChar ( BitStream* bs, UChar c );
+static void bsPutUInt32 ( BitStream* bs, UInt32 c );
+static Bool endsInBz2 ( Char* name );
+static void tooManyBlocks ( Int32 max_handled_blocks );
+
/*---------------------------------------------------*/
/*--- Header bytes ---*/
@@ -84,7 +112,7 @@ MaybeUInt64 bytesIn = 0;
/*---------------------------------------------------*/
/*---------------------------------------------*/
-static void readError ( void )
+__dead static void readError ( void )
{
fprintf ( stderr,
"%s: I/O error reading `%s', possible reason follows.\n",
@@ -97,7 +125,7 @@ static void readError ( void )
/*---------------------------------------------*/
-static void writeError ( void )
+__dead static void writeError ( void )
{
fprintf ( stderr,
"%s: I/O error reading `%s', possible reason follows.\n",
@@ -110,7 +138,7 @@ static void writeError ( void )
/*---------------------------------------------*/
-static void mallocFail ( Int32 n )
+__dead static void mallocFail ( Int32 n )
{
fprintf ( stderr,
"%s: malloc failed on request for %d bytes.\n",
@@ -122,7 +150,7 @@ static void mallocFail ( Int32 n )
/*---------------------------------------------*/
-static void tooManyBlocks ( Int32 max_handled_blocks )
+__dead static void tooManyBlocks ( Int32 max_handled_blocks )
{
fprintf ( stderr,
"%s: `%s' appears to contain more than %d blocks\n",
@@ -138,20 +166,6 @@ static void tooManyBlocks ( Int32 max_ha
-/*---------------------------------------------------*/
-/*--- Bit stream I/O ---*/
-/*---------------------------------------------------*/
-
-typedef
- struct {
- FILE* handle;
- Int32 buffer;
- Int32 buffLive;
- Char mode;
- }
- BitStream;
-
-
/*---------------------------------------------*/
static BitStream* bsOpenReadStream ( FILE* stream )
{
Index: src/external/bsd/bzip2/bzlib.c
diff -u src/external/bsd/bzip2/bzlib.c:1.1.1.1 src/external/bsd/bzip2/bzlib.c:1.2
--- src/external/bsd/bzip2/bzlib.c:1.1.1.1 Mon May 7 00:21:46 2012
+++ src/external/bsd/bzip2/bzlib.c Mon May 7 00:30:05 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: bzlib.c,v 1.1.1.1 2012/05/07 00:21:46 wiz Exp $ */
+/* $NetBSD: bzlib.c,v 1.2 2012/05/07 00:30:05 wiz Exp $ */
/*-------------------------------------------------------------*/
@@ -1410,7 +1410,7 @@ BZFILE * bzopen_or_bzdopen
case 's':
smallMode = 1; break;
default:
- if (isdigit((int)(*mode))) {
+ if (isdigit((unsigned char)(*mode))) {
blockSize100k = *mode-BZ_HDR_0;
}
}
Index: src/external/bsd/bzip2/bzlib_private.h
diff -u src/external/bsd/bzip2/bzlib_private.h:1.1.1.1 src/external/bsd/bzip2/bzlib_private.h:1.2
--- src/external/bsd/bzip2/bzlib_private.h:1.1.1.1 Mon May 7 00:21:46 2012
+++ src/external/bsd/bzip2/bzlib_private.h Mon May 7 00:30:05 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: bzlib_private.h,v 1.1.1.1 2012/05/07 00:21:46 wiz Exp $ */
+/* $NetBSD: bzlib_private.h,v 1.2 2012/05/07 00:30:05 wiz Exp $ */
/*-------------------------------------------------------------*/
@@ -57,7 +57,7 @@ typedef unsigned short UInt16;
#ifndef BZ_NO_STDIO
-extern void BZ2_bz__AssertH__fail ( int errcode );
+__dead void BZ2_bz__AssertH__fail ( int errcode );
#define AssertH(cond,errcode) \
{ if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); }
Index: src/external/bsd/bzip2/decompress.c
diff -u src/external/bsd/bzip2/decompress.c:1.1.1.1 src/external/bsd/bzip2/decompress.c:1.2
--- src/external/bsd/bzip2/decompress.c:1.1.1.1 Mon May 7 00:21:46 2012
+++ src/external/bsd/bzip2/decompress.c Mon May 7 00:30:05 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: decompress.c,v 1.1.1.1 2012/05/07 00:21:46 wiz Exp $ */
+/* $NetBSD: decompress.c,v 1.2 2012/05/07 00:30:05 wiz Exp $ */
/*-------------------------------------------------------------*/
@@ -383,6 +383,13 @@ Int32 BZ2_decompress ( DState* s )
es = -1;
N = 1;
do {
+ /* Check that N doesn't get too big, so that es doesn't
+ go negative. The maximum value that can be
+ RUNA/RUNB encoded is equal to the block size (post
+ the initial RLE), viz, 900k, so bounding N at 2
+ million should guard against overflow without
+ rejecting any legitimate inputs. */
+ if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR);
if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
if (nextSym == BZ_RUNB) es = es + (1+1) * N;
N = N * 2;
Added files:
Index: src/external/bsd/bzip2/bzip2netbsd
diff -u /dev/null src/external/bsd/bzip2/bzip2netbsd:1.1
--- /dev/null Mon May 7 00:30:06 2012
+++ src/external/bsd/bzip2/bzip2netbsd Mon May 7 00:30:05 2012
@@ -0,0 +1,123 @@
+#! /bin/sh
+#
+# $NetBSD: bzip2netbsd,v 1.1 2012/05/07 00:30:05 wiz Exp $
+#
+# Copyright (c) 1998, 1999, 2001 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# bzip2netbsd: convert a bzip2 source tree into a
+# netbsd bzip2 source tree, under src/external/bsd,
+# based on the other *2netbsd scripts in the NetBSD source tree
+#
+# Rough instructions for importing new bzip2 release:
+#
+# $ cd /some/where/temporary
+# $ tar xpfz /new/bzip2/release/tar/file
+# $ sh /usr/src/external/bsd/bzip2/bzip2netbsd bzip2-1.x.y `pwd`
+# $ cd src/external/bsd/bzip2
+# $ cvs import -m "Import bzip2 1.x.y" src/external/bsd/bzip2 JSEWARD bzip2-1-x-y
+# $ cd ../../..
+# $ rm -r src bzip2-1.x.y
+#
+# - check makefiles to see if any extra sources have been added.
+# - update distrib/sets if necessary.
+
+if [ $# -ne 2 ]; then echo "bzip2netbsd src dest"; exit 1; fi
+
+r=$1
+d=$2/src/external/bsd/bzip2
+
+case "$d" in
+ /*)
+ ;;
+ *)
+ d=`/bin/pwd`/$d
+ ;;
+esac
+
+case "$r" in
+ /*)
+ ;;
+ *)
+ r=`/bin/pwd`/$r
+ ;;
+esac
+
+echo preparing directory $d
+rm -rf $d
+mkdir -p $d
+
+### Copy the files and directories
+echo copying $r to $d
+cd $r
+pax -rw * $d
+
+# cd to import directory
+cd $d
+
+### delete formatted manual pages
+echo removing unneeded directories and files
+rm -f bzip2.1.preformatted bzip2.txt
+
+### bzip2 distribution doesn't have RCS/CVS tags (!).
+
+### Add our NetBSD RCS Id
+find $d -type f -name '*.[chly]' -print | while read c; do
+ sed 1q < $c | grep -q '\$NetBSD' || (
+echo "/* \$NetBSD\$ */" >/tmp/bzip3n$$
+echo "" >>/tmp/bzip3n$$
+cat $c >> /tmp/bzip3n$$
+mv /tmp/bzip3n$$ $c && echo added NetBSD RCS tag to $c
+ )
+done
+
+find $d -type f -name '*.[0-9]' -print | while read m; do
+ sed 1q < $m | grep -q '\$NetBSD' || (
+echo ".\\\" \$NetBSD\$" >/tmp/bzip2m$$
+echo ".\\\"" >>/tmp/bzip2m$$
+cat $m >> /tmp/bzip2m$$
+mv /tmp/bzip2m$$ $m && echo added NetBSD RCS tag to $m
+ )
+done
+
+echo done
+
+### Clean up any CVS directories that might be around.
+echo "cleaning up CVS residue."
+(
+ cd $d
+ find . -type d -name "CVS" -print | xargs rm -r
+)
+echo done
+
+### Fixing file and directory permissions.
+echo "Fixing file/directory permissions."
+(
+ cd $d
+ find . -type f -print | xargs chmod u+rw,go+r
+ find . -type d -print | xargs chmod u+rwx,go+rx
+)
+echo done
+
+exit 0