[SCM] The rsync repository. - branch master updated

Rsync CVS commit messages rsync-cvs at lists.samba.org
Mon Aug 24 05:09:34 UTC 2015


The branch, master has been updated
       via  abfb41e Avoid creating even the top-level backup dir until needed. Fixes bug 11423.
       via  9d1cd24 Improve make_path() error return for non-dir element.
      from  f8d2ecd Preparing for release of 3.1.2pre1

https://git.samba.org/?p=rsync.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit abfb41e63e9c18f05984bad5ac5a627f38b278ed
Author: Wayne Davison <wayned at samba.org>
Date:   Sun Aug 23 20:58:04 2015 -0700

    Avoid creating even the top-level backup dir until needed.
    Fixes bug 11423.

commit 9d1cd2437c81dadb5d1a7eff2cec0c529d10289a
Author: Wayne Davison <wayned at samba.org>
Date:   Sun Aug 23 20:52:59 2015 -0700

    Improve make_path() error return for non-dir element.

-----------------------------------------------------------------------

Summary of changes:
 backup.c | 12 ++++++++++++
 main.c   | 25 +++++++++++++++++++------
 util.c   |  6 ++++--
 3 files changed, 35 insertions(+), 8 deletions(-)


Changeset truncated at 500 lines:

diff --git a/backup.c b/backup.c
index fcc1a72..bc5e927 100644
--- a/backup.c
+++ b/backup.c
@@ -157,6 +157,18 @@ static BOOL copy_valid_path(const char *fname)
 char *get_backup_name(const char *fname)
 {
 	if (backup_dir) {
+		static int initialized = 0;
+		if (!initialized) {
+			int ret;
+			if (backup_dir_len > 1)
+				backup_dir_buf[backup_dir_len-1] = '\0';
+			ret = make_path(backup_dir_buf, 0);
+			if (backup_dir_len > 1)
+				backup_dir_buf[backup_dir_len-1] = '/';
+			if (ret < 0)
+				return NULL;
+			initialized = 1;
+		}
 		/* copy fname into backup_dir_buf while validating the dirs. */
 		if (copy_valid_path(fname))
 			return backup_dir_buf;
diff --git a/main.c b/main.c
index 3a0b702..4613c96 100644
--- a/main.c
+++ b/main.c
@@ -76,6 +76,7 @@ extern size_t bwlimit_writemax;
 extern unsigned int module_dirlen;
 extern BOOL flist_receiving_enabled;
 extern BOOL shutting_down;
+extern int backup_dir_len;
 extern int basis_dir_cnt;
 extern struct stats stats;
 extern char *stdout_format;
@@ -850,13 +851,25 @@ static int do_recv(int f_in, int f_out, char *local_name)
 	}
 
 	if (backup_dir) {
-		int ret = make_path(backup_dir_buf, MKP_DROP_NAME); /* drops trailing slash */
-		if (ret < 0)
-			exit_cleanup(RERR_SYNTAX);
-		if (ret)
-			rprintf(FINFO, "Created backup_dir %s\n", backup_dir_buf);
-		else if (INFO_GTE(BACKUP, 1))
+		STRUCT_STAT st;
+		int ret;
+		if (backup_dir_len > 1)
+			backup_dir_buf[backup_dir_len-1] = '\0';
+		ret = do_stat(backup_dir_buf, &st);
+		if (ret != 0 || !S_ISDIR(st.st_mode)) {
+			if (ret == 0) {
+				rprintf(FERROR, "The backup-dir is not a directory: %s\n", backup_dir_buf);
+				exit_cleanup(RERR_SYNTAX);
+			}
+			if (errno != ENOENT) {
+				rprintf(FERROR, "Failed to stat %s: %s\n", backup_dir_buf, strerror(errno));
+				exit_cleanup(RERR_FILEIO);
+			}
+			rprintf(FINFO, "(new) backup_dir is %s\n", backup_dir_buf);
+		} else if (INFO_GTE(BACKUP, 1))
 			rprintf(FINFO, "backup_dir is %s\n", backup_dir_buf);
+		if (backup_dir_len > 1)
+			backup_dir_buf[backup_dir_len-1] = '/';
 	}
 
 	io_flush(FULL_FLUSH);
diff --git a/util.c b/util.c
index 0775add..c0e239d 100644
--- a/util.c
+++ b/util.c
@@ -190,7 +190,7 @@ int make_path(char *fname, int flags)
 
 	if (flags & MKP_DROP_NAME) {
 		end = strrchr(fname, '/');
-		if (!end)
+		if (!end || end == fname)
 			return 0;
 		*end = '\0';
 	} else
@@ -210,8 +210,10 @@ int make_path(char *fname, int flags)
 			ret++;
 			break;
 		}
+
 		if (errno != ENOENT) {
-			if (errno != EEXIST)
+			STRUCT_STAT st;
+			if (errno != EEXIST || (do_stat(fname, &st) == 0 && !S_ISDIR(st.st_mode)))
 				ret = -ret - 1;
 			break;
 		}


-- 
The rsync repository.



More information about the rsync-cvs mailing list