Author: delphij
Date: Tue Jul  1 22:46:39 2014
New Revision: 268129
URL: http://svnweb.freebsd.org/changeset/base/268129

Log:
  Check if fchflags() is needed by fstat'ing before and check
  the results.
  
  Reviewed by:  jilles
  X-MFC-With:   r267977

Modified:
  head/bin/mv/mv.c

Modified: head/bin/mv/mv.c
==============================================================================
--- head/bin/mv/mv.c    Tue Jul  1 22:42:53 2014        (r268128)
+++ head/bin/mv/mv.c    Tue Jul  1 22:46:39 2014        (r268129)
@@ -278,6 +278,7 @@ fastcopy(const char *from, const char *t
        static char *bp = NULL;
        mode_t oldmode;
        int nread, from_fd, to_fd;
+       struct stat tsb;
 
        if ((from_fd = open(from, O_RDONLY, 0)) < 0) {
                warn("fastcopy: open() failed (from): %s", from);
@@ -336,10 +337,18 @@ err:              if (unlink(to))
         * if the server supports flags and we were trying to *remove* flags
         * on a file that we copied, i.e., that we didn't create.)
         */
-       errno = 0;
-       if (fchflags(to_fd, sbp->st_flags | UF_ARCHIVE))
-               if (errno != EOPNOTSUPP || ((sbp->st_flags & ~UF_ARCHIVE) != 0))
-                       warn("%s: set flags (was: 0%07o)", to, sbp->st_flags);
+       if (fstat(to_fd, &tsb) == 0) {
+               if ((sbp->st_flags  & ~UF_ARCHIVE) !=
+                   (tsb.st_flags & ~UF_ARCHIVE)) {
+                       if (fchflags(to_fd,
+                           sbp->st_flags | (tsb.st_flags & UF_ARCHIVE)))
+                               if (errno != EOPNOTSUPP ||
+                                   ((sbp->st_flags & ~UF_ARCHIVE) != 0))
+                                       warn("%s: set flags (was: 0%07o)",
+                                           to, sbp->st_flags);
+               }
+       } else
+               warn("%s: cannot stat", to);
 
        tval[0].tv_sec = sbp->st_atime;
        tval[1].tv_sec = sbp->st_mtime;
_______________________________________________
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