Include 2008 in the copyright years.
[rsync/rsync.git] / syscall.c
index 58daad1..f2f5bc2 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -4,11 +4,12 @@
  *
  * 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 version 3 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
 #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 { \
@@ -150,12 +155,20 @@ int do_chmod(const char *path, mode_t mode)
        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)
+       if (code != 0 && (preserve_perms || preserve_executability))
            return code;
        return 0;
 }
@@ -199,6 +212,7 @@ int do_mkstemp(char *template, mode_t perms)
 {
        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)
        {