X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/d0221f1d2bb77a8fa9ce8e86ab52ee566c7a9b77..1c3344a105f656a45f6b46e1710c3fc4ab862a9a:/receiver.c diff --git a/receiver.c b/receiver.c index 17601e6e..3b3c51e3 100644 --- a/receiver.c +++ b/receiver.c @@ -3,12 +3,11 @@ * * Copyright (C) 1996-2000 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras - * Copyright (C) 2003, 2004, 2005, 2006 Wayne Davison + * Copyright (C) 2003-2007 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. + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -26,7 +25,7 @@ extern int verbose; extern int do_xfers; extern int am_server; extern int do_progress; -extern int incremental; +extern int inc_recurse; extern int log_before_transfer; extern int stdout_format_has_i; extern int logfile_format_has_i; @@ -48,8 +47,8 @@ extern int keep_partial; extern int checksum_seed; extern int inplace; extern int delay_updates; +extern mode_t orig_umask; extern struct stats stats; -extern char *stdout_format; extern char *tmpdir; extern char *partial_dir; extern char *basis_dir[]; @@ -319,7 +318,7 @@ static int get_next_gen_ndx(int fd, int next_gen_ndx, int desired_ndx) } next_gen_ndx = read_int(fd); if (next_gen_ndx == -1) { - if (incremental) + if (inc_recurse) next_gen_ndx = first_flist->prev->count + first_flist->prev->ndx_start; else next_gen_ndx = cur_flist->count; @@ -349,6 +348,10 @@ int recv_files(int f_in, char *local_name) int itemizing = am_server ? logfile_format_has_i : stdout_format_has_i; enum logcode log_code = log_before_transfer ? FLOG : FINFO; int max_phase = protocol_version >= 29 ? 2 : 1; + int dflt_perms = (ACCESSPERMS & ~orig_umask); +#ifdef SUPPORT_ACLS + const char *parent_dirname = ""; +#endif int ndx, recv_ok; if (verbose > 2) @@ -366,13 +369,13 @@ int recv_files(int f_in, char *local_name) ndx = read_ndx_and_attrs(f_in, -1, &iflags, &fnamecmp_type, xname, &xlen); if (ndx == NDX_DONE) { - if (incremental && first_flist) { + if (inc_recurse && first_flist) { flist_free(first_flist); if (first_flist) continue; } if (read_batch && cur_flist) { - int high = incremental + int high = inc_recurse ? first_flist->prev->count + first_flist->prev->ndx_start : cur_flist->count; get_next_gen_ndx(batch_gen_fd, next_gen_ndx, high); @@ -564,7 +567,16 @@ int recv_files(int f_in, char *local_name) * mode based on the local permissions and some heuristics. */ if (!preserve_perms) { int exists = fd1 != -1; - file->mode = dest_mode(file->mode, st.st_mode, exists); +#ifdef SUPPORT_ACLS + const char *dn = file->dirname ? file->dirname : "."; + if (parent_dirname != dn + && strcmp(parent_dirname, dn) != 0) { + dflt_perms = default_perms_for_dir(dn); + parent_dirname = dn; + } +#endif + file->mode = dest_mode(file->mode, st.st_mode, + dflt_perms, exists); } /* We now check to see if we are writing the file "inplace" */ @@ -665,7 +677,7 @@ int recv_files(int f_in, char *local_name) cleanup_disable(); if (recv_ok > 0) { - if (remove_source_files || incremental + if (remove_source_files || inc_recurse || (preserve_hard_links && F_IS_HLINKED(file))) send_msg_int(MSG_SUCCESS, ndx); } else if (!recv_ok) { @@ -692,7 +704,7 @@ int recv_files(int f_in, char *local_name) if (!redoing) { send_msg_int(MSG_REDO, ndx); file->flags |= FLAG_FILE_SENT; - } else if (incremental) + } else if (inc_recurse) send_msg_int(MSG_NO_SEND, ndx); } }