Author: emaste
Date: Wed Jul 29 17:34:26 2015
New Revision: 286024
URL: https://svnweb.freebsd.org/changeset/base/286024

Log:
  ar: Fix deterministic mode default with options other than -q or -r
  
  Reported by:  jhibbits
  Reviewed by:  jhibbits
  Sponsored by: The FreeBSD Foundation
  Differential Revision:        https://reviews.freebsd.org/D3237

Modified:
  head/usr.bin/ar/ar.c

Modified: head/usr.bin/ar/ar.c
==============================================================================
--- head/usr.bin/ar/ar.c        Wed Jul 29 17:28:04 2015        (r286023)
+++ head/usr.bin/ar/ar.c        Wed Jul 29 17:34:26 2015        (r286024)
@@ -100,12 +100,12 @@ main(int argc, char **argv)
        struct bsdar    *bsdar, bsdar_storage;
        char            *p;
        size_t           len;
-       int              i, opt;
+       int              i, opt, Dflag, Uflag;
 
        bsdar = &bsdar_storage;
        memset(bsdar, 0, sizeof(*bsdar));
-       /* Enable deterministic mode by default. */
-       bsdar->options |= AR_D;
+       Dflag = 0;
+       Uflag = 0;
 
        if ((bsdar->progname = getprogname()) == NULL)
                bsdar->progname = "ar";
@@ -122,10 +122,12 @@ main(int argc, char **argv)
                                /* Ignored. */
                                break;
                        case 'D':
-                               bsdar->options |= AR_D;
+                               Dflag = 1;
+                               Uflag = 0;
                                break;
                        case 'U':
-                               bsdar->options &= ~AR_D;
+                               Uflag = 1;
+                               Dflag = 0;
                                break;
                        case 'V':
                                ranlib_version();
@@ -182,7 +184,8 @@ main(int argc, char **argv)
                        set_mode(bsdar, opt);
                        break;
                case 'D':
-                       bsdar->options |= AR_D;
+                       Dflag = 1;
+                       Uflag = 0;
                        break;
                case 'f':
                case 'T':
@@ -222,7 +225,8 @@ main(int argc, char **argv)
                        set_mode(bsdar, opt);
                        break;
                case 'U':
-                       bsdar->options &= ~AR_D;
+                       Uflag = 1;
+                       Dflag = 0;
                        break;
                case 'u':
                        bsdar->options |= AR_U;
@@ -275,6 +279,10 @@ main(int argc, char **argv)
                argv++;
        }
 
+       /* Set determinstic mode for -D, and by default without -U. */
+       if (Dflag || (Uflag == 0 && (bsdar->mode == 'q' || bsdar->mode == 'r')))
+               bsdar->options |= AR_D;
+
        if (bsdar->options & AR_A)
                only_mode(bsdar, "-a", "mqr");
        if (bsdar->options & AR_B)
@@ -283,8 +291,10 @@ main(int argc, char **argv)
                only_mode(bsdar, "-c", "qr");
        if (bsdar->options & AR_CC)
                only_mode(bsdar, "-C", "x");
-       if (bsdar->options & AR_D)
+       if (Dflag)
                only_mode(bsdar, "-D", "qr");
+       if (Uflag)
+               only_mode(bsdar, "-U", "qr");
        if (bsdar->options & AR_O)
                only_mode(bsdar, "-o", "x");
        if (bsdar->options & AR_SS)
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to