aboutsummaryrefslogtreecommitdiffstats
path: root/syscall.c
diff options
context:
space:
mode:
authorDavid Dykstra <dwd@samba.org>2003-01-21 00:58:50 +0000
committerDavid Dykstra <dwd@samba.org>2003-01-21 00:58:50 +0000
commitf0b4fdaf5e542135b6f1d5694550208cbd6fe9ec (patch)
treec8b397d80dc0934f65a2bcfa76965d65858b6825 /syscall.c
parentac6ce983752fcf749ee9aa4da88271a47ebbab3a (diff)
downloadandroid_external_rsync-f0b4fdaf5e542135b6f1d5694550208cbd6fe9ec.tar.gz
android_external_rsync-f0b4fdaf5e542135b6f1d5694550208cbd6fe9ec.tar.bz2
android_external_rsync-f0b4fdaf5e542135b6f1d5694550208cbd6fe9ec.zip
Ignore errors from chmod when --preserve-perms/-p/-a are not set.
Gnu cp behaves the same way.
Diffstat (limited to 'syscall.c')
-rw-r--r--syscall.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/syscall.c b/syscall.c
index b198dbf4..58f1f677 100644
--- a/syscall.c
+++ b/syscall.c
@@ -29,6 +29,7 @@
extern int dry_run;
extern int read_only;
extern int list_only;
+extern int preserve_perms;
#define CHECK_RO if (read_only || list_only) {errno = EROFS; return -1;}
@@ -97,9 +98,13 @@ int do_open(char *pathname, int flags, mode_t mode)
#if HAVE_CHMOD
int do_chmod(const char *path, mode_t mode)
{
+ int code;
if (dry_run) return 0;
CHECK_RO
- return chmod(path, mode);
+ code = chmod(path, mode);
+ if ((code != 0) && preserve_perms)
+ return code;
+ return 0;
}
#endif
@@ -150,7 +155,7 @@ int do_mkstemp(char *template, mode_t perms)
{
int fd = mkstemp(template);
if (fd == -1) return -1;
- if (fchmod(fd, perms) != 0) {
+ if ((fchmod(fd, perms) != 0) && preserve_perms) {
close(fd);
unlink(template);
return -1;