Index: ar/ar.1 =================================================================== --- ar/ar.1 +++ ar/ar.1 @@ -23,7 +23,7 @@ .\" .\" $Id$ .\" -.Dd December 10, 2012 +.Dd July 23, 2015 .Os .Dt AR 1 .Sh NAME @@ -66,6 +66,7 @@ .Op Fl f .Op Fl F Ar flavor | Fl -flavor Ar flavor .Op Fl s | Fl S +.Op Fl U .Op Fl v .Op Fl z .Ar archive @@ -83,6 +84,7 @@ .Op Fl j .Op Fl s | Fl S .Op Fl u +.Op Fl U .Op Fl v .Op Fl z .Ar archive @@ -91,6 +93,7 @@ .Fl s .Op Fl D .Op Fl j +.Op Fl U .Op Fl z .Ar archive .Nm @@ -203,6 +206,12 @@ .Ar . This ensures that checksums on the resulting archives are reproducible when member contents are identical. +If the +.It Fl D +and +.It Fl U +options are both specified, the one specified later in the command line +takes effect. .It Fl f Synonymous with option .Fl T . @@ -335,6 +344,20 @@ .Ar will be extracted only if they are newer than the corresponding files in the file system. +.It Fl U +When used in combination with the +.Fl r +or +.Fl q +option, insert the real mtime, uid and gid, and file mode values +from the members named by arguments +.Ar . +If the +.It Fl D +and +.It Fl U +options are both specified, the one specified later in the command line +takes effect. .It Fl v Provide verbose output. When used with the Index: ar/ar.c =================================================================== --- ar/ar.c +++ ar/ar.c @@ -123,7 +123,7 @@ len = strlen(bsdar->progname); if (len >= strlen("ranlib") && strcmp(bsdar->progname + len - strlen("ranlib"), "ranlib") == 0) { - while ((opt = getopt_long(argc, argv, "tDV", longopts, + while ((opt = getopt_long(argc, argv, "tDUV", longopts, NULL)) != -1) { switch(opt) { case 't': @@ -132,6 +132,9 @@ case 'D': bsdar->options |= AR_D; break; + case 'U': + bsdar->options &= ~AR_D; + break; case 'V': bsdar_version(); break; @@ -169,7 +172,7 @@ } } - while ((opt = getopt_long(argc, argv, "abCcdDfF:ijlMmopqrSsTtuVvxz", + while ((opt = getopt_long(argc, argv, "abCcdDfF:ijlMmopqrSsTtUuVvxz", longopts, NULL)) != -1) { switch(opt) { case 'a': @@ -237,6 +240,9 @@ case 't': set_mode(bsdar, opt); break; + case 'U': + bsdar->options &= ~AR_D; + break; case 'u': bsdar->options |= AR_U; break; @@ -400,7 +406,8 @@ -D Use fixed metadata, for consistent archive checksums.\n\ -F FORMAT | --flavor=FORMAT\n\ Create archives with the specified format.\n\ - -S Do not generate an archive symbol table.\n" + -S Do not generate an archive symbol table.\n\ + -U Use original metadata, for unique archive checksums.\n" static void bsdar_usage(void) @@ -415,6 +422,7 @@ Options:\n\ -t (This option is accepted, but ignored).\n\ -D Use fixed metadata, for consistent archive checksums.\n\ + -U Use original metadata, for unique archive checksums.\n\ -V Print a version identifier and exit.\n" static void