X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/ce27f36d927ba68d62d3b4539cfd5e0f758e20fb..b4e6aac98543afdfab019339612673561c64f122:/main.c diff --git a/main.c b/main.c index b2dcb523..b06eeebe 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-2007 Wayne Davison + * Copyright (C) 2003-2008 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 @@ -45,6 +45,7 @@ extern int got_xfer_error; extern int module_id; extern int copy_links; extern int copy_dirlinks; +extern int copy_unsafe_links; extern int keep_dirlinks; extern int preserve_hard_links; extern int protocol_version; @@ -65,6 +66,7 @@ extern int batch_fd; extern int filesfrom_fd; extern int connect_timeout; extern pid_t cleanup_child_pid; +extern unsigned int module_dirlen; extern struct stats stats; extern char *filesfrom_host; extern char *partial_dir; @@ -81,6 +83,7 @@ extern struct filter_list_struct server_filter_list; extern iconv_t ic_send; #endif +uid_t our_uid; int local_server = 0; int daemon_over_rsh = 0; mode_t orig_umask = 0; @@ -277,7 +280,7 @@ static void output_summary(void) rprintf(FINFO, "total size is %s speedup is %.2f%s\n", human_num(stats.total_size), (double)stats.total_size / (total_written+total_read), - dry_run ? " (DRY RUN)" : ""); + write_batch < 0 ? " (BATCH ONLY)" : dry_run ? " (DRY RUN)" : ""); } fflush(stdout); @@ -332,7 +335,6 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in int i, argc = 0; char *args[MAX_ARGS]; pid_t ret; - char *dir = NULL; int dash_l_set = 0; if (!read_batch && !local_server) { @@ -508,9 +510,6 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in ret = piped_child(args, f_in_p, f_out_p); } - if (dir) - free(dir); - return ret; oom: @@ -643,7 +642,7 @@ static char *get_local_name(struct file_list *flist, char *dest_path) * dry-run mode and the destination dir does not yet exist, we'll try to * tweak any dest-relative paths to make them work for a dry-run (the * destination dir must be in curr_dir[] when this function is called). - * We also report if any arg that is non-existent or not a directory. */ + * We also warn about any arg that is non-existent or not a directory. */ static void check_alt_basis_dirs(void) { STRUCT_STAT st; @@ -761,7 +760,7 @@ static int do_recv(int f_in, int f_out, char *local_name) /* The receiving side mustn't obey this, or an existing symlink that * points to an identical file won't be replaced by the referent. */ - copy_links = copy_dirlinks = 0; + copy_links = copy_dirlinks = copy_unsafe_links = 0; #ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && !inc_recurse) @@ -869,7 +868,6 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[]) int exit_code; struct file_list *flist; char *local_name = NULL; - char *dir = NULL; int save_verbose = verbose; if (filesfrom_fd >= 0) { @@ -890,7 +888,7 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[]) } if (argc > 0) { - dir = argv[0]; + char *dir = argv[0]; argc--; argv++; if (!am_daemon && !push_dir(dir, 0)) { @@ -940,15 +938,18 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[]) check_alt_basis_dirs(); if (server_filter_list.head) { - char **dir; + char **dir_p; struct filter_list_struct *elp = &server_filter_list; - for (dir = basis_dir; *dir; dir++) { - if (check_filter(elp, *dir, 1) < 0) + for (dir_p = basis_dir; *dir_p; dir_p++) { + char *dir = *dir_p; + if (*dir == '/') + dir += module_dirlen; + if (check_filter(elp, dir, 1) < 0) goto options_rejected; } if (partial_dir && *partial_dir == '/' - && check_filter(elp, partial_dir, 1) < 0) { + && check_filter(elp, partial_dir + module_dirlen, 1) < 0) { options_rejected: rprintf(FERROR, "Your options have been rejected by the server.\n"); @@ -1428,7 +1429,8 @@ int main(int argc,char *argv[]) #endif starttime = time(NULL); - am_root = (MY_UID() == 0); + our_uid = MY_UID(); + am_root = our_uid == 0; memset(&stats, 0, sizeof(stats));