summaryrefslogtreecommitdiff
path: root/net-misc/rsync/files
diff options
context:
space:
mode:
authorV3n3RiX <venerix@redcorelinux.org>2021-04-28 20:21:43 +0100
committerV3n3RiX <venerix@redcorelinux.org>2021-04-28 20:21:43 +0100
commit40aaaa64e86ba6710bbeb31c4615a6ce80e75e11 (patch)
tree758c221bad35c9288d0bd6df9c7dfc226728e52c /net-misc/rsync/files
parent8d5dbd847cbc704a6a06405856e94b461011afe3 (diff)
gentoo resync : 28.04.2021
Diffstat (limited to 'net-misc/rsync/files')
-rw-r--r--net-misc/rsync/files/rsync-3.2.3-glibc-lchmod.patch58
1 files changed, 58 insertions, 0 deletions
diff --git a/net-misc/rsync/files/rsync-3.2.3-glibc-lchmod.patch b/net-misc/rsync/files/rsync-3.2.3-glibc-lchmod.patch
new file mode 100644
index 000000000000..970d7af42bad
--- /dev/null
+++ b/net-misc/rsync/files/rsync-3.2.3-glibc-lchmod.patch
@@ -0,0 +1,58 @@
+From 9dd62525f3b98d692e031f22c02be8f775966503 Mon Sep 17 00:00:00 2001
+From: Wayne Davison <wayne@opencoder.net>
+Date: Sun, 29 Nov 2020 09:33:54 -0800
+Subject: [PATCH] Work around glibc's lchmod() issue a better way.
+
+diff --git a/syscall.c b/syscall.c
+index b9c3b4ef..11d10e4a 100644
+--- a/syscall.c
++++ b/syscall.c
+@@ -227,27 +227,35 @@ int do_open(const char *pathname, int flags, mode_t mode)
+ #ifdef HAVE_CHMOD
+ int do_chmod(const char *path, mode_t mode)
+ {
++ static int switch_step = 0;
+ int code;
+ if (dry_run) return 0;
+ RETURN_ERROR_IF_RO_OR_LO;
++ switch (switch_step) {
+ #ifdef HAVE_LCHMOD
+- code = lchmod(path, mode & CHMOD_BITS);
+-#else
+- if (S_ISLNK(mode)) {
++#include "case_N.h"
++ if ((code = lchmod(path, mode & CHMOD_BITS)) == 0 || errno != ENOTSUP)
++ break;
++ switch_step++;
++#endif
++
++#include "case_N.h"
++ if (S_ISLNK(mode)) {
+ # if defined HAVE_SETATTRLIST
+- struct attrlist attrList;
+- uint32_t m = mode & CHMOD_BITS; /* manpage is wrong: not mode_t! */
++ struct attrlist attrList;
++ uint32_t m = mode & CHMOD_BITS; /* manpage is wrong: not mode_t! */
+
+- memset(&attrList, 0, sizeof attrList);
+- attrList.bitmapcount = ATTR_BIT_MAP_COUNT;
+- attrList.commonattr = ATTR_CMN_ACCESSMASK;
+- code = setattrlist(path, &attrList, &m, sizeof m, FSOPT_NOFOLLOW);
++ memset(&attrList, 0, sizeof attrList);
++ attrList.bitmapcount = ATTR_BIT_MAP_COUNT;
++ attrList.commonattr = ATTR_CMN_ACCESSMASK;
++ code = setattrlist(path, &attrList, &m, sizeof m, FSOPT_NOFOLLOW);
+ # else
+- code = 1;
++ code = 1;
+ # endif
+- } else
+- code = chmod(path, mode & CHMOD_BITS); /* DISCOURAGED FUNCTION */
+-#endif /* !HAVE_LCHMOD */
++ } else
++ code = chmod(path, mode & CHMOD_BITS); /* DISCOURAGED FUNCTION */
++ break;
++ }
+ if (code != 0 && (preserve_perms || preserve_executability))
+ return code;
+ return 0;