diff options
Diffstat (limited to 'upstream/mageia-cauldron/man3pm/Archive::Tar.3pm')
-rw-r--r-- | upstream/mageia-cauldron/man3pm/Archive::Tar.3pm | 978 |
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. |