X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/44c26bf2a18a84c0f492c92c934060fe385096f7..91f4b31fe1031adc3ec3e3066534c9d6be979d21:/main.c diff --git a/main.c b/main.c index 3acdfd31..1c71d157 100644 --- a/main.c +++ b/main.c @@ -1,23 +1,25 @@ -/* -*- c-file-style: "linux" -*- - - Copyright (C) 1996-2001 by Andrew Tridgell - Copyright (C) Paul Mackerras 1996 - Copyright (C) 2001, 2002 by Martin Pool - - 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 - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ +/* + * The startup routines, including main(), for rsync. + * + * Copyright (C) 1996-2001 Andrew Tridgell + * Copyright (C) 1996 Paul Mackerras + * Copyright (C) 2001, 2002 Martin Pool + * Copyright (C) 2003, 2004, 2005, 2006 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ #include "rsync.h" #if defined CONFIG_LOCALE && defined HAVE_LOCALE_H @@ -47,6 +49,8 @@ extern int preserve_hard_links; extern int protocol_version; extern int recurse; extern int relative_paths; +extern int sanitize_paths; +extern int module_id; extern int rsync_port; extern int whole_file; extern int read_batch; @@ -57,11 +61,13 @@ extern int filesfrom_fd; extern pid_t cleanup_child_pid; extern struct stats stats; extern char *filesfrom_host; +extern char *basis_dir[]; extern char *rsync_path; extern char *shell_cmd; extern char *batch_name; int local_server = 0; +int startdir_depth = 0; mode_t orig_umask = 0; struct file_list *the_file_list; @@ -189,7 +195,7 @@ static void handle_stats(int f) /* this is the client */ if (f < 0 && !am_sender) /* e.g. when we got an empty file list. */ - ; + ; else if (!am_sender) { /* Read the first two in opposite order because the meaning of * read/write swaps when switching from sender to receiver. */ @@ -472,6 +478,8 @@ static char *get_local_name(struct file_list *flist, char *dest_path) full_fname(dest_path)); exit_cleanup(RERR_FILESELECT); } + if (sanitize_paths) + startdir_depth = count_dir_elements(dest_path); return NULL; } if (flist->count > 1) { @@ -524,6 +532,8 @@ static char *get_local_name(struct file_list *flist, char *dest_path) full_fname(dest_path)); exit_cleanup(RERR_FILESELECT); } + if (sanitize_paths) + startdir_depth = count_dir_elements(dest_path); return NULL; } @@ -544,6 +554,8 @@ static char *get_local_name(struct file_list *flist, char *dest_path) full_fname(dest_path)); exit_cleanup(RERR_FILESELECT); } + if (sanitize_paths) + startdir_depth = count_dir_elements(dest_path); *cp = '/'; return cp + 1; @@ -783,6 +795,14 @@ static void do_server_recv(int f_in, int f_out, int argc,char *argv[]) if (argc > 0) local_name = get_local_name(flist,argv[0]); + /* Now that we know what our destination directory turned out to be, + * we can sanitize the --link-/copy-/compare-dest args correctly. */ + if (sanitize_paths) { + char **dir; + for (dir = basis_dir; *dir; dir++) + *dir = sanitize_path(NULL, *dir, NULL, startdir_depth); + } + exit_code = do_recv(f_in,f_out,flist,local_name); exit_cleanup(exit_code); }