Change do_lchmod() back to a swtich with some better ENOTSUP & ENOSYS logic.

This commit is contained in:
Wayne Davison
2021-10-10 09:20:13 -07:00
parent ec8a05f653
commit 0d1b48893a

View File

@@ -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;