summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Merillat <dan.merillat@gmail.com>2015-04-23 12:51:33 -0400
committerDavid Sterba <dsterba@suse.cz>2015-04-29 17:55:18 +0200
commit829950844ed3b1c5a4f3c89d68f3443f2027ec93 (patch)
tree956cf12ad31f9804bbe5d0d0bc0ee882867949a8
parent19a806f575cd010734fa5793c4b3bfb49926dc62 (diff)
btrfs-progs: restore: separate the overwrite check
Symlink restore needs this, but the cut&paste became too complicated. Simplify everything. Signed-off-by: Dan Merillat <dan.merillat@gmail.com> [message wording adjustments] Signed-off-by: David Sterba <dsterba@suse.cz>
-rw-r--r--cmds-restore.c52
1 files changed, 33 insertions, 19 deletions
diff --git a/cmds-restore.c b/cmds-restore.c
index e1411e91..40fed5a0 100644
--- a/cmds-restore.c
+++ b/cmds-restore.c
@@ -781,6 +781,36 @@ out:
return ret;
}
+/*
+ * returns:
+ * 0 if the file exists and should be skipped.
+ * 1 if the file does NOT exist
+ * 2 if the file exists but is OK to overwrite
+ */
+static int overwrite_ok(const char * path)
+{
+ static int warn = 0;
+ struct stat st;
+ int ret;
+
+ /* don't be fooled by symlinks */
+ ret = fstatat(-1, path_name, &st, AT_SYMLINK_NOFOLLOW);
+
+ if (!ret) {
+ if (overwrite)
+ return 2;
+
+ if (verbose || !warn)
+ printf("Skipping existing file"
+ " %s\n", path);
+ if (!warn)
+ printf("If you wish to overwrite use -o\n");
+ warn = 1;
+ return 0;
+ }
+ return 1;
+}
+
static int search_dir(struct btrfs_root *root, struct btrfs_key *key,
const char *output_rootdir, const char *in_dir,
const regex_t *mreg)
@@ -899,25 +929,9 @@ static int search_dir(struct btrfs_root *root, struct btrfs_key *key,
* files, no symlinks or anything else.
*/
if (type == BTRFS_FT_REG_FILE) {
- if (!overwrite) {
- static int warn = 0;
- struct stat st;
-
- ret = stat(path_name, &st);
- if (!ret) {
- loops = 0;
- if (verbose || !warn)
- printf("Skipping existing file"
- " %s\n", path_name);
- if (warn)
- goto next;
- printf("If you wish to overwrite use "
- "the -o option to overwrite\n");
- warn = 1;
- goto next;
- }
- ret = 0;
- }
+ if (!overwrite_ok(path_name))
+ goto next;
+
if (verbose)
printf("Restoring %s\n", path_name);
if (dry_run)