]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
Implement pax -O option to permit limiting a PAX archive to a single volume.
authoreadler <eadler@FreeBSD.org>
Wed, 18 Mar 2015 05:48:05 +0000 (05:48 +0000)
committereadler <eadler@FreeBSD.org>
Wed, 18 Mar 2015 05:48:05 +0000 (05:48 +0000)
-O Force the archive to be one volume.  If a volume ends prematurely, pax will
not prompt for a new volume.

PR: 198481
Submitted by: Sevan Janiyan
Reviewed by: allanjude (doc)

bin/pax/ar_io.c
bin/pax/extern.h
bin/pax/options.c
bin/pax/pax.1
bin/pax/pax.c

index 4914c8527439239342f7a4d345c46e11668ebf30..57aa46d92e1c860cbdd91fd4c4824b8cc6c3ab7b 100644 (file)
@@ -82,7 +82,7 @@ static int wr_trail = 1;              /* trailer was rewritten in append */
 static int can_unlnk = 0;              /* do we unlink null archives?  */
 const char *arcname;                   /* printable name of archive */
 const char *gzip_program;              /* name of gzip program */
-static pid_t zpid = -1;                        /* pid of child process */
+static pid_t zpid = -1;                /* pid of child process */
 
 static int get_phys(void);
 static void ar_start_gzip(int, const char *, int);
@@ -1123,7 +1123,7 @@ ar_next(void)
        if (sigprocmask(SIG_SETMASK, &o_mask, NULL) < 0)
                syswarn(0, errno, "Unable to restore signal mask");
 
-       if (done || !wr_trail || strcmp(NM_TAR, argv0) == 0)
+       if (done || !wr_trail || Oflag || strcmp(NM_TAR, argv0) == 0)
                return(-1);
 
        tty_prnt("\nATTENTION! %s archive volume change required.\n", argv0);
index 4375694cc1512761ba2072618f9c722ddb4aca19..dc99e643b14053931d86d27130669201bc9c3277 100644 (file)
@@ -217,6 +217,7 @@ extern int vflag;
 extern int Dflag;
 extern int Hflag;
 extern int Lflag;
+extern int Oflag;
 extern int Xflag;
 extern int Yflag;
 extern int Zflag;
index c6ebea28cefce6b2a531f9615a6878cad286754f..06e487c9c776af680949a1b0838a48237da15888 100644 (file)
@@ -194,7 +194,7 @@ pax_options(int argc, char **argv)
        /*
         * process option flags
         */
-       while ((c=getopt(argc,argv,"ab:cdf:iklno:p:rs:tuvwx:zB:DE:G:HLPT:U:XYZ"))
+       while ((c=getopt(argc,argv,"ab:cdf:iklno:p:rs:tuvwx:zB:DE:G:HLOPT:U:XYZ"))
            != -1) {
                switch (c) {
                case 'a':
@@ -447,6 +447,12 @@ pax_options(int argc, char **argv)
                        Lflag = 1;
                        flg |= CLF;
                        break;
+               case 'O':
+                       /*
+                        * Force one volume. Non standard option.
+                        */
+                       Oflag = 1;
+                       break;
                case 'P':
                        /*
                         * do NOT follow symlinks (default)
@@ -584,7 +590,7 @@ tar_options(int argc, char **argv)
 {
        int c;
        int fstdin = 0;
-       int Oflag = 0;
+       int tar_Oflag = 0;
        int nincfiles = 0;
        int incfiles_max = 0;
        struct incfile {
@@ -664,7 +670,7 @@ tar_options(int argc, char **argv)
                        if (opt_add("write_opt=nodir") < 0)
                                tar_usage();
                case 'O':
-                       Oflag = 1;
+                       tar_Oflag = 1;
                        break;
                case 'p':
                        /*
@@ -820,8 +826,8 @@ tar_options(int argc, char **argv)
         * (unless -o specified)
         */
        if (act == ARCHIVE || act == APPND)
-               frmt = &(fsub[Oflag ? F_OTAR : F_TAR]);
-       else if (Oflag) {
+               frmt = &(fsub[tar_Oflag ? F_OTAR : F_TAR]);
+       else if (tar_Oflag) {
                paxwarn(1, "The -O/-o options are only valid when writing an archive");
                tar_usage();            /* only valid when writing */
        }
@@ -1526,25 +1532,25 @@ no_op(void)
 void
 pax_usage(void)
 {
-       (void)fputs("usage: pax [-cdnvz] [-E limit] [-f archive] ", stderr);
+       (void)fputs("usage: pax [-cdnOvz] [-E limit] [-f archive] ", stderr);
        (void)fputs("[-s replstr] ... [-U user] ...", stderr);
        (void)fputs("\n    [-G group] ... ", stderr);
        (void)fputs("[-T [from_date][,to_date]] ... ", stderr);
        (void)fputs("[pattern ...]\n", stderr);
-       (void)fputs("       pax -r [-cdiknuvzDYZ] [-E limit] ", stderr);
+       (void)fputs("       pax -r [-cdiknOuvzDYZ] [-E limit] ", stderr);
        (void)fputs("[-f archive] [-o options] ... \n", stderr);
        (void)fputs("      [-p string] ... [-s replstr] ... ", stderr);
        (void)fputs("[-U user] ... [-G group] ...\n        ", stderr);
        (void)fputs("[-T [from_date][,to_date]] ... ", stderr);
        (void)fputs(" [pattern ...]\n", stderr);
-       (void)fputs("       pax -w [-dituvzHLPX] [-b blocksize] ", stderr);
+       (void)fputs("       pax -w [-dituvzHLOPX] [-b blocksize] ", stderr);
        (void)fputs("[ [-a] [-f archive] ] [-x format] \n", stderr);
        (void)fputs("      [-B bytes] [-s replstr] ... ", stderr);
        (void)fputs("[-o options] ... [-U user] ...", stderr);
        (void)fputs("\n    [-G group] ... ", stderr);
        (void)fputs("[-T [from_date][,to_date][/[c][m]]] ... ", stderr);
        (void)fputs("[file ...]\n", stderr);
-       (void)fputs("       pax -r -w [-diklntuvDHLPXYZ] ", stderr);
+       (void)fputs("       pax -r -w [-diklntuvDHLOPXYZ] ", stderr);
        (void)fputs("[-p string] ... [-s replstr] ...", stderr);
        (void)fputs("\n    [-U user] ... [-G group] ... ", stderr);
        (void)fputs("[-T [from_date][,to_date][/[c][m]]] ... ", stderr);
index aa3025a1310001c89e99f1cedbdb5133a2fa7a75..c2e1731bdba69cbd3dfe1eb8f1afae3579021ae4 100644 (file)
@@ -33,7 +33,7 @@
 .\"    @(#)pax.1       8.4 (Berkeley) 4/18/94
 .\" $FreeBSD$
 .\"
-.Dd December 21, 2013
+.Dd March 17, 2015
 .Dt PAX 1
 .Os
 .Sh NAME
@@ -41,7 +41,7 @@
 .Nd read and write file archives and copy directory hierarchies
 .Sh SYNOPSIS
 .Nm
-.Op Fl cdnvz
+.Op Fl cdnvzO
 .Bk -words
 .Op Fl f Ar archive
 .Ek
@@ -68,7 +68,7 @@
 .Op Ar pattern ...\&
 .Nm
 .Fl r
-.Op Fl cdiknuvzDYZ
+.Op Fl cdiknuvzDOYZ
 .Bk -words
 .Op Fl f Ar archive
 .Ek
 .Op Ar pattern ...\&
 .Nm
 .Fl w
-.Op Fl dituvzHLPX
+.Op Fl dituvzHLOPX
 .Bk -words
 .Op Fl b Ar blocksize
 .Ek
 .Nm
 .Fl r
 .Fl w
-.Op Fl diklntuvDHLPXYZ
+.Op Fl diklntuvDHLOPXYZ
 .Bk -words
 .Op Fl p Ar string
 .Ar ...\&
@@ -853,6 +853,13 @@ Follow only command line symbolic links while performing a physical file
 system traversal.
 .It Fl L
 Follow all symbolic links to perform a logical file system traversal.
+.It Fl O
+Force the archive to be one volume.
+If a volume ends prematurely,
+.Nm
+will not prompt for a new volume.
+This option can be useful for
+automated tasks where error recovery cannot be performed by a human.
 .It Fl P
 Do not follow symbolic links, perform a physical file system traversal.
 This is the default mode.
@@ -1176,6 +1183,7 @@ The options
 .Fl G ,
 .Fl H ,
 .Fl L ,
+.Fl O ,
 .Fl P ,
 .Fl T ,
 .Fl U ,
index 040db744c5b1b2324351a53c1337ac8cfe7657f9..0a53f9a5365108fa4fd6d19886a57426e85d5c83 100644 (file)
@@ -85,6 +85,7 @@ int   vflag;                  /* produce verbose output */
 int    Dflag;                  /* same as uflag except inode change time */
 int    Hflag;                  /* follow command line symlinks (write only) */
 int    Lflag;                  /* follow symlinks when writing */
+int    Oflag;                  /* limit to single volume */
 int    Xflag;                  /* archive files with same device id only */
 int    Yflag;                  /* same as Dflg except after name mode */
 int    Zflag;                  /* same as uflg except after name mode */