X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/b5ae4e25c26f006e686dcefde9fe7d489f840248..b769ad6a3e7ef871ea0aabd5b033018ba6cdbb90:/syscall.c diff --git a/syscall.c b/syscall.c index d23f2ebf..4369c6e3 100644 --- a/syscall.c +++ b/syscall.c @@ -7,8 +7,9 @@ * Copyright (C) 2003-2007 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 @@ -16,8 +17,7 @@ * 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" @@ -25,6 +25,9 @@ #if !defined MKNOD_CREATES_SOCKETS && defined HAVE_SYS_UN_H #include #endif +#ifdef HAVE_SYS_ATTR_H +#include +#endif extern int dry_run; extern int am_root; @@ -112,7 +115,7 @@ int do_mknod(const char *pathname, mode_t mode, dev_t dev) return -1; close(sock); #ifdef HAVE_CHMOD - return do_chmod(pathname, mode); /*DISCOURAGED FUNCTION*/ + return do_chmod(pathname, mode); #else return 0; #endif @@ -151,6 +154,14 @@ 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 @@ -200,6 +211,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) {