*
* Copyright (C) 1998 Andrew Tridgell
* Copyright (C) 2002 Martin Pool
- * Copyright (C) 2003-2007 Wayne Davison
+ * Copyright (C) 2003-2008 Wayne Davison
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#if !defined MKNOD_CREATES_SOCKETS && defined HAVE_SYS_UN_H
#include <sys/un.h>
#endif
+#ifdef HAVE_SYS_ATTR_H
+#include <sys/attr.h>
+#endif
extern int dry_run;
extern int am_root;
extern int read_only;
extern int list_only;
extern int preserve_perms;
+extern int preserve_executability;
#define RETURN_ERROR_IF(x,e) \
do { \
if (S_ISLNK(mode)) {
#ifdef HAVE_LCHMOD
code = lchmod(path, mode & CHMOD_BITS);
+#elif defined HAVE_SETATTRLIST
+ 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);
#else
code = 1;
#endif
} else
- code = chmod(path, mode & CHMOD_BITS);
- if (code != 0 && preserve_perms)
- return code;
+ code = chmod(path, mode & CHMOD_BITS); /* DISCOURAGED FUNCTION */
+ if (code != 0 && (preserve_perms || preserve_executability))
+ return code;
return 0;
}
#endif
{
RETURN_ERROR_IF(dry_run, 0);
RETURN_ERROR_IF(read_only, EROFS);
+ perms |= S_IWUSR;
#if defined HAVE_SECURE_MKSTEMP && defined HAVE_FCHMOD && (!defined HAVE_OPEN64 || defined HAVE_MKSTEMP64)
{
return lseek(fd, offset, whence);
#endif
}
-
-char *d_name(struct dirent *di)
-{
-#ifdef HAVE_BROKEN_READDIR
- return (di->d_name - 2);
-#else
- return di->d_name;
-#endif
-}