summaryrefslogtreecommitdiff
path: root/usr/src/cmd/mv/mv.c
diff options
context:
space:
mode:
authormarks <none@none>2006-01-10 08:05:23 -0800
committermarks <none@none>2006-01-10 08:05:23 -0800
commitd2443e765650e70b88cd0346e67d2aee6dd1ea3a (patch)
tree83320edfc41dd74d9884d59a1d18fb22f6275e09 /usr/src/cmd/mv/mv.c
parent9f1fc992b281e57216b036e784b762829b875b4b (diff)
downloadillumos-joyent-d2443e765650e70b88cd0346e67d2aee6dd1ea3a.tar.gz
6354804 The file's ACL was changed when cp it from one ZFS file system to another one.
6355681 cannot remove xattr even while write_attr is granted 6364433 `find -ls` prints extra "+" sign when running over NFSv4/UFS 6366467 Different x_attr behavior while ACL against the same user by 'user:' or 'owner@' 6368111 ZFS returns EACCES in preference to EEXIST
Diffstat (limited to 'usr/src/cmd/mv/mv.c')
-rw-r--r--usr/src/cmd/mv/mv.c40
1 files changed, 35 insertions, 5 deletions
diff --git a/usr/src/cmd/mv/mv.c b/usr/src/cmd/mv/mv.c
index 3cdceeafb4..0e5fe13d32 100644
--- a/usr/src/cmd/mv/mv.c
+++ b/usr/src/cmd/mv/mv.c
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -872,6 +872,25 @@ copy:
if ((ret = chg_mode(target, UID(s1), GID(s1),
FMODE(s1))) > 0)
return (1);
+ /*
+ * Reapply ACL, since chmod may have
+ * altered ACL
+ */
+ if (s1acl != NULL) {
+ if ((acl_set(target, s1acl)) < 0) {
+ if (pflg || mve) {
+ (void) fprintf(
+ stderr,
+ "%s: failed to set acl entries on %s\n",
+ cmd,
+ target);
+ }
+ /*
+ * else: silent and
+ * continue
+ */
+ }
+ }
if ((ret = chg_time(target, s1)) > 0)
return (1);
}
@@ -1620,6 +1639,10 @@ copydir(char *source, char *target)
* ACL for directory
*/
if (pflg || mve) {
+ if ((pret = chg_mode(target, UID(s1save), GID(s1save),
+ FMODE(s1save))) == 0)
+ pret = chg_time(target, s1save);
+ ret += pret;
if (s1acl_save != NULL) {
if (acl_set(target, s1acl_save) < 0) {
#ifdef XPG4
@@ -1641,10 +1664,6 @@ copydir(char *source, char *target)
acl_free(s1acl_save);
s1acl_save = NULL;
}
- if ((pret = chg_mode(target, UID(s1save), GID(s1save),
- FMODE(s1save))) == 0)
- pret = chg_time(target, s1save);
- ret += pret;
} else if (fixmode != (mode_t)0)
(void) chmod(target, fixmode & MODEBITS);
@@ -2157,6 +2176,17 @@ copyattributes(char *source, char *target)
}
}
}
+ if (xacl && ((facl_set(targattrfd, xacl)) < 0)) {
+ if (!attrsilent) {
+ (void) fprintf(stderr, gettext(
+ "%s: failed to set acl entries on"
+ " attribute %s for"
+ "%s\n"), cmd, dp->d_name, target);
+ ++error;
+ }
+ acl_free(xacl);
+ xacl = NULL;
+ }
}
next:
if (xacl != NULL) {