*
* Copyright (C) 1998 Andrew Tridgell
* Copyright (C) 2002 Martin Pool
- * Copyright (C) 2003-2007 Wayne Davison
+ * Copyright (C) 2003-2009 Wayne Davison
*
* This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ * with this program; if not, visit the http://fsf.org website.
*/
#include "rsync.h"
#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 { \
return unlink(fname);
}
-int do_symlink(const char *fname1, const char *fname2)
+#ifdef SUPPORT_LINKS
+int do_symlink(const char *lnk, const char *fname)
{
if (dry_run) return 0;
RETURN_ERROR_IF_RO_OR_LO;
- return symlink(fname1, fname2);
+ return symlink(lnk, fname);
}
+#endif
#ifdef HAVE_LINK
int do_link(const char *fname1, const char *fname2)
return -1;
close(sock);
#ifdef HAVE_CHMOD
- return do_chmod(pathname, mode); /*DISCOURAGED FUNCTION*/
+ return do_chmod(pathname, mode);
#else
return 0;
#endif
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
-}