Don't fail if the file flags of source and copied symlinks don't match.
authorYONETANI Tomokazu <y0netan1@dragonflybsd.org>
Fri, 5 Sep 2008 03:16:55 +0000 (03:16 +0000)
committerYONETANI Tomokazu <y0netan1@dragonflybsd.org>
Fri, 5 Sep 2008 03:16:55 +0000 (03:16 +0000)
Although there's no lchflags(), symlinks inherit file flags of their
parent directory(for history retention flags), so file flags may be set
on symlinks.  chflags(1) on a symlink doesn't do anything nor does it
return an error code, so the new behavior is more consistent with
chflags(1)'s.
Symlinks don't inherit file flags on previous versions of DragonFly
or on FreeBSD, so this code has never had a chance to return ENOSYS.

Suggested-By: Matt
bin/cp/utils.c

index 3a4cdd4..6e8f18f 100644 (file)
@@ -32,7 +32,7 @@
  *
  * @(#)utils.c 8.3 (Berkeley) 4/1/94
  * $FreeBSD: src/bin/cp/utils.c,v 1.45 2005/02/09 17:37:37 ru Exp $
- * $DragonFly: src/bin/cp/utils.c,v 1.11 2007/06/15 07:02:51 corecode Exp $
+ * $DragonFly: src/bin/cp/utils.c,v 1.12 2008/09/05 03:16:55 y0netan1 Exp $
  */
 
 #include <sys/param.h>
@@ -320,7 +320,7 @@ setfile(struct stat *fs, int fd)
        if (!gotstat || fs->st_flags != ts.st_flags)
                if (fdval ?
                    fchflags(fd, fs->st_flags) :
-                   (islink ? (errno = ENOSYS) :
+                   (islink ? (errno = 0) :
                    chflags(to.p_path, fs->st_flags))) {
                        warn("chflags: %s", to.p_path);
                        rval = 1;