summaryrefslogtreecommitdiff
path: root/cmds-receive.c
diff options
context:
space:
mode:
Diffstat (limited to 'cmds-receive.c')
-rw-r--r--cmds-receive.c47
1 files changed, 31 insertions, 16 deletions
diff --git a/cmds-receive.c b/cmds-receive.c
index 05af6f7e..114b718c 100644
--- a/cmds-receive.c
+++ b/cmds-receive.c
@@ -856,8 +856,8 @@ static struct btrfs_send_ops send_ops = {
.utimes = process_utimes,
};
-static int do_receive(struct btrfs_receive *r, const char *tomnt, int r_fd,
- u64 max_errors)
+static int do_receive(struct btrfs_receive *r, const char *tomnt,
+ char *realmnt, int r_fd, u64 max_errors)
{
int ret;
char *dest_dir_full_path;
@@ -879,20 +879,24 @@ static int do_receive(struct btrfs_receive *r, const char *tomnt, int r_fd,
goto out;
}
- ret = find_mount_root(dest_dir_full_path, &r->root_path);
- if (ret < 0) {
- fprintf(stderr,
- "ERROR: failed to determine mount point for %s: %s\n",
- dest_dir_full_path, strerror(-ret));
- ret = -EINVAL;
- goto out;
- }
- if (ret > 0) {
- fprintf(stderr,
+ if (realmnt) {
+ r->root_path = realmnt;
+ } else {
+ ret = find_mount_root(dest_dir_full_path, &r->root_path);
+ if (ret < 0) {
+ fprintf(stderr,
+ "ERROR: failed to determine mount point for %s: %s\n",
+ dest_dir_full_path, strerror(-ret));
+ ret = -EINVAL;
+ goto out;
+ }
+ if (ret > 0) {
+ fprintf(stderr,
"ERROR: %s doesn't belong to btrfs mount point\n",
dest_dir_full_path);
- ret = -EINVAL;
- goto out;
+ ret = -EINVAL;
+ goto out;
+ }
}
r->mnt_fd = open(r->root_path, O_RDONLY | O_NOATIME);
if (r->mnt_fd < 0) {
@@ -994,6 +998,7 @@ int cmd_receive(int argc, char **argv)
{
char *tomnt = NULL;
char *fromfile = NULL;
+ char *realmnt = NULL;
struct btrfs_receive r;
int receive_fd = fileno(stdin);
u64 max_errors = 1;
@@ -1013,7 +1018,7 @@ int cmd_receive(int argc, char **argv)
{ NULL, 0, NULL, 0 }
};
- c = getopt_long(argc, argv, "Cevf:", long_opts, NULL);
+ c = getopt_long(argc, argv, "Cevf:m:", long_opts, NULL);
if (c < 0)
break;
@@ -1033,6 +1038,13 @@ int cmd_receive(int argc, char **argv)
case 'E':
max_errors = arg_strtou64(optarg);
break;
+ case 'm':
+ realmnt = strdup(optarg);
+ if (!realmnt) {
+ fprintf(stderr, "ERROR: couldn't allocate realmnt.\n");
+ return 1;
+ }
+ break;
case '?':
default:
fprintf(stderr, "ERROR: receive args invalid.\n");
@@ -1053,7 +1065,7 @@ int cmd_receive(int argc, char **argv)
}
}
- ret = do_receive(&r, tomnt, receive_fd, max_errors);
+ ret = do_receive(&r, tomnt, realmnt, receive_fd, max_errors);
return !!ret;
}
@@ -1083,5 +1095,8 @@ const char * const cmd_receive_usage[] = {
"--max-errors <N> Terminate as soon as N errors happened while",
" processing commands from the send stream.",
" Default value is 1. A value of 0 means no limit.",
+ "-m <mountpoint> The root mount point of the destination fs.",
+ " If you do not have /proc use this to tell us where ",
+ " this file system is mounted.",
NULL
};