From: Wayne Davison Date: Fri, 22 May 2020 15:10:41 +0000 (-0700) Subject: Fix a bug in the writing of the batch.sh file X-Git-Tag: v3.2.0pre1~137 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a7303a3d3d1ab3221bcb950f19eefb10e27b4bf7;p=thirdparty%2Frsync.git Fix a bug in the writing of the batch.sh file Fix the code that writes the options and the default destination path into the batch.sh file to be able to handle options being specified after source/dest args. --- diff --git a/batch.c b/batch.c index 263a9a357..8915d9e0f 100644 --- a/batch.c +++ b/batch.c @@ -213,7 +213,7 @@ static void write_filter_rules(int fd) * understand most of the options, so it uses some overly simple * heuristics to munge the command line into something that will * (hopefully) work. */ -void write_batch_shell_file(int argc, char *argv[], int file_arg_cnt) +void write_batch_shell_file(int argc, char *argv[], int file_argc, char *file_argv[]) { int fd, i, len, err = 0; char *p, *p2, filename[MAXPATHLEN]; @@ -237,8 +237,15 @@ void write_batch_shell_file(int argc, char *argv[], int file_arg_cnt) else write_sbuf(fd, " --exclude-from=-"); } - for (i = 1; i < argc - file_arg_cnt; i++) { + for (i = 1; i < argc; i++) { p = argv[i]; + if (file_argc && p == file_argv[0]) { + if (file_argc > 1) { + file_argv++; + file_argc--; + } + continue; + } if (strncmp(p, "--files-from", 12) == 0 || strncmp(p, "--filter", 8) == 0 || strncmp(p, "--include", 9) == 0 @@ -267,8 +274,8 @@ void write_batch_shell_file(int argc, char *argv[], int file_arg_cnt) err = 1; } } - if (!(p = check_for_hostspec(argv[argc - 1], &p2, &i))) - p = argv[argc - 1]; + if (!(p = check_for_hostspec(file_argv[file_argc - 1], &p2, &i))) + p = file_argv[file_argc - 1]; if (write(fd, " ${1:-", 6) != 6 || write_arg(fd, p) < 0) err = 1; diff --git a/main.c b/main.c index ca96270a1..2e2094d26 100644 --- a/main.c +++ b/main.c @@ -1726,7 +1726,7 @@ int main(int argc,char *argv[]) if ((write_batch || read_batch) && !am_server) { if (write_batch) - write_batch_shell_file(orig_argc, orig_argv, argc); + write_batch_shell_file(orig_argc, orig_argv, argc, argv); if (read_batch && strcmp(batch_name, "-") == 0) batch_fd = STDIN_FILENO;