Author: kientzle
Date: Fri Apr 17 03:45:15 2009
New Revision: 191190
URL: http://svn.freebsd.org/changeset/base/191190

Log:
  Merge remaining changes from libarchive.googlecode.com:
   * Add xz and lzma compression options
   * Rename --format-options to simply --options
   * Add --same-owner for GNU tar compat
   * Add -lmd and -lcrypto to fix link
   * Documentation

Modified:
  head/usr.bin/tar/Makefile
  head/usr.bin/tar/bsdtar.1
  head/usr.bin/tar/bsdtar.c
  head/usr.bin/tar/bsdtar.h
  head/usr.bin/tar/cmdline.c
  head/usr.bin/tar/write.c

Modified: head/usr.bin/tar/Makefile
==============================================================================
--- head/usr.bin/tar/Makefile   Fri Apr 17 03:40:40 2009        (r191189)
+++ head/usr.bin/tar/Makefile   Fri Apr 17 03:45:15 2009        (r191190)
@@ -1,11 +1,11 @@
 # $FreeBSD$
 
 PROG=  bsdtar
-BSDTAR_VERSION_STRING=2.6.901a
+BSDTAR_VERSION_STRING=2.7.0
 SRCS=  bsdtar.c cmdline.c getdate.c matching.c read.c siginfo.c subst.c tree.c 
util.c write.c
 WARNS?=        5
 DPADD= ${LIBARCHIVE} ${LIBBZ2} ${LIBZ}
-LDADD= -larchive -lbz2 -lz
+LDADD= -larchive -lbz2 -lz -lmd -lcrypto
 CFLAGS+=       -DBSDTAR_VERSION_STRING=\"${BSDTAR_VERSION_STRING}\"
 CFLAGS+=       -DPLATFORM_CONFIG_H=\"config_freebsd.h\"
 CFLAGS+=       -I${.CURDIR}

Modified: head/usr.bin/tar/bsdtar.1
==============================================================================
--- head/usr.bin/tar/bsdtar.1   Fri Apr 17 03:40:40 2009        (r191189)
+++ head/usr.bin/tar/bsdtar.1   Fri Apr 17 03:45:15 2009        (r191190)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd May 15, 2008
+.Dd March 25, 2009
 .Dt BSDTAR 1
 .Os
 .Sh NAME
@@ -37,12 +37,12 @@
 .Nm
 .Brq Fl c
 .Op Ar options
-.Op Ar files | directories
+.Op Ar files | Ar directories
 .Nm
 .Brq Fl r | Fl u
 .Fl f Ar archive-file
 .Op Ar options
-.Op Ar files | directories
+.Op Ar files | Ar directories
 .Nm
 .Brq Fl t | Fl x
 .Op Ar options
@@ -305,6 +305,64 @@ A synonym for
 .It Fl -one-file-system
 (c, r, and u modes)
 Do not cross mount points.
+.It Fl -options Ar options
+Select optional behaviors for particular modules.
+The argument is a text string containing comma-separated
+keywords and values.
+These are passed to the modules that handle particular
+formats to control how those formats will behave.
+Each option has one of the following forms:
+.Bl -tag -compact -width indent
+.It Ar key=value
+The key will be set to the specified value in every module that supports it.
+Modules that do not support this key will ignore it.
+.It Ar key
+The key will be enabled in every module that supports it.
+This is equivalent to
+.Ar key Ns Cm =1 .
+.It Ar !key
+The key will be disabled in every module that supports it.
+.It Ar module:key=value , Ar module:key , Ar module:!key
+As above, but the corresponding key and value will be provided
+only to modules whose name matches
+.Ar module .
+.El
+The currently supported modules and keys are:
+.Bl -tag -compact -width indent
+.It Cm iso9660:joliet
+Support Joliet extensions.
+This is enabled by default, use
+.Cm !joliet
+or
+.Cm iso9660:!joliet
+to disable.
+.It Cm gzip:compression-level
+A decimal integer from 0 to 9 specifying the gzip compression level.
+.It Cm xz:compression-level
+A decimal integer from 0 to 9 specifying the xz compression level.
+.It Cm mtree: Ns Ar keyword
+The mtree writer module allows you to specify which mtree keywords
+will be included in the output.
+Supported keywords include:
+.Cm cksum , Cm device , Cm flags , Cm gid , Cm gname , Cm indent ,
+.Cm link , Cm md5 , Cm mode , Cm nlink , Cm rmd160 , Cm sha1 , Cm sha256 ,
+.Cm sha384 , Cm sha512 , Cm size , Cm time , Cm uid , Cm uname .
+The default is equivalent to:
+.Dq device, flags, gid, gname, link, mode, nlink, size, time, type, uid, uname 
.
+.It Cm mtree:all
+Enables all of the above keywords.
+You can also use
+.Cm mtree:!all
+to disable all keywords.
+.It Cm mtree:use-set
+Enable generation of
+.Cm /set
+lines in the output.
+.It Cm mtree:indent
+XXX need explanation XXX
+.El
+If a provided option is not supported by any module, that
+is a fatal error.
 .It Fl P
 Preserve pathnames.
 By default, absolute pathnames (those that begin with a /
@@ -555,6 +613,27 @@ switches accept a variety of common date
 .Dq 5 minutes ago ,
 and
 .Dq 19:14 PST May 1 .
+.Pp
+The
+.Fl -options
+argument can be used to control various details of archive generation
+or reading.
+For example, you can generate mtree output which only contains
+.Cm type , Cm time ,
+and
+.Cm uid
+keywords:
+.Dl Nm Fl cf Pa file.tar Fl -format=mtree Fl -options='!all,type,time,uid' Pa 
dir
+or you can set the compression level used by gzip or xz compression:
+.Dl Nm Fl czf Pa file.tar Fl -options='compression-level=9' .
+For more details, see the explanation of the
+.Fn archive_read_set_options
+and
+.Fn archive_write_set_options
+API calls that are described in
+.Xr archive_read 3
+and
+.Xr archive_write 3 .
 .Sh COMPATIBILITY
 The bundled-arguments format is supported for compatibility
 with historic implementations.

Modified: head/usr.bin/tar/bsdtar.c
==============================================================================
--- head/usr.bin/tar/bsdtar.c   Fri Apr 17 03:40:40 2009        (r191189)
+++ head/usr.bin/tar/bsdtar.c   Fri Apr 17 03:45:15 2009        (r191190)
@@ -73,7 +73,7 @@ __FBSDID("$FreeBSD$");
 #ifdef __linux
 #define        _PATH_DEFTAPE "/dev/st0"
 #endif
-#ifdef _WIN32
+#if defined(_WIN32) && !defined(__CYGWIN__)
 #define        _PATH_DEFTAPE "\\\\.\\tape0"
 #endif
 
@@ -113,8 +113,10 @@ main(int argc, char **argv)
        memset(bsdtar, 0, sizeof(*bsdtar));
        bsdtar->fd = -1; /* Mark as "unused" */
        option_o = 0;
-#ifdef _WIN32
+#if defined(_WIN32) && !defined(__CYGWIN__)
        /* Make sure open() function will be used with a binary mode. */
+       /* on cygwin, we need something similar, but instead link against */
+       /* a special startup object, binmode.o */
        _set_fmode(_O_BINARY);
 #endif
 
@@ -122,7 +124,7 @@ main(int argc, char **argv)
        if (*argv == NULL)
                bsdtar->progname = "bsdtar";
        else {
-#if _WIN32
+#if defined(_WIN32) && !defined(__CYGWIN__)
                bsdtar->progname = strrchr(*argv, '\\');
 #else
                bsdtar->progname = strrchr(*argv, '/');
@@ -166,10 +168,6 @@ main(int argc, char **argv)
                bsdtar->extract_flags |= ARCHIVE_EXTRACT_XATTR;
                bsdtar->extract_flags |= ARCHIVE_EXTRACT_FFLAGS;
        }
-#ifdef _WIN32
-       /* Windows cannot set UNIX like uid/gid. */
-       bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_OWNER;
-#endif
 
        bsdtar->argv = argv;
        bsdtar->argc = argc;
@@ -212,8 +210,8 @@ main(int argc, char **argv)
                case OPTION_FORMAT: /* GNU tar, others */
                        bsdtar->create_format = bsdtar->optarg;
                        break;
-               case OPTION_FORMAT_OPTIONS:
-                       bsdtar->option_format_options = bsdtar->optarg;
+               case OPTION_OPTIONS:
+                       bsdtar->option_options = bsdtar->optarg;
                        break;
                case 'f': /* SUSv2 */
                        bsdtar->filename = bsdtar->optarg;
@@ -269,6 +267,19 @@ main(int argc, char **argv)
                        usage(bsdtar);
 #endif
                        break;
+               case 'J': /* GNU tar 1.21 and later */
+#if HAVE_LIBLZMA
+                       if (bsdtar->create_compression != '\0')
+                               bsdtar_errc(bsdtar, 1, 0,
+                                   "Can't specify both -%c and -%c", opt,
+                                   bsdtar->create_compression);
+                       bsdtar->create_compression = opt;
+#else
+                       bsdtar_warnc(bsdtar, 0,
+                           "xz compression not supported by this version of 
bsdtar");
+                       usage(bsdtar);
+#endif
+                       break;
                case 'k': /* GNU tar */
                        bsdtar->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE;
                        break;
@@ -282,6 +293,19 @@ main(int argc, char **argv)
                        /* GNU tar 1.13  used -l for --one-file-system */
                        bsdtar->option_warn_links = 1;
                        break;
+               case OPTION_LZMA:
+#if HAVE_LIBLZMA
+                       if (bsdtar->create_compression != '\0')
+                               bsdtar_errc(bsdtar, 1, 0,
+                                   "Can't specify both -%c and -%c", opt,
+                                   bsdtar->create_compression);
+                       bsdtar->create_compression = opt;
+#else
+                       bsdtar_warnc(bsdtar, 0,
+                           "lzma compression not supported by this version of 
bsdtar");
+                       usage(bsdtar);
+#endif
+                       break;
                case 'm': /* SUSv2 */
                        bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_TIME;
                        break;
@@ -392,6 +416,9 @@ main(int argc, char **argv)
                        usage(bsdtar);
 #endif
                        break;
+               case OPTION_SAME_OWNER: /* GNU tar */
+                       bsdtar->extract_flags |= ARCHIVE_EXTRACT_OWNER;
+                       break;
                case OPTION_STRIP_COMPONENTS: /* GNU tar 1.15 */
                        bsdtar->strip_components = atoi(bsdtar->optarg);
                        break;
@@ -632,7 +659,7 @@ static const char *long_help_msg =
        "  -w    Interactive\n"
        "Create: %p -c [options] [<file> | <dir> | @<archive> | -C <dir> ]\n"
        "  <file>, <dir>  add these items to archive\n"
-       "  -z, -j  Compress archive with gzip/bzip2\n"
+       "  -z, -j, -J, --lzma  Compress archive with gzip/bzip2/xz/lzma\n"
        "  --format {ustar|pax|cpio|shar}  Select archive format\n"
        "  --exclude <pattern>  Skip files that match pattern\n"
        "  -C <dir>  Change to <dir> before processing remaining files\n"

Modified: head/usr.bin/tar/bsdtar.h
==============================================================================
--- head/usr.bin/tar/bsdtar.h   Fri Apr 17 03:40:40 2009        (r191189)
+++ head/usr.bin/tar/bsdtar.h   Fri Apr 17 03:45:15 2009        (r191190)
@@ -60,7 +60,7 @@ struct bsdtar {
        char              option_chroot; /* --chroot */
        char              option_dont_traverse_mounts; /* --one-file-system */
        char              option_fast_read; /* --fast-read */
-       const char       *option_format_options; /* --format-options */
+       const char       *option_options; /* --options */
        char              option_honor_nodump; /* --nodump */
        char              option_interactive; /* -w */
        char              option_no_owner; /* -o */
@@ -111,10 +111,11 @@ enum {
        OPTION_CHROOT,
        OPTION_EXCLUDE,
        OPTION_FORMAT,
-       OPTION_FORMAT_OPTIONS,
+       OPTION_OPTIONS,
        OPTION_HELP,
        OPTION_INCLUDE,
        OPTION_KEEP_NEWER_FILES,
+       OPTION_LZMA,
        OPTION_NEWER_CTIME,
        OPTION_NEWER_CTIME_THAN,
        OPTION_NEWER_MTIME,
@@ -126,6 +127,7 @@ enum {
        OPTION_NUMERIC_OWNER,
        OPTION_ONE_FILE_SYSTEM,
        OPTION_POSIX,
+       OPTION_SAME_OWNER,
        OPTION_STRIP_COMPONENTS,
        OPTION_TOTALS,
        OPTION_USE_COMPRESS_PROGRAM,

Modified: head/usr.bin/tar/cmdline.c
==============================================================================
--- head/usr.bin/tar/cmdline.c  Fri Apr 17 03:40:40 2009        (r191189)
+++ head/usr.bin/tar/cmdline.c  Fri Apr 17 03:45:15 2009        (r191190)
@@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$");
  * Short options for tar.  Please keep this sorted.
  */
 static const char *short_options
-       = "Bb:C:cf:HhI:jkLlmnOoPpqrSs:T:tUuvW:wX:xyZz";
+       = "Bb:C:cf:HhI:JjkLlmnOoPpqrSs:T:tUuvW:wX:xyZz";
 
 /*
  * Long options for tar.  Please keep this list sorted.
@@ -83,7 +83,7 @@ static struct option {
        { "file",                 1, 'f' },
        { "files-from",           1, 'T' },
        { "format",               1, OPTION_FORMAT },
-       { "format-options",       1, OPTION_FORMAT_OPTIONS },
+       { "options",              1, OPTION_OPTIONS },
        { "gunzip",               0, 'z' },
        { "gzip",                 0, 'z' },
        { "help",                 0, OPTION_HELP },
@@ -93,6 +93,7 @@ static struct option {
        { "keep-newer-files",     0, OPTION_KEEP_NEWER_FILES },
        { "keep-old-files",       0, 'k' },
        { "list",                 0, 't' },
+       { "lzma",                 0, OPTION_LZMA },
        { "modification-time",    0, 'm' },
        { "newer",                1, OPTION_NEWER_CTIME },
        { "newer-ctime",          1, OPTION_NEWER_CTIME },
@@ -111,6 +112,7 @@ static struct option {
        { "posix",                0, OPTION_POSIX },
        { "preserve-permissions", 0, 'p' },
        { "read-full-blocks",     0, 'B' },
+       { "same-owner",           0, OPTION_SAME_OWNER },
        { "same-permissions",     0, 'p' },
        { "strip-components",     1, OPTION_STRIP_COMPONENTS },
        { "to-stdout",            0, 'O' },
@@ -122,6 +124,7 @@ static struct option {
        { "use-compress-program", 1, OPTION_USE_COMPRESS_PROGRAM },
        { "verbose",              0, 'v' },
        { "version",              0, OPTION_VERSION },
+       { "xz",                   0, 'J' },
        { NULL, 0, 0 }
 };
 

Modified: head/usr.bin/tar/write.c
==============================================================================
--- head/usr.bin/tar/write.c    Fri Apr 17 03:40:40 2009        (r191189)
+++ head/usr.bin/tar/write.c    Fri Apr 17 03:45:15 2009        (r191190)
@@ -189,6 +189,14 @@ tar_mode_c(struct bsdtar *bsdtar)
                        archive_write_set_compression_bzip2(a);
                        break;
 #endif
+#ifdef HAVE_LIBLZMA
+               case 'J':
+                       archive_write_set_compression_xz(a);
+                       break;
+               case OPTION_LZMA:
+                       archive_write_set_compression_lzma(a);
+                       break;
+#endif
 #ifdef HAVE_LIBZ
                case 'z':
                        archive_write_set_compression_gzip(a);
@@ -204,16 +212,10 @@ tar_mode_c(struct bsdtar *bsdtar)
                }
        }
 
-       r = archive_write_open_file(a, bsdtar->filename);
-       if (r != ARCHIVE_OK)
+       if (ARCHIVE_OK != archive_write_set_options(a, bsdtar->option_options))
+               bsdtar_errc(bsdtar, 1, 0, archive_error_string(a));
+       if (ARCHIVE_OK != archive_write_open_file(a, bsdtar->filename))
                bsdtar_errc(bsdtar, 1, 0, archive_error_string(a));
-
-       if (bsdtar->option_format_options != NULL) {
-               r = archive_write_set_options(a, bsdtar->option_format_options);
-               if (r != ARCHIVE_OK)
-                       bsdtar_errc(bsdtar, 1, 0, archive_error_string(a));
-       }
-
        write_archive(a, bsdtar);
 }
 
@@ -299,12 +301,10 @@ tar_mode_r(struct bsdtar *bsdtar)
                archive_write_set_format(a, format);
        }
        lseek(bsdtar->fd, end_offset, SEEK_SET); /* XXX check return val XXX */
-       archive_write_open_fd(a, bsdtar->fd); /* XXX check return val XXX */
-       if (bsdtar->option_format_options != NULL) {
-               r = archive_write_set_options(a, bsdtar->option_format_options);
-               if (r != ARCHIVE_OK)
-                       bsdtar_errc(bsdtar, 1, 0, archive_error_string(a));
-       }
+       if (ARCHIVE_OK != archive_write_set_options(a, bsdtar->option_options))
+               bsdtar_errc(bsdtar, 1, 0, archive_error_string(a));
+       if (ARCHIVE_OK != archive_write_open_fd(a, bsdtar->fd))
+               bsdtar_errc(bsdtar, 1, 0, archive_error_string(a));
 
        write_archive(a, bsdtar); /* XXX check return val XXX */
 
@@ -321,7 +321,6 @@ tar_mode_u(struct bsdtar *bsdtar)
        int                      format;
        struct archive_dir_entry        *p;
        struct archive_dir       archive_dir;
-       int                      r;
 
        bsdtar->archive_dir = &archive_dir;
        memset(&archive_dir, 0, sizeof(archive_dir));
@@ -385,12 +384,10 @@ tar_mode_u(struct bsdtar *bsdtar)
                archive_write_set_bytes_per_block(a, DEFAULT_BYTES_PER_BLOCK);
        lseek(bsdtar->fd, end_offset, SEEK_SET);
        ftruncate(bsdtar->fd, end_offset);
-       archive_write_open_fd(a, bsdtar->fd);
-       if (bsdtar->option_format_options != NULL) {
-               r = archive_write_set_options(a, bsdtar->option_format_options);
-               if (r != ARCHIVE_OK)
-                       bsdtar_errc(bsdtar, 1, 0, archive_error_string(a));
-       }
+       if (ARCHIVE_OK != archive_write_set_options(a, bsdtar->option_options))
+               bsdtar_errc(bsdtar, 1, 0, archive_error_string(a));
+       if (ARCHIVE_OK != archive_write_open_fd(a, bsdtar->fd))
+               bsdtar_errc(bsdtar, 1, 0, archive_error_string(a));
 
        write_archive(a, bsdtar);
 
@@ -457,7 +454,7 @@ write_archive(struct archive *a, struct 
                                    arg + 1) != 0)
                                        break;
                        } else
-#ifdef _WIN32
+#if defined(_WIN32) && !defined(__CYGWIN__)
                                write_hierarchy_win(bsdtar, a, arg,
                                    write_hierarchy);
 #else
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to