diff --git a/cmds-receive.c b/cmds-receive.c index 97952763..90e26d25 100644 --- a/cmds-receive.c +++ b/cmds-receive.c @@ -66,6 +66,8 @@ struct btrfs_receive struct subvol_info *cur_subvol; struct subvol_uuid_search sus; + + int honor_end_cmd; }; static int finish_subvol(struct btrfs_receive *r) @@ -810,7 +812,8 @@ int do_receive(struct btrfs_receive *r, const char *tomnt, int r_fd) goto out; while (!end) { - ret = btrfs_read_and_process_send_stream(r_fd, &send_ops, r); + ret = btrfs_read_and_process_send_stream(r_fd, &send_ops, r, + r->honor_end_cmd); if (ret < 0) goto out; if (ret) @@ -863,7 +866,7 @@ static int do_cmd_receive(int argc, char **argv) r.mnt_fd = -1; r.write_fd = -1; - while ((c = getopt(argc, argv, "vf:")) != -1) { + while ((c = getopt(argc, argv, "evf:")) != -1) { switch (c) { case 'v': g_verbose++; @@ -871,6 +874,9 @@ static int do_cmd_receive(int argc, char **argv) case 'f': fromfile = optarg; break; + case 'e': + r.honor_end_cmd = 1; + break; case '?': default: fprintf(stderr, "ERROR: receive args invalid.\n"); @@ -904,7 +910,7 @@ static const char * const receive_cmd_group_usage[] = { }; const char * const cmd_receive_usage[] = { - "btrfs receive [-v] [-f ] ", + "btrfs receive [-ve] [-f ] ", "Receive subvolumes from stdin.", "Receives one or more subvolumes that were previously ", "sent with btrfs send. The received subvolumes are stored", @@ -920,6 +926,10 @@ const char * const cmd_receive_usage[] = { "-f By default, btrfs receive uses stdin", " to receive the subvolumes. Use this", " option to specify a file to use instead.", + "-e Terminate after receiving an ", + " in the data stream. Without this option,", + " the receiver terminates only if an error", + " is recognized or on EOF.", NULL }; diff --git a/send-stream.c b/send-stream.c index a3628e45..1a498f3f 100644 --- a/send-stream.c +++ b/send-stream.c @@ -439,7 +439,8 @@ out: } int btrfs_read_and_process_send_stream(int fd, - struct btrfs_send_ops *ops, void *user) + struct btrfs_send_ops *ops, void *user, + int honor_end_cmd) { int ret; struct btrfs_send_stream s; @@ -476,7 +477,8 @@ int btrfs_read_and_process_send_stream(int fd, if (ret < 0) goto out; if (ret) { - ret = 0; + if (!honor_end_cmd) + ret = 0; goto out; } } diff --git a/send-stream.h b/send-stream.h index 92230187..17bc6692 100644 --- a/send-stream.h +++ b/send-stream.h @@ -57,7 +57,8 @@ struct btrfs_send_ops { }; int btrfs_read_and_process_send_stream(int fd, - struct btrfs_send_ops *ops, void *user); + struct btrfs_send_ops *ops, void *user, + int honor_end_cmd); #ifdef __cplusplus }