*
* Copyright (C) 1998 Andrew Tridgell
* Copyright (C) 2002 Martin Pool
- * Copyright (C) 2003, 2004, 2005, 2006 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 as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * 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,
* 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 { \
{
if (dry_run) return 0;
RETURN_ERROR_IF_RO_OR_LO;
+
+ /* For --fake-super, we create a normal file with mode 0600. */
+ if (am_root < 0) {
+ int fd = open(pathname, O_WRONLY|O_CREAT|O_TRUNC, S_IWUSR|S_IRUSR);
+ if (fd < 0 || close(fd) < 0)
+ return -1;
+ return 0;
+ }
+
#if !defined MKNOD_CREATES_FIFOS && defined HAVE_MKFIFO
if (S_ISFIFO(mode))
return mkfifo(pathname, mode);
if (S_ISSOCK(mode)) {
int sock;
struct sockaddr_un saddr;
- unsigned int len;
-
- saddr.sun_family = AF_UNIX;
- len = strlcpy(saddr.sun_path, pathname, sizeof saddr.sun_path);
+#ifdef HAVE_SOCKADDR_UN_LEN
+ unsigned int len =
+#endif
+ strlcpy(saddr.sun_path, pathname, sizeof saddr.sun_path);
#ifdef HAVE_SOCKADDR_UN_LEN
saddr.sun_len = len >= sizeof saddr.sun_path
? sizeof saddr.sun_path : len + 1;
#endif
+ saddr.sun_family = AF_UNIX;
if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0
|| (unlink(pathname) < 0 && errno != ENOENT)
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
-}