[SCM] The rsync repository. - branch master updated
Rsync CVS commit messages
rsync-cvs at lists.samba.org
Mon Dec 23 11:32:56 MST 2013
The branch, master has been updated
via 6df5d81 Fix a few issues with make_path().
from 0e3152f Change owner+group before setting xattrs to avoid xattr loss. Fixes bug 10163.
;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 6df5d81ce2a0df0c83aae0a0f31e9703a50b271e
Author: Wayne Davison <wayned at samba.org>
Date: Mon Dec 23 10:27:24 2013 -0800
Fix a few issues with make_path().
The make_path() utility function was not returning the right status
when --dry-run was used, so I added some stat() checking that only
happens for -n. I also noticed that the function was not handling
the case where the whole path needed to be created, so I fixed that.
Fixes bug 10209.
-----------------------------------------------------------------------
Summary of changes:
util.c | 22 ++++++++++++++++++----
1 files changed, 18 insertions(+), 4 deletions(-)
Changeset truncated at 500 lines:
diff --git a/util.c b/util.c
index c943ce0..aeb5217 100644
--- a/util.c
+++ b/util.c
@@ -25,6 +25,7 @@
#include "itypes.h"
#include "inums.h"
+extern int dry_run;
extern int module_id;
extern int protect_args;
extern int modify_window;
@@ -197,7 +198,15 @@ int make_path(char *fname, int flags)
/* Try to find an existing dir, starting from the deepest dir. */
for (p = end; ; ) {
- if (do_mkdir(fname, ACCESSPERMS) == 0) {
+ if (dry_run) {
+ STRUCT_STAT st;
+ if (do_stat(fname, &st) == 0) {
+ if (S_ISDIR(st.st_mode))
+ errno = EEXIST;
+ else
+ errno = ENOTDIR;
+ }
+ } else if (do_mkdir(fname, ACCESSPERMS) == 0) {
ret++;
break;
}
@@ -208,12 +217,14 @@ int make_path(char *fname, int flags)
}
while (1) {
if (p == fname) {
- ret = -ret - 1;
+ /* We got a relative path that doesn't exist, so assume that '.'
+ * is there and just break out and create the whole thing. */
+ p = NULL;
goto double_break;
}
if (*--p == '/') {
if (p == fname) {
- ret = -ret - 1; /* impossible... */
+ /* We reached the "/" dir, which we assume is there. */
goto double_break;
}
*p = '\0';
@@ -225,7 +236,10 @@ int make_path(char *fname, int flags)
/* Make all the dirs that we didn't find on the way here. */
while (p != end) {
- *p = '/';
+ if (p)
+ *p = '/';
+ else
+ p = fname;
p += strlen(p);
if (ret < 0) /* Skip mkdir on error, but keep restoring the path. */
continue;
--
The rsync repository.
More information about the rsync-cvs
mailing list