X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/73cb6738b33846130c21f2903b2200fa3f1903ab..7875e6fe63805a3412cb4a8673a2dbf233631110:/main.c diff --git a/main.c b/main.c index ad4fb0af..0774f1fa 100644 --- a/main.c +++ b/main.c @@ -4,7 +4,7 @@ * Copyright (C) 1996-2001 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras * Copyright (C) 2001, 2002 Martin Pool - * Copyright (C) 2003-2008 Wayne Davison + * Copyright (C) 2003-2009 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -469,7 +469,7 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in #ifdef ICONV_CONST setup_iconv(); #endif - if (protect_args) + if (protect_args && !daemon_over_rsh) send_protected_args(*f_out_p, args); } @@ -507,20 +507,29 @@ static char *get_local_name(struct file_list *flist, char *dest_path) if (!dest_path || list_only) return NULL; - if (daemon_filter_list.head - && (check_filter(&daemon_filter_list, dest_path, 0 != 0) < 0 - || check_filter(&daemon_filter_list, dest_path, 1 != 0) < 0)) { - rprintf(FERROR, "skipping daemon-excluded destination \"%s\"\n", - dest_path); - exit_cleanup(RERR_FILESELECT); + if (daemon_filter_list.head) { + char *slash = strrchr(dest_path, '/'); + if (slash && (slash[1] == '\0' || (slash[1] == '.' && slash[2] == '\0'))) + *slash = '\0'; + else + slash = NULL; + if ((*dest_path != '.' || dest_path[1] != '\0') + && (check_filter(&daemon_filter_list, FLOG, dest_path, 0) < 0 + || check_filter(&daemon_filter_list, FLOG, dest_path, 1) < 0)) { + rprintf(FERROR, "skipping daemon-excluded destination \"%s\"\n", + dest_path); + exit_cleanup(RERR_FILESELECT); + } + if (slash) + *slash = '/'; } /* See what currently exists at the destination. */ if ((statret = do_stat(dest_path, &st)) == 0) { /* If the destination is a dir, enter it and use mode 1. */ if (S_ISDIR(st.st_mode)) { - if (!push_dir(dest_path, 0)) { - rsyserr(FERROR, errno, "push_dir#1 %s failed", + if (!change_dir(dest_path, CD_NORMAL)) { + rsyserr(FERROR, errno, "change_dir#1 %s failed", full_fname(dest_path)); exit_cleanup(RERR_FILESELECT); } @@ -579,8 +588,8 @@ static char *get_local_name(struct file_list *flist, char *dest_path) dry_run++; } - if (!push_dir(dest_path, dry_run > 1)) { - rsyserr(FERROR, errno, "push_dir#2 %s failed", + if (!change_dir(dest_path, dry_run > 1 ? CD_SKIP_CHDIR : CD_NORMAL)) { + rsyserr(FERROR, errno, "change_dir#2 %s failed", full_fname(dest_path)); exit_cleanup(RERR_FILESELECT); } @@ -599,8 +608,8 @@ static char *get_local_name(struct file_list *flist, char *dest_path) dest_path = "/"; *cp = '\0'; - if (!push_dir(dest_path, 0)) { - rsyserr(FERROR, errno, "push_dir#3 %s failed", + if (!change_dir(dest_path, CD_NORMAL)) { + rsyserr(FERROR, errno, "change_dir#3 %s failed", full_fname(dest_path)); exit_cleanup(RERR_FILESELECT); } @@ -692,8 +701,8 @@ static void do_server_sender(int f_in, int f_out, int argc, char *argv[]) } if (!relative_paths) { - if (!push_dir(dir, 0)) { - rsyserr(FERROR, errno, "push_dir#3 %s failed", + if (!change_dir(dir, CD_NORMAL)) { + rsyserr(FERROR, errno, "change_dir#3 %s failed", full_fname(dir)); exit_cleanup(RERR_FILESELECT); } @@ -862,8 +871,8 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[]) char *dir = argv[0]; argc--; argv++; - if (!am_daemon && !push_dir(dir, 0)) { - rsyserr(FERROR, errno, "push_dir#4 %s failed", + if (!am_daemon && !change_dir(dir, CD_NORMAL)) { + rsyserr(FERROR, errno, "change_dir#4 %s failed", full_fname(dir)); exit_cleanup(RERR_FILESELECT); } @@ -916,11 +925,11 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[]) char *dir = *dir_p; if (*dir == '/') dir += module_dirlen; - if (check_filter(elp, dir, 1) < 0) + if (check_filter(elp, FLOG, dir, 1) < 0) goto options_rejected; } if (partial_dir && *partial_dir == '/' - && check_filter(elp, partial_dir + module_dirlen, 1) < 0) { + && check_filter(elp, FLOG, partial_dir + module_dirlen, 1) < 0) { options_rejected: rprintf(FERROR, "Your options have been rejected by the server.\n"); @@ -1007,7 +1016,6 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) if (write_batch && !am_server) start_write_batch(f_out); flist = send_file_list(f_out, argc, argv); - set_msg_fd_in(-1); if (verbose > 3) rprintf(FINFO,"file list sent\n"); @@ -1178,8 +1186,8 @@ static int start_client(int argc, char *argv[]) rprintf(FERROR, "remote destination is not allowed with --read-batch\n"); exit_cleanup(RERR_SYNTAX); } - remote_argv = argv + argc - 1; - remote_argc = 1; + remote_argv = argv += argc - 1; + remote_argc = argc = 1; } if (am_sender) { @@ -1428,11 +1436,11 @@ int main(int argc,char *argv[]) SIGACTION(SIGXFSZ, SIG_IGN); #endif - /* Initialize push_dir here because on some old systems getcwd + /* Initialize change_dir() here because on some old systems getcwd * (implemented by forking "pwd" and reading its output) doesn't * work when there are other child processes. Also, on all systems * that implement getcwd that way "pwd" can't be found after chroot. */ - push_dir(NULL, 0); + change_dir(NULL, CD_NORMAL); init_flist(); @@ -1456,7 +1464,6 @@ int main(int argc,char *argv[]) read_stream_flags(batch_fd); else write_stream_flags(batch_fd); - } if (write_batch < 0) dry_run = 1;