*
* 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
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;
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[];
static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
char *fname, int fd, OFF_T total_size)
{
- static char file_sum1[MD4_SUM_LENGTH];
- static char file_sum2[MD4_SUM_LENGTH];
+ static char file_sum1[MAX_DIGEST_LEN];
+ static char file_sum2[MAX_DIGEST_LEN];
struct map_struct *mapbuf;
struct sum_struct sum;
- int32 len;
+ int32 len, sum_len;
OFF_T offset = 0;
OFF_T offset2;
char *data;
exit_cleanup(RERR_FILEIO);
}
- sum_end(file_sum1);
+ sum_len = sum_end(file_sum1);
if (mapbuf)
unmap_file(mapbuf);
- read_buf(f_in,file_sum2,MD4_SUM_LENGTH);
+ read_buf(f_in, file_sum2, sum_len);
if (verbose > 2)
rprintf(FINFO,"got file_sum\n");
- if (fd != -1 && memcmp(file_sum1, file_sum2, MD4_SUM_LENGTH) != 0)
+ if (fd != -1 && memcmp(file_sum1, file_sum2, sum_len) != 0)
return 0;
return 1;
}
}
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;
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)
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);
* 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" */
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) {
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);
}
}