]> git.ipfire.org Git - thirdparty/rsync.git/commitdiff
Change do_lchmod() back to a swtich with some better ENOTSUP & ENOSYS logic.
authorWayne Davison <wayne@opencoder.net>
Sun, 10 Oct 2021 16:20:13 +0000 (09:20 -0700)
committerWayne Davison <wayne@opencoder.net>
Sun, 10 Oct 2021 16:32:43 +0000 (09:32 -0700)
syscall.c

index abb0057546935fb21df7ae8c3205ae1fb22dbb66..048cbd3b38419192f750b4e58e3d3f49ecd237fb 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -231,13 +231,22 @@ 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
-       if ((code = lchmod(path, mode & CHMOD_BITS)) < 0 && errno == ENOTSUP)
+#include "case_N.h"
+               if ((code = lchmod(path, mode & CHMOD_BITS)) == 0)
+                       break;
+               if (errno == ENOSYS)
+                       switch_step++;
+               else if (errno != ENOTSUP)
+                       break;
 #endif
-       {
+
+#include "case_N.h"
                if (S_ISLNK(mode)) {
 # if defined HAVE_SETATTRLIST
                        struct attrlist attrList;
@@ -252,6 +261,7 @@ int do_chmod(const char *path, mode_t mode)
 # endif
                } else
                        code = chmod(path, mode & CHMOD_BITS); /* DISCOURAGED FUNCTION */
+               break;
        }
        if (code != 0 && (preserve_perms || preserve_executability))
                return code;