summaryrefslogtreecommitdiffstats
path: root/upstream/mageia-cauldron/man3pm/Archive::Tar.3pm
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/mageia-cauldron/man3pm/Archive::Tar.3pm')
-rw-r--r--upstream/mageia-cauldron/man3pm/Archive::Tar.3pm978
1 files changed, 978 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man3pm/Archive::Tar.3pm b/upstream/mageia-cauldron/man3pm/Archive::Tar.3pm
new file mode 100644
index 00000000..9778bcd4
--- /dev/null
+++ b/upstream/mageia-cauldron/man3pm/Archive::Tar.3pm
@@ -0,0 +1,978 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "Archive::Tar 3pm"
+.TH Archive::Tar 3pm 2023-11-28 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+Archive::Tar \- module for manipulations of tar archives
+.SH SYNOPSIS
+.IX Header "SYNOPSIS"
+.Vb 2
+\& use Archive::Tar;
+\& my $tar = Archive::Tar\->new;
+\&
+\& $tar\->read(\*(Aqorigin.tgz\*(Aq);
+\& $tar\->extract();
+\&
+\& $tar\->add_files(\*(Aqfile/foo.pl\*(Aq, \*(Aqdocs/README\*(Aq);
+\& $tar\->add_data(\*(Aqfile/baz.txt\*(Aq, \*(AqThis is the contents now\*(Aq);
+\&
+\& $tar\->rename(\*(Aqoldname\*(Aq, \*(Aqnew/file/name\*(Aq);
+\& $tar\->chown(\*(Aq/\*(Aq, \*(Aqroot\*(Aq);
+\& $tar\->chown(\*(Aq/\*(Aq, \*(Aqroot:root\*(Aq);
+\& $tar\->chmod(\*(Aq/tmp\*(Aq, \*(Aq1777\*(Aq);
+\&
+\& $tar\->write(\*(Aqfiles.tar\*(Aq); # plain tar
+\& $tar\->write(\*(Aqfiles.tgz\*(Aq, COMPRESS_GZIP); # gzip compressed
+\& $tar\->write(\*(Aqfiles.tbz\*(Aq, COMPRESS_BZIP); # bzip2 compressed
+\& $tar\->write(\*(Aqfiles.txz\*(Aq, COMPRESS_XZ); # xz compressed
+.Ve
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+Archive::Tar provides an object oriented mechanism for handling tar
+files. It provides class methods for quick and easy files handling
+while also allowing for the creation of tar file objects for custom
+manipulation. If you have the IO::Zlib module installed,
+Archive::Tar will also support compressed or gzipped tar files.
+.PP
+An object of class Archive::Tar represents a .tar(.gz) archive full
+of files and things.
+.SH "Object Methods"
+.IX Header "Object Methods"
+.ie n .SS "Archive::Tar\->new( [$file, $compressed] )"
+.el .SS "Archive::Tar\->new( [$file, \f(CW$compressed\fP] )"
+.IX Subsection "Archive::Tar->new( [$file, $compressed] )"
+Returns a new Tar object. If given any arguments, \f(CWnew()\fR calls the
+\&\f(CWread()\fR method automatically, passing on the arguments provided to
+the \f(CWread()\fR method.
+.PP
+If \f(CWnew()\fR is invoked with arguments and the \f(CWread()\fR method fails
+for any reason, \f(CWnew()\fR returns undef.
+.ie n .SS "$tar\->read ( $filename|$handle, [$compressed, {opt => 'val'}] )"
+.el .SS "\f(CW$tar\fP\->read ( \f(CW$filename\fP|$handle, [$compressed, {opt => 'val'}] )"
+.IX Subsection "$tar->read ( $filename|$handle, [$compressed, {opt => 'val'}] )"
+Read the given tar file into memory.
+The first argument can either be the name of a file or a reference to
+an already open filehandle (or an IO::Zlib object if it's compressed)
+.PP
+The \f(CW\*(C`read\*(C'\fR will \fIreplace\fR any previous content in \f(CW$tar\fR!
+.PP
+The second argument may be considered optional, but remains for
+backwards compatibility. Archive::Tar now looks at the file
+magic to determine what class should be used to open the file
+and will transparently Do The Right Thing.
+.PP
+Archive::Tar will warn if you try to pass a bzip2 / xz compressed file and the
+IO::Uncompress::Bunzip2 / IO::Uncompress::UnXz are not available and simply return.
+.PP
+Note that you can currently \fBnot\fR pass a \f(CW\*(C`gzip\*(C'\fR compressed
+filehandle, which is not opened with \f(CW\*(C`IO::Zlib\*(C'\fR, a \f(CW\*(C`bzip2\*(C'\fR compressed
+filehandle, which is not opened with \f(CW\*(C`IO::Uncompress::Bunzip2\*(C'\fR, a \f(CW\*(C`xz\*(C'\fR compressed
+filehandle, which is not opened with \f(CW\*(C`IO::Uncompress::UnXz\*(C'\fR, nor a string
+containing the full archive information (either compressed or
+uncompressed). These are worth while features, but not currently
+implemented. See the \f(CW\*(C`TODO\*(C'\fR section.
+.PP
+The third argument can be a hash reference with options. Note that
+all options are case-sensitive.
+.IP limit 4
+.IX Item "limit"
+Do not read more than \f(CW\*(C`limit\*(C'\fR files. This is useful if you have
+very big archives, and are only interested in the first few files.
+.IP filter 4
+.IX Item "filter"
+Can be set to a regular expression. Only files with names that match
+the expression will be read.
+.IP md5 4
+.IX Item "md5"
+Set to 1 and the md5sum of files will be returned (instead of file data)
+ my \f(CW$iter\fR = Archive::Tar\->iter( \f(CW$file\fR, 1, {md5 => 1} );
+ while( my \f(CW$f\fR = \f(CW$iter\fR\->() ) {
+ print \f(CW$f\fR\->data . "\et" . \f(CW$f\fR\->full_path . $/;
+ }
+.IP extract 4
+.IX Item "extract"
+If set to true, immediately extract entries when reading them. This
+gives you the same memory break as the \f(CW\*(C`extract_archive\*(C'\fR function.
+Note however that entries will not be read into memory, but written
+straight to disk. This means no \f(CW\*(C`Archive::Tar::File\*(C'\fR objects are
+created for you to inspect.
+.PP
+All files are stored internally as \f(CW\*(C`Archive::Tar::File\*(C'\fR objects.
+Please consult the Archive::Tar::File documentation for details.
+.PP
+Returns the number of files read in scalar context, and a list of
+\&\f(CW\*(C`Archive::Tar::File\*(C'\fR objects in list context.
+.ie n .SS "$tar\->contains_file( $filename )"
+.el .SS "\f(CW$tar\fP\->contains_file( \f(CW$filename\fP )"
+.IX Subsection "$tar->contains_file( $filename )"
+Check if the archive contains a certain file.
+It will return true if the file is in the archive, false otherwise.
+.PP
+Note however, that this function does an exact match using \f(CW\*(C`eq\*(C'\fR
+on the full path. So it cannot compensate for case-insensitive file\-
+systems or compare 2 paths to see if they would point to the same
+underlying file.
+.ie n .SS "$tar\->extract( [@filenames] )"
+.el .SS "\f(CW$tar\fP\->extract( [@filenames] )"
+.IX Subsection "$tar->extract( [@filenames] )"
+Write files whose names are equivalent to any of the names in
+\&\f(CW@filenames\fR to disk, creating subdirectories as necessary. This
+might not work too well under VMS.
+Under MacPerl, the file's modification time will be converted to the
+MacOS zero of time, and appropriate conversions will be done to the
+path. However, the length of each element of the path is not
+inspected to see whether it's longer than MacOS currently allows (32
+characters).
+.PP
+If \f(CW\*(C`extract\*(C'\fR is called without a list of file names, the entire
+contents of the archive are extracted.
+.PP
+Returns a list of filenames extracted.
+.ie n .SS "$tar\->extract_file( $file, [$extract_path] )"
+.el .SS "\f(CW$tar\fP\->extract_file( \f(CW$file\fP, [$extract_path] )"
+.IX Subsection "$tar->extract_file( $file, [$extract_path] )"
+Write an entry, whose name is equivalent to the file name provided to
+disk. Optionally takes a second parameter, which is the full native
+path (including filename) the entry will be written to.
+.PP
+For example:
+.PP
+.Vb 1
+\& $tar\->extract_file( \*(Aqname/in/archive\*(Aq, \*(Aqname/i/want/to/give/it\*(Aq );
+\&
+\& $tar\->extract_file( $at_file_object, \*(Aqname/i/want/to/give/it\*(Aq );
+.Ve
+.PP
+Returns true on success, false on failure.
+.ie n .SS "$tar\->list_files( [\e@properties] )"
+.el .SS "\f(CW$tar\fP\->list_files( [\e@properties] )"
+.IX Subsection "$tar->list_files( [@properties] )"
+Returns a list of the names of all the files in the archive.
+.PP
+If \f(CWlist_files()\fR is passed an array reference as its first argument
+it returns a list of hash references containing the requested
+properties of each file. The following list of properties is
+supported: name, size, mtime (last modified date), mode, uid, gid,
+linkname, uname, gname, devmajor, devminor, prefix.
+.PP
+Passing an array reference containing only one element, 'name', is
+special cased to return a list of names rather than a list of hash
+references, making it equivalent to calling \f(CW\*(C`list_files\*(C'\fR without
+arguments.
+.ie n .SS "$tar\->get_files( [@filenames] )"
+.el .SS "\f(CW$tar\fP\->get_files( [@filenames] )"
+.IX Subsection "$tar->get_files( [@filenames] )"
+Returns the \f(CW\*(C`Archive::Tar::File\*(C'\fR objects matching the filenames
+provided. If no filename list was passed, all \f(CW\*(C`Archive::Tar::File\*(C'\fR
+objects in the current Tar object are returned.
+.PP
+Please refer to the \f(CW\*(C`Archive::Tar::File\*(C'\fR documentation on how to
+handle these objects.
+.ie n .SS "$tar\->get_content( $file )"
+.el .SS "\f(CW$tar\fP\->get_content( \f(CW$file\fP )"
+.IX Subsection "$tar->get_content( $file )"
+Return the content of the named file.
+.ie n .SS "$tar\->replace_content( $file, $content )"
+.el .SS "\f(CW$tar\fP\->replace_content( \f(CW$file\fP, \f(CW$content\fP )"
+.IX Subsection "$tar->replace_content( $file, $content )"
+Make the string \f(CW$content\fR be the content for the file named \f(CW$file\fR.
+.ie n .SS "$tar\->rename( $file, $new_name )"
+.el .SS "\f(CW$tar\fP\->rename( \f(CW$file\fP, \f(CW$new_name\fP )"
+.IX Subsection "$tar->rename( $file, $new_name )"
+Rename the file of the in-memory archive to \f(CW$new_name\fR.
+.PP
+Note that you must specify a Unix path for \f(CW$new_name\fR, since per tar
+standard, all files in the archive must be Unix paths.
+.PP
+Returns true on success and false on failure.
+.ie n .SS "$tar\->chmod( $file, $mode )"
+.el .SS "\f(CW$tar\fP\->chmod( \f(CW$file\fP, \f(CW$mode\fP )"
+.IX Subsection "$tar->chmod( $file, $mode )"
+Change mode of \f(CW$file\fR to \f(CW$mode\fR.
+.PP
+Returns true on success and false on failure.
+.ie n .SS "$tar\->chown( $file, $uname [, $gname] )"
+.el .SS "\f(CW$tar\fP\->chown( \f(CW$file\fP, \f(CW$uname\fP [, \f(CW$gname\fP] )"
+.IX Subsection "$tar->chown( $file, $uname [, $gname] )"
+Change owner \f(CW$file\fR to \f(CW$uname\fR and \f(CW$gname\fR.
+.PP
+Returns true on success and false on failure.
+.ie n .SS "$tar\->remove (@filenamelist)"
+.el .SS "\f(CW$tar\fP\->remove (@filenamelist)"
+.IX Subsection "$tar->remove (@filenamelist)"
+Removes any entries with names matching any of the given filenames
+from the in-memory archive. Returns a list of \f(CW\*(C`Archive::Tar::File\*(C'\fR
+objects that remain.
+.ie n .SS $tar\->clear
+.el .SS \f(CW$tar\fP\->clear
+.IX Subsection "$tar->clear"
+\&\f(CW\*(C`clear\*(C'\fR clears the current in-memory archive. This effectively gives
+you a 'blank' object, ready to be filled again. Note that \f(CW\*(C`clear\*(C'\fR
+only has effect on the object, not the underlying tarfile.
+.ie n .SS "$tar\->write ( [$file, $compressed, $prefix] )"
+.el .SS "\f(CW$tar\fP\->write ( [$file, \f(CW$compressed\fP, \f(CW$prefix\fP] )"
+.IX Subsection "$tar->write ( [$file, $compressed, $prefix] )"
+Write the in-memory archive to disk. The first argument can either
+be the name of a file or a reference to an already open filehandle (a
+GLOB reference).
+.PP
+The second argument is used to indicate compression. You can
+compress using \f(CW\*(C`gzip\*(C'\fR, \f(CW\*(C`bzip2\*(C'\fR or \f(CW\*(C`xz\*(C'\fR. If you pass a digit, it's assumed
+to be the \f(CW\*(C`gzip\*(C'\fR compression level (between 1 and 9), but the use of
+constants is preferred:
+.PP
+.Vb 2
+\& # write a gzip compressed file
+\& $tar\->write( \*(Aqout.tgz\*(Aq, COMPRESS_GZIP );
+\&
+\& # write a bzip compressed file
+\& $tar\->write( \*(Aqout.tbz\*(Aq, COMPRESS_BZIP );
+\&
+\& # write a xz compressed file
+\& $tar\->write( \*(Aqout.txz\*(Aq, COMPRESS_XZ );
+.Ve
+.PP
+Note that when you pass in a filehandle, the compression argument
+is ignored, as all files are printed verbatim to your filehandle.
+If you wish to enable compression with filehandles, use an
+\&\f(CW\*(C`IO::Zlib\*(C'\fR, \f(CW\*(C`IO::Compress::Bzip2\*(C'\fR or \f(CW\*(C`IO::Compress::Xz\*(C'\fR filehandle instead.
+.PP
+The third argument is an optional prefix. All files will be tucked
+away in the directory you specify as prefix. So if you have files
+\&'a' and 'b' in your archive, and you specify 'foo' as prefix, they
+will be written to the archive as 'foo/a' and 'foo/b'.
+.PP
+If no arguments are given, \f(CW\*(C`write\*(C'\fR returns the entire formatted
+archive as a string, which could be useful if you'd like to stuff the
+archive into a socket or a pipe to gzip or something.
+.ie n .SS "$tar\->add_files( @filenamelist )"
+.el .SS "\f(CW$tar\fP\->add_files( \f(CW@filenamelist\fP )"
+.IX Subsection "$tar->add_files( @filenamelist )"
+Takes a list of filenames and adds them to the in-memory archive.
+.PP
+The path to the file is automatically converted to a Unix like
+equivalent for use in the archive, and, if on MacOS, the file's
+modification time is converted from the MacOS epoch to the Unix epoch.
+So tar archives created on MacOS with \fBArchive::Tar\fR can be read
+both with \fItar\fR on Unix and applications like \fIsuntar\fR or
+\&\fIStuffit Expander\fR on MacOS.
+.PP
+Be aware that the file's type/creator and resource fork will be lost,
+which is usually what you want in cross-platform archives.
+.PP
+Instead of a filename, you can also pass it an existing \f(CW\*(C`Archive::Tar::File\*(C'\fR
+object from, for example, another archive. The object will be clone, and
+effectively be a copy of the original, not an alias.
+.PP
+Returns a list of \f(CW\*(C`Archive::Tar::File\*(C'\fR objects that were just added.
+.ie n .SS "$tar\->add_data ( $filename, $data, [$opthashref] )"
+.el .SS "\f(CW$tar\fP\->add_data ( \f(CW$filename\fP, \f(CW$data\fP, [$opthashref] )"
+.IX Subsection "$tar->add_data ( $filename, $data, [$opthashref] )"
+Takes a filename, a scalar full of data and optionally a reference to
+a hash with specific options.
+.PP
+Will add a file to the in-memory archive, with name \f(CW$filename\fR and
+content \f(CW$data\fR. Specific properties can be set using \f(CW$opthashref\fR.
+The following list of properties is supported: name, size, mtime
+(last modified date), mode, uid, gid, linkname, uname, gname,
+devmajor, devminor, prefix, type. (On MacOS, the file's path and
+modification times are converted to Unix equivalents.)
+.PP
+Valid values for the file type are the following constants defined by
+Archive::Tar::Constant:
+.IP FILE 4
+.IX Item "FILE"
+Regular file.
+.IP HARDLINK 4
+.IX Item "HARDLINK"
+.PD 0
+.IP SYMLINK 4
+.IX Item "SYMLINK"
+.PD
+Hard and symbolic ("soft") links; linkname should specify target.
+.IP CHARDEV 4
+.IX Item "CHARDEV"
+.PD 0
+.IP BLOCKDEV 4
+.IX Item "BLOCKDEV"
+.PD
+Character and block devices. devmajor and devminor should specify the major
+and minor device numbers.
+.IP DIR 4
+.IX Item "DIR"
+Directory.
+.IP FIFO 4
+.IX Item "FIFO"
+FIFO (named pipe).
+.IP SOCKET 4
+.IX Item "SOCKET"
+Socket.
+.PP
+Returns the \f(CW\*(C`Archive::Tar::File\*(C'\fR object that was just added, or
+\&\f(CW\*(C`undef\*(C'\fR on failure.
+.ie n .SS "$tar\->error( [$BOOL] )"
+.el .SS "\f(CW$tar\fP\->error( [$BOOL] )"
+.IX Subsection "$tar->error( [$BOOL] )"
+Returns the current error string (usually, the last error reported).
+If a true value was specified, it will give the \f(CW\*(C`Carp::longmess\*(C'\fR
+equivalent of the error, in effect giving you a stacktrace.
+.PP
+For backwards compatibility, this error is also available as
+\&\f(CW$Archive::Tar::error\fR although it is much recommended you use the
+method call instead.
+.ie n .SS "$tar\->setcwd( $cwd );"
+.el .SS "\f(CW$tar\fP\->setcwd( \f(CW$cwd\fP );"
+.IX Subsection "$tar->setcwd( $cwd );"
+\&\f(CW\*(C`Archive::Tar\*(C'\fR needs to know the current directory, and it will run
+\&\f(CWCwd::cwd()\fR \fIevery\fR time it extracts a \fIrelative\fR entry from the
+tarfile and saves it in the file system. (As of version 1.30, however,
+\&\f(CW\*(C`Archive::Tar\*(C'\fR will use the speed optimization described below
+automatically, so it's only relevant if you're using \f(CWextract_file()\fR).
+.PP
+Since \f(CW\*(C`Archive::Tar\*(C'\fR doesn't change the current directory internally
+while it is extracting the items in a tarball, all calls to \f(CWCwd::cwd()\fR
+can be avoided if we can guarantee that the current directory doesn't
+get changed externally.
+.PP
+To use this performance boost, set the current directory via
+.PP
+.Vb 2
+\& use Cwd;
+\& $tar\->setcwd( cwd() );
+.Ve
+.PP
+once before calling a function like \f(CW\*(C`extract_file\*(C'\fR and
+\&\f(CW\*(C`Archive::Tar\*(C'\fR will use the current directory setting from then on
+and won't call \f(CWCwd::cwd()\fR internally.
+.PP
+To switch back to the default behaviour, use
+.PP
+.Vb 1
+\& $tar\->setcwd( undef );
+.Ve
+.PP
+and \f(CW\*(C`Archive::Tar\*(C'\fR will call \f(CWCwd::cwd()\fR internally again.
+.PP
+If you're using \f(CW\*(C`Archive::Tar\*(C'\fR's \f(CWextract()\fR method, \f(CWsetcwd()\fR will
+be called for you.
+.SH "Class Methods"
+.IX Header "Class Methods"
+.ie n .SS "Archive::Tar\->create_archive($file, $compressed, @filelist)"
+.el .SS "Archive::Tar\->create_archive($file, \f(CW$compressed\fP, \f(CW@filelist\fP)"
+.IX Subsection "Archive::Tar->create_archive($file, $compressed, @filelist)"
+Creates a tar file from the list of files provided. The first
+argument can either be the name of the tar file to create or a
+reference to an open file handle (e.g. a GLOB reference).
+.PP
+The second argument is used to indicate compression. You can
+compress using \f(CW\*(C`gzip\*(C'\fR, \f(CW\*(C`bzip2\*(C'\fR or \f(CW\*(C`xz\*(C'\fR. If you pass a digit, it's assumed
+to be the \f(CW\*(C`gzip\*(C'\fR compression level (between 1 and 9), but the use of
+constants is preferred:
+.PP
+.Vb 2
+\& # write a gzip compressed file
+\& Archive::Tar\->create_archive( \*(Aqout.tgz\*(Aq, COMPRESS_GZIP, @filelist );
+\&
+\& # write a bzip compressed file
+\& Archive::Tar\->create_archive( \*(Aqout.tbz\*(Aq, COMPRESS_BZIP, @filelist );
+\&
+\& # write a xz compressed file
+\& Archive::Tar\->create_archive( \*(Aqout.txz\*(Aq, COMPRESS_XZ, @filelist );
+.Ve
+.PP
+Note that when you pass in a filehandle, the compression argument
+is ignored, as all files are printed verbatim to your filehandle.
+If you wish to enable compression with filehandles, use an
+\&\f(CW\*(C`IO::Zlib\*(C'\fR, \f(CW\*(C`IO::Compress::Bzip2\*(C'\fR or \f(CW\*(C`IO::Compress::Xz\*(C'\fR filehandle instead.
+.PP
+The remaining arguments list the files to be included in the tar file.
+These files must all exist. Any files which don't exist or can't be
+read are silently ignored.
+.PP
+If the archive creation fails for any reason, \f(CW\*(C`create_archive\*(C'\fR will
+return false. Please use the \f(CW\*(C`error\*(C'\fR method to find the cause of the
+failure.
+.PP
+Note that this method does not write \f(CW\*(C`on the fly\*(C'\fR as it were; it
+still reads all the files into memory before writing out the archive.
+Consult the FAQ below if this is a problem.
+.ie n .SS "Archive::Tar\->iter( $filename, [ $compressed, {opt => $val} ] )"
+.el .SS "Archive::Tar\->iter( \f(CW$filename\fP, [ \f(CW$compressed\fP, {opt => \f(CW$val\fP} ] )"
+.IX Subsection "Archive::Tar->iter( $filename, [ $compressed, {opt => $val} ] )"
+Returns an iterator function that reads the tar file without loading
+it all in memory. Each time the function is called it will return the
+next file in the tarball. The files are returned as
+\&\f(CW\*(C`Archive::Tar::File\*(C'\fR objects. The iterator function returns the
+empty list once it has exhausted the files contained.
+.PP
+The second argument can be a hash reference with options, which are
+identical to the arguments passed to \f(CWread()\fR.
+.PP
+Example usage:
+.PP
+.Vb 1
+\& my $next = Archive::Tar\->iter( "example.tar.gz", 1, {filter => qr/\e.pm$/} );
+\&
+\& while( my $f = $next\->() ) {
+\& print $f\->name, "\en";
+\&
+\& $f\->extract or warn "Extraction failed";
+\&
+\& # ....
+\& }
+.Ve
+.ie n .SS "Archive::Tar\->list_archive($file, $compressed, [\e@properties])"
+.el .SS "Archive::Tar\->list_archive($file, \f(CW$compressed\fP, [\e@properties])"
+.IX Subsection "Archive::Tar->list_archive($file, $compressed, [@properties])"
+Returns a list of the names of all the files in the archive. The
+first argument can either be the name of the tar file to list or a
+reference to an open file handle (e.g. a GLOB reference).
+.PP
+If \f(CWlist_archive()\fR is passed an array reference as its third
+argument it returns a list of hash references containing the requested
+properties of each file. The following list of properties is
+supported: full_path, name, size, mtime (last modified date), mode,
+uid, gid, linkname, uname, gname, devmajor, devminor, prefix, type.
+.PP
+See \f(CW\*(C`Archive::Tar::File\*(C'\fR for details about supported properties.
+.PP
+Passing an array reference containing only one element, 'name', is
+special cased to return a list of names rather than a list of hash
+references.
+.ie n .SS "Archive::Tar\->extract_archive($file, $compressed)"
+.el .SS "Archive::Tar\->extract_archive($file, \f(CW$compressed\fP)"
+.IX Subsection "Archive::Tar->extract_archive($file, $compressed)"
+Extracts the contents of the tar file. The first argument can either
+be the name of the tar file to create or a reference to an open file
+handle (e.g. a GLOB reference). All relative paths in the tar file will
+be created underneath the current working directory.
+.PP
+\&\f(CW\*(C`extract_archive\*(C'\fR will return a list of files it extracted.
+If the archive extraction fails for any reason, \f(CW\*(C`extract_archive\*(C'\fR
+will return false. Please use the \f(CW\*(C`error\*(C'\fR method to find the cause
+of the failure.
+.ie n .SS "$bool = Archive::Tar\->has_io_string"
+.el .SS "\f(CW$bool\fP = Archive::Tar\->has_io_string"
+.IX Subsection "$bool = Archive::Tar->has_io_string"
+Returns true if we currently have \f(CW\*(C`IO::String\*(C'\fR support loaded.
+.PP
+Either \f(CW\*(C`IO::String\*(C'\fR or \f(CW\*(C`perlio\*(C'\fR support is needed to support writing
+stringified archives. Currently, \f(CW\*(C`perlio\*(C'\fR is the preferred method, if
+available.
+.PP
+See the \f(CW\*(C`GLOBAL VARIABLES\*(C'\fR section to see how to change this preference.
+.ie n .SS "$bool = Archive::Tar\->has_perlio"
+.el .SS "\f(CW$bool\fP = Archive::Tar\->has_perlio"
+.IX Subsection "$bool = Archive::Tar->has_perlio"
+Returns true if we currently have \f(CW\*(C`perlio\*(C'\fR support loaded.
+.PP
+This requires \f(CW\*(C`perl\-5.8\*(C'\fR or higher, compiled with \f(CW\*(C`perlio\*(C'\fR
+.PP
+Either \f(CW\*(C`IO::String\*(C'\fR or \f(CW\*(C`perlio\*(C'\fR support is needed to support writing
+stringified archives. Currently, \f(CW\*(C`perlio\*(C'\fR is the preferred method, if
+available.
+.PP
+See the \f(CW\*(C`GLOBAL VARIABLES\*(C'\fR section to see how to change this preference.
+.ie n .SS "$bool = Archive::Tar\->has_zlib_support"
+.el .SS "\f(CW$bool\fP = Archive::Tar\->has_zlib_support"
+.IX Subsection "$bool = Archive::Tar->has_zlib_support"
+Returns true if \f(CW\*(C`Archive::Tar\*(C'\fR can extract \f(CW\*(C`zlib\*(C'\fR compressed archives
+.ie n .SS "$bool = Archive::Tar\->has_bzip2_support"
+.el .SS "\f(CW$bool\fP = Archive::Tar\->has_bzip2_support"
+.IX Subsection "$bool = Archive::Tar->has_bzip2_support"
+Returns true if \f(CW\*(C`Archive::Tar\*(C'\fR can extract \f(CW\*(C`bzip2\*(C'\fR compressed archives
+.ie n .SS "$bool = Archive::Tar\->has_xz_support"
+.el .SS "\f(CW$bool\fP = Archive::Tar\->has_xz_support"
+.IX Subsection "$bool = Archive::Tar->has_xz_support"
+Returns true if \f(CW\*(C`Archive::Tar\*(C'\fR can extract \f(CW\*(C`xz\*(C'\fR compressed archives
+.SS Archive::Tar\->can_handle_compressed_files
+.IX Subsection "Archive::Tar->can_handle_compressed_files"
+A simple checking routine, which will return true if \f(CW\*(C`Archive::Tar\*(C'\fR
+is able to uncompress compressed archives on the fly with \f(CW\*(C`IO::Zlib\*(C'\fR,
+\&\f(CW\*(C`IO::Compress::Bzip2\*(C'\fR and \f(CW\*(C`IO::Compress::Xz\*(C'\fR or false if not both are installed.
+.PP
+You can use this as a shortcut to determine whether \f(CW\*(C`Archive::Tar\*(C'\fR
+will do what you think before passing compressed archives to its
+\&\f(CW\*(C`read\*(C'\fR method.
+.SH "GLOBAL VARIABLES"
+.IX Header "GLOBAL VARIABLES"
+.ie n .SS $Archive::Tar::FOLLOW_SYMLINK
+.el .SS \f(CW$Archive::Tar::FOLLOW_SYMLINK\fP
+.IX Subsection "$Archive::Tar::FOLLOW_SYMLINK"
+Set this variable to \f(CW1\fR to make \f(CW\*(C`Archive::Tar\*(C'\fR effectively make a
+copy of the file when extracting. Default is \f(CW0\fR, which
+means the symlink stays intact. Of course, you will have to pack the
+file linked to as well.
+.PP
+This option is checked when you write out the tarfile using \f(CW\*(C`write\*(C'\fR
+or \f(CW\*(C`create_archive\*(C'\fR.
+.PP
+This works just like \f(CW\*(C`/bin/tar\*(C'\fR's \f(CW\*(C`\-h\*(C'\fR option.
+.ie n .SS $Archive::Tar::CHOWN
+.el .SS \f(CW$Archive::Tar::CHOWN\fP
+.IX Subsection "$Archive::Tar::CHOWN"
+By default, \f(CW\*(C`Archive::Tar\*(C'\fR will try to \f(CW\*(C`chown\*(C'\fR your files if it is
+able to. In some cases, this may not be desired. In that case, set
+this variable to \f(CW0\fR to disable \f(CW\*(C`chown\*(C'\fR\-ing, even if it were
+possible.
+.PP
+The default is \f(CW1\fR.
+.ie n .SS $Archive::Tar::CHMOD
+.el .SS \f(CW$Archive::Tar::CHMOD\fP
+.IX Subsection "$Archive::Tar::CHMOD"
+By default, \f(CW\*(C`Archive::Tar\*(C'\fR will try to \f(CW\*(C`chmod\*(C'\fR your files to
+whatever mode was specified for the particular file in the archive.
+In some cases, this may not be desired. In that case, set this
+variable to \f(CW0\fR to disable \f(CW\*(C`chmod\*(C'\fR\-ing.
+.PP
+The default is \f(CW1\fR.
+.ie n .SS $Archive::Tar::SAME_PERMISSIONS
+.el .SS \f(CW$Archive::Tar::SAME_PERMISSIONS\fP
+.IX Subsection "$Archive::Tar::SAME_PERMISSIONS"
+When, \f(CW$Archive::Tar::CHMOD\fR is enabled, this setting controls whether
+the permissions on files from the archive are used without modification
+of if they are filtered by removing any setid bits and applying the
+current umask.
+.PP
+The default is \f(CW1\fR for the root user and \f(CW0\fR for normal users.
+.ie n .SS $Archive::Tar::DO_NOT_USE_PREFIX
+.el .SS \f(CW$Archive::Tar::DO_NOT_USE_PREFIX\fP
+.IX Subsection "$Archive::Tar::DO_NOT_USE_PREFIX"
+By default, \f(CW\*(C`Archive::Tar\*(C'\fR will try to put paths that are over
+100 characters in the \f(CW\*(C`prefix\*(C'\fR field of your tar header, as
+defined per POSIX-standard. However, some (older) tar programs
+do not implement this spec. To retain compatibility with these older
+or non-POSIX compliant versions, you can set the \f(CW$DO_NOT_USE_PREFIX\fR
+variable to a true value, and \f(CW\*(C`Archive::Tar\*(C'\fR will use an alternate
+way of dealing with paths over 100 characters by using the
+\&\f(CW\*(C`GNU Extended Header\*(C'\fR feature.
+.PP
+Note that clients who do not support the \f(CW\*(C`GNU Extended Header\*(C'\fR
+feature will not be able to read these archives. Such clients include
+tars on \f(CW\*(C`Solaris\*(C'\fR, \f(CW\*(C`Irix\*(C'\fR and \f(CW\*(C`AIX\*(C'\fR.
+.PP
+The default is \f(CW0\fR.
+.ie n .SS $Archive::Tar::DEBUG
+.el .SS \f(CW$Archive::Tar::DEBUG\fP
+.IX Subsection "$Archive::Tar::DEBUG"
+Set this variable to \f(CW1\fR to always get the \f(CW\*(C`Carp::longmess\*(C'\fR output
+of the warnings, instead of the regular \f(CW\*(C`carp\*(C'\fR. This is the same
+message you would get by doing:
+.PP
+.Vb 1
+\& $tar\->error(1);
+.Ve
+.PP
+Defaults to \f(CW0\fR.
+.ie n .SS $Archive::Tar::WARN
+.el .SS \f(CW$Archive::Tar::WARN\fP
+.IX Subsection "$Archive::Tar::WARN"
+Set this variable to \f(CW0\fR if you do not want any warnings printed.
+Personally I recommend against doing this, but people asked for the
+option. Also, be advised that this is of course not threadsafe.
+.PP
+Defaults to \f(CW1\fR.
+.ie n .SS $Archive::Tar::error
+.el .SS \f(CW$Archive::Tar::error\fP
+.IX Subsection "$Archive::Tar::error"
+Holds the last reported error. Kept for historical reasons, but its
+use is very much discouraged. Use the \f(CWerror()\fR method instead:
+.PP
+.Vb 1
+\& warn $tar\->error unless $tar\->extract;
+.Ve
+.PP
+Note that in older versions of this module, the \f(CWerror()\fR method
+would return an effectively global value even when called an instance
+method as above. This has since been fixed, and multiple instances of
+\&\f(CW\*(C`Archive::Tar\*(C'\fR now have separate error strings.
+.ie n .SS $Archive::Tar::INSECURE_EXTRACT_MODE
+.el .SS \f(CW$Archive::Tar::INSECURE_EXTRACT_MODE\fP
+.IX Subsection "$Archive::Tar::INSECURE_EXTRACT_MODE"
+This variable indicates whether \f(CW\*(C`Archive::Tar\*(C'\fR should allow
+files to be extracted outside their current working directory.
+.PP
+Allowing this could have security implications, as a malicious
+tar archive could alter or replace any file the extracting user
+has permissions to. Therefor, the default is to not allow
+insecure extractions.
+.PP
+If you trust the archive, or have other reasons to allow the
+archive to write files outside your current working directory,
+set this variable to \f(CW\*(C`true\*(C'\fR.
+.PP
+Note that this is a backwards incompatible change from version
+\&\f(CW1.36\fR and before.
+.ie n .SS $Archive::Tar::HAS_PERLIO
+.el .SS \f(CW$Archive::Tar::HAS_PERLIO\fP
+.IX Subsection "$Archive::Tar::HAS_PERLIO"
+This variable holds a boolean indicating if we currently have
+\&\f(CW\*(C`perlio\*(C'\fR support loaded. This will be enabled for any perl
+greater than \f(CW5.8\fR compiled with \f(CW\*(C`perlio\*(C'\fR.
+.PP
+If you feel strongly about disabling it, set this variable to
+\&\f(CW\*(C`false\*(C'\fR. Note that you will then need \f(CW\*(C`IO::String\*(C'\fR installed
+to support writing stringified archives.
+.PP
+Don't change this variable unless you \fBreally\fR know what you're
+doing.
+.ie n .SS $Archive::Tar::HAS_IO_STRING
+.el .SS \f(CW$Archive::Tar::HAS_IO_STRING\fP
+.IX Subsection "$Archive::Tar::HAS_IO_STRING"
+This variable holds a boolean indicating if we currently have
+\&\f(CW\*(C`IO::String\*(C'\fR support loaded. This will be enabled for any perl
+that has a loadable \f(CW\*(C`IO::String\*(C'\fR module.
+.PP
+If you feel strongly about disabling it, set this variable to
+\&\f(CW\*(C`false\*(C'\fR. Note that you will then need \f(CW\*(C`perlio\*(C'\fR support from
+your perl to be able to write stringified archives.
+.PP
+Don't change this variable unless you \fBreally\fR know what you're
+doing.
+.ie n .SS $Archive::Tar::ZERO_PAD_NUMBERS
+.el .SS \f(CW$Archive::Tar::ZERO_PAD_NUMBERS\fP
+.IX Subsection "$Archive::Tar::ZERO_PAD_NUMBERS"
+This variable holds a boolean indicating if we will create
+zero padded numbers for \f(CW\*(C`size\*(C'\fR, \f(CW\*(C`mtime\*(C'\fR and \f(CW\*(C`checksum\*(C'\fR.
+The default is \f(CW0\fR, indicating that we will create space padded
+numbers. Added for compatibility with \f(CW\*(C`busybox\*(C'\fR implementations.
+.SS "Tuning the way RESOLVE_SYMLINK will works"
+.IX Subsection "Tuning the way RESOLVE_SYMLINK will works"
+.Vb 2
+\& You can tune the behaviour by setting the $Archive::Tar::RESOLVE_SYMLINK variable,
+\& or $ENV{PERL5_AT_RESOLVE_SYMLINK} before loading the module Archive::Tar.
+\&
+\& Values can be one of the following:
+\&
+\& none
+\& Disable this mechanism and failed as it was in previous version (<1.88)
+\&
+\& speed (default)
+\& If you prefer speed
+\& this will read again the whole archive using read() so all entries
+\& will be available
+\&
+\& memory
+\& If you prefer memory
+\&
+\& Limitation
+\&
+\& It won\*(Aqt work for terminal, pipe or sockets or every non seekable source.
+.Ve
+.SH FAQ
+.IX Header "FAQ"
+.IP "What's the minimum perl version required to run Archive::Tar?" 4
+.IX Item "What's the minimum perl version required to run Archive::Tar?"
+You will need perl version 5.005_03 or newer.
+.IP "Isn't Archive::Tar slow?" 4
+.IX Item "Isn't Archive::Tar slow?"
+Yes it is. It's pure perl, so it's a lot slower then your \f(CW\*(C`/bin/tar\*(C'\fR
+However, it's very portable. If speed is an issue, consider using
+\&\f(CW\*(C`/bin/tar\*(C'\fR instead.
+.IP "Isn't Archive::Tar heavier on memory than /bin/tar?" 4
+.IX Item "Isn't Archive::Tar heavier on memory than /bin/tar?"
+Yes it is, see previous answer. Since \f(CW\*(C`Compress::Zlib\*(C'\fR and therefore
+\&\f(CW\*(C`IO::Zlib\*(C'\fR doesn't support \f(CW\*(C`seek\*(C'\fR on their filehandles, there is little
+choice but to read the archive into memory.
+This is ok if you want to do in-memory manipulation of the archive.
+.Sp
+If you just want to extract, use the \f(CW\*(C`extract_archive\*(C'\fR class method
+instead. It will optimize and write to disk immediately.
+.Sp
+Another option is to use the \f(CW\*(C`iter\*(C'\fR class method to iterate over
+the files in the tarball without reading them all in memory at once.
+.IP "Can you lazy-load data instead?" 4
+.IX Item "Can you lazy-load data instead?"
+In some cases, yes. You can use the \f(CW\*(C`iter\*(C'\fR class method to iterate
+over the files in the tarball without reading them all in memory at once.
+.IP "How much memory will an X kb tar file need?" 4
+.IX Item "How much memory will an X kb tar file need?"
+Probably more than X kb, since it will all be read into memory. If
+this is a problem, and you don't need to do in memory manipulation
+of the archive, consider using the \f(CW\*(C`iter\*(C'\fR class method, or \f(CW\*(C`/bin/tar\*(C'\fR
+instead.
+.IP "What do you do with unsupported filetypes in an archive?" 4
+.IX Item "What do you do with unsupported filetypes in an archive?"
+\&\f(CW\*(C`Unix\*(C'\fR has a few filetypes that aren't supported on other platforms,
+like \f(CW\*(C`Win32\*(C'\fR. If we encounter a \f(CW\*(C`hardlink\*(C'\fR or \f(CW\*(C`symlink\*(C'\fR we'll just
+try to make a copy of the original file, rather than throwing an error.
+.Sp
+This does require you to read the entire archive in to memory first,
+since otherwise we wouldn't know what data to fill the copy with.
+(This means that you cannot use the class methods, including \f(CW\*(C`iter\*(C'\fR
+on archives that have incompatible filetypes and still expect things
+to work).
+.Sp
+For other filetypes, like \f(CW\*(C`chardevs\*(C'\fR and \f(CW\*(C`blockdevs\*(C'\fR we'll warn that
+the extraction of this particular item didn't work.
+.IP "I'm using WinZip, or some other non-POSIX client, and files are not being extracted properly!" 4
+.IX Item "I'm using WinZip, or some other non-POSIX client, and files are not being extracted properly!"
+By default, \f(CW\*(C`Archive::Tar\*(C'\fR is in a completely POSIX-compatible
+mode, which uses the POSIX-specification of \f(CW\*(C`tar\*(C'\fR to store files.
+For paths greater than 100 characters, this is done using the
+\&\f(CW\*(C`POSIX header prefix\*(C'\fR. Non-POSIX-compatible clients may not support
+this part of the specification, and may only support the \f(CW\*(C`GNU Extended
+Header\*(C'\fR functionality. To facilitate those clients, you can set the
+\&\f(CW$Archive::Tar::DO_NOT_USE_PREFIX\fR variable to \f(CW\*(C`true\*(C'\fR. See the
+\&\f(CW\*(C`GLOBAL VARIABLES\*(C'\fR section for details on this variable.
+.Sp
+Note that GNU tar earlier than version 1.14 does not cope well with
+the \f(CW\*(C`POSIX header prefix\*(C'\fR. If you use such a version, consider setting
+the \f(CW$Archive::Tar::DO_NOT_USE_PREFIX\fR variable to \f(CW\*(C`true\*(C'\fR.
+.IP "How do I extract only files that have property X from an archive?" 4
+.IX Item "How do I extract only files that have property X from an archive?"
+Sometimes, you might not wish to extract a complete archive, just
+the files that are relevant to you, based on some criteria.
+.Sp
+You can do this by filtering a list of \f(CW\*(C`Archive::Tar::File\*(C'\fR objects
+based on your criteria. For example, to extract only files that have
+the string \f(CW\*(C`foo\*(C'\fR in their title, you would use:
+.Sp
+.Vb 3
+\& $tar\->extract(
+\& grep { $_\->full_path =~ /foo/ } $tar\->get_files
+\& );
+.Ve
+.Sp
+This way, you can filter on any attribute of the files in the archive.
+Consult the \f(CW\*(C`Archive::Tar::File\*(C'\fR documentation on how to use these
+objects.
+.IP "How do I access .tar.Z files?" 4
+.IX Item "How do I access .tar.Z files?"
+The \f(CW\*(C`Archive::Tar\*(C'\fR module can optionally use \f(CW\*(C`Compress::Zlib\*(C'\fR (via
+the \f(CW\*(C`IO::Zlib\*(C'\fR module) to access tar files that have been compressed
+with \f(CW\*(C`gzip\*(C'\fR. Unfortunately tar files compressed with the Unix \f(CW\*(C`compress\*(C'\fR
+utility cannot be read by \f(CW\*(C`Compress::Zlib\*(C'\fR and so cannot be directly
+accesses by \f(CW\*(C`Archive::Tar\*(C'\fR.
+.Sp
+If the \f(CW\*(C`uncompress\*(C'\fR or \f(CW\*(C`gunzip\*(C'\fR programs are available, you can use
+one of these workarounds to read \f(CW\*(C`.tar.Z\*(C'\fR files from \f(CW\*(C`Archive::Tar\*(C'\fR
+.Sp
+Firstly with \f(CW\*(C`uncompress\*(C'\fR
+.Sp
+.Vb 1
+\& use Archive::Tar;
+\&
+\& open F, "uncompress \-c $filename |";
+\& my $tar = Archive::Tar\->new(*F);
+\& ...
+.Ve
+.Sp
+and this with \f(CW\*(C`gunzip\*(C'\fR
+.Sp
+.Vb 1
+\& use Archive::Tar;
+\&
+\& open F, "gunzip \-c $filename |";
+\& my $tar = Archive::Tar\->new(*F);
+\& ...
+.Ve
+.Sp
+Similarly, if the \f(CW\*(C`compress\*(C'\fR program is available, you can use this to
+write a \f(CW\*(C`.tar.Z\*(C'\fR file
+.Sp
+.Vb 2
+\& use Archive::Tar;
+\& use IO::File;
+\&
+\& my $fh = IO::File\->new( "| compress \-c >$filename" );
+\& my $tar = Archive::Tar\->new();
+\& ...
+\& $tar\->write($fh);
+\& $fh\->close ;
+.Ve
+.IP "How do I handle Unicode strings?" 4
+.IX Item "How do I handle Unicode strings?"
+\&\f(CW\*(C`Archive::Tar\*(C'\fR uses byte semantics for any files it reads from or writes
+to disk. This is not a problem if you only deal with files and never
+look at their content or work solely with byte strings. But if you use
+Unicode strings with character semantics, some additional steps need
+to be taken.
+.Sp
+For example, if you add a Unicode string like
+.Sp
+.Vb 2
+\& # Problem
+\& $tar\->add_data(\*(Aqfile.txt\*(Aq, "Euro: \ex{20AC}");
+.Ve
+.Sp
+then there will be a problem later when the tarfile gets written out
+to disk via \f(CW\*(C`$tar\->write()\*(C'\fR:
+.Sp
+.Vb 1
+\& Wide character in print at .../Archive/Tar.pm line 1014.
+.Ve
+.Sp
+The data was added as a Unicode string and when writing it out to disk,
+the \f(CW\*(C`:utf8\*(C'\fR line discipline wasn't set by \f(CW\*(C`Archive::Tar\*(C'\fR, so Perl
+tried to convert the string to ISO\-8859 and failed. The written file
+now contains garbage.
+.Sp
+For this reason, Unicode strings need to be converted to UTF\-8\-encoded
+bytestrings before they are handed off to \f(CWadd_data()\fR:
+.Sp
+.Vb 3
+\& use Encode;
+\& my $data = "Accented character: \ex{20AC}";
+\& $data = encode(\*(Aqutf8\*(Aq, $data);
+\&
+\& $tar\->add_data(\*(Aqfile.txt\*(Aq, $data);
+.Ve
+.Sp
+A opposite problem occurs if you extract a UTF8\-encoded file from a
+tarball. Using \f(CWget_content()\fR on the \f(CW\*(C`Archive::Tar::File\*(C'\fR object
+will return its content as a bytestring, not as a Unicode string.
+.Sp
+If you want it to be a Unicode string (because you want character
+semantics with operations like regular expression matching), you need
+to decode the UTF8\-encoded content and have Perl convert it into
+a Unicode string:
+.Sp
+.Vb 2
+\& use Encode;
+\& my $data = $tar\->get_content();
+\&
+\& # Make it a Unicode string
+\& $data = decode(\*(Aqutf8\*(Aq, $data);
+.Ve
+.Sp
+There is no easy way to provide this functionality in \f(CW\*(C`Archive::Tar\*(C'\fR,
+because a tarball can contain many files, and each of which could be
+encoded in a different way.
+.SH CAVEATS
+.IX Header "CAVEATS"
+The AIX tar does not fill all unused space in the tar archive with 0x00.
+This sometimes leads to warning messages from \f(CW\*(C`Archive::Tar\*(C'\fR.
+.PP
+.Vb 1
+\& Invalid header block at offset nnn
+.Ve
+.PP
+A fix for that problem is scheduled to be released in the following levels
+of AIX, all of which should be coming out in the 4th quarter of 2009:
+.PP
+.Vb 4
+\& AIX 5.3 TL7 SP10
+\& AIX 5.3 TL8 SP8
+\& AIX 5.3 TL9 SP5
+\& AIX 5.3 TL10 SP2
+\&
+\& AIX 6.1 TL0 SP11
+\& AIX 6.1 TL1 SP7
+\& AIX 6.1 TL2 SP6
+\& AIX 6.1 TL3 SP3
+.Ve
+.PP
+The IBM APAR number for this problem is IZ50240 (Reported component ID:
+5765G0300 / AIX 5.3). It is possible to get an ifix for that problem.
+If you need an ifix please contact your local IBM AIX support.
+.SH TODO
+.IX Header "TODO"
+.IP "Check if passed in handles are open for read/write" 4
+.IX Item "Check if passed in handles are open for read/write"
+Currently I don't know of any portable pure perl way to do this.
+Suggestions welcome.
+.IP "Allow archives to be passed in as string" 4
+.IX Item "Allow archives to be passed in as string"
+Currently, we only allow opened filehandles or filenames, but
+not strings. The internals would need some reworking to facilitate
+stringified archives.
+.IP "Facilitate processing an opened filehandle of a compressed archive" 4
+.IX Item "Facilitate processing an opened filehandle of a compressed archive"
+Currently, we only support this if the filehandle is an IO::Zlib object.
+Environments, like apache, will present you with an opened filehandle
+to an uploaded file, which might be a compressed archive.
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+.IP "The GNU tar specification" 4
+.IX Item "The GNU tar specification"
+\&\f(CW\*(C`http://www.gnu.org/software/tar/manual/tar.html\*(C'\fR
+.IP "The PAX format specification" 4
+.IX Item "The PAX format specification"
+The specification which tar derives from; \f(CW\*(C` http://www.opengroup.org/onlinepubs/007904975/utilities/pax.html\*(C'\fR
+.ie n .IP "A comparison of GNU and POSIX tar standards; ""http://www.delorie.com/gnu/docs/tar/tar_114.html""" 4
+.el .IP "A comparison of GNU and POSIX tar standards; \f(CWhttp://www.delorie.com/gnu/docs/tar/tar_114.html\fR" 4
+.IX Item "A comparison of GNU and POSIX tar standards; http://www.delorie.com/gnu/docs/tar/tar_114.html"
+.PD 0
+.IP "GNU tar intends to switch to POSIX compatibility" 4
+.IX Item "GNU tar intends to switch to POSIX compatibility"
+.PD
+GNU Tar authors have expressed their intention to become completely
+POSIX-compatible; \f(CW\*(C`http://www.gnu.org/software/tar/manual/html_node/Formats.html\*(C'\fR
+.IP "A Comparison between various tar implementations" 4
+.IX Item "A Comparison between various tar implementations"
+Lists known issues and incompatibilities; \f(CW\*(C`http://gd.tuwien.ac.at/utils/archivers/star/README.otherbugs\*(C'\fR
+.SH AUTHOR
+.IX Header "AUTHOR"
+This module by Jos Boumans <kane@cpan.org>.
+.PP
+Please reports bugs to <bug\-archive\-tar@rt.cpan.org>.
+.SH ACKNOWLEDGEMENTS
+.IX Header "ACKNOWLEDGEMENTS"
+Thanks to Sean Burke, Chris Nandor, Chip Salzenberg, Tim Heaney, Gisle Aas,
+Rainer Tammer and especially Andrew Savige for their help and suggestions.
+.SH COPYRIGHT
+.IX Header "COPYRIGHT"
+This module is copyright (c) 2002 \- 2009 Jos Boumans
+<kane@cpan.org>. All rights reserved.
+.PP
+This library is free software; you may redistribute and/or modify
+it under the same terms as Perl itself.