extern int blocking_io;
extern int cvs_exclude;
extern int delete_mode;
+extern int delete_before;
extern int delete_excluded;
-extern int delete_after;
extern int daemon_over_rsh;
extern int do_stats;
extern int dry_run;
extern pid_t cleanup_child_pid;
extern char *files_from;
extern char *remote_filesfrom_file;
+extern char *partial_dir;
extern char *basis_dir[];
extern char *rsync_path;
extern char *shell_cmd;
extern char *batch_name;
+extern struct filter_list_struct filter_list;
-
-/* there's probably never more than at most 2 outstanding child processes,
- * but set it higher just in case.
- */
+/* There's probably never more than at most 2 outstanding child processes,
+ * but set it higher, just in case. */
#define MAXCHILDPROCS 5
struct pid_status {
write_longint(f, total_read);
write_longint(f, total_written);
write_longint(f, stats.total_size);
+ if (protocol_version >= 29) {
+ write_longint(f, stats.flist_buildtime);
+ write_longint(f, stats.flist_xfertime);
+ }
}
return;
}
total_written = read_longint(f);
total_read = read_longint(f);
stats.total_size = read_longint(f);
+ if (protocol_version >= 29) {
+ stats.flist_buildtime = read_longint(f);
+ stats.flist_xfertime = read_longint(f);
+ }
} else if (write_batch) {
/* The --read-batch process is going to be a client
* receiver, so we need to give it the stats. */
write_longint(batch_fd, total_read);
write_longint(batch_fd, total_written);
write_longint(batch_fd, stats.total_size);
+ if (protocol_version >= 29) {
+ write_longint(batch_fd, stats.flist_buildtime);
+ write_longint(batch_fd, stats.flist_xfertime);
+ }
}
if (do_stats) {
rprintf(FINFO,"Matched data: %.0f bytes\n",
(double)stats.matched_data);
rprintf(FINFO,"File list size: %d\n", stats.flist_size);
+ if (stats.flist_buildtime) {
+ rprintf(FINFO,
+ "File list generation time: %.3f seconds\n",
+ (double)stats.flist_buildtime / 1000);
+ rprintf(FINFO,
+ "File list transfer time: %.3f seconds\n",
+ (double)stats.flist_xfertime / 1000);
+ }
rprintf(FINFO,"Total bytes sent: %.0f\n",
(double)total_written);
rprintf(FINFO,"Total bytes received: %.0f\n",
**/
static void show_malloc_stats(void)
{
-#ifdef HAVE_MALLINFO
+#if HAVE_MALLINFO
struct mallinfo mi;
mi = mallinfo();
rprintf(FINFO, "\n" RSYNC_NAME "[%d] (%s%s%s) heap statistics:\n",
- getpid(),
- am_server ? "server " : "",
- am_daemon ? "daemon " : "",
- who_am_i());
- rprintf(FINFO, " arena: %10d (bytes from sbrk)\n", mi.arena);
- rprintf(FINFO, " ordblks: %10d (chunks not in use)\n", mi.ordblks);
- rprintf(FINFO, " smblks: %10d\n", mi.smblks);
- rprintf(FINFO, " hblks: %10d (chunks from mmap)\n", mi.hblks);
- rprintf(FINFO, " hblkhd: %10d (bytes from mmap)\n", mi.hblkhd);
- rprintf(FINFO, " allmem: %10d (bytes from sbrk + mmap)\n",
- mi.arena + mi.hblkhd);
- rprintf(FINFO, " usmblks: %10d\n", mi.usmblks);
- rprintf(FINFO, " fsmblks: %10d\n", mi.fsmblks);
- rprintf(FINFO, " uordblks: %10d (bytes used)\n", mi.uordblks);
- rprintf(FINFO, " fordblks: %10d (bytes free)\n", mi.fordblks);
- rprintf(FINFO, " keepcost: %10d (bytes in releasable chunk)\n", mi.keepcost);
+ getpid(), am_server ? "server " : "",
+ am_daemon ? "daemon " : "", who_am_i());
+ rprintf(FINFO, " arena: %10ld (bytes from sbrk)\n",
+ (long)mi.arena);
+ rprintf(FINFO, " ordblks: %10ld (chunks not in use)\n",
+ (long)mi.ordblks);
+ rprintf(FINFO, " smblks: %10ld\n",
+ (long)mi.smblks);
+ rprintf(FINFO, " hblks: %10ld (chunks from mmap)\n",
+ (long)mi.hblks);
+ rprintf(FINFO, " hblkhd: %10ld (bytes from mmap)\n",
+ (long)mi.hblkhd);
+ rprintf(FINFO, " allmem: %10ld (bytes from sbrk + mmap)\n",
+ (long)mi.arena + mi.hblkhd);
+ rprintf(FINFO, " usmblks: %10ld\n",
+ (long)mi.usmblks);
+ rprintf(FINFO, " fsmblks: %10ld\n",
+ (long)mi.fsmblks);
+ rprintf(FINFO, " uordblks: %10ld (bytes used)\n",
+ (long)mi.uordblks);
+ rprintf(FINFO, " fordblks: %10ld (bytes free)\n",
+ (long)mi.fordblks);
+ rprintf(FINFO, " keepcost: %10ld (bytes in releasable chunk)\n",
+ (long)mi.keepcost);
#endif /* HAVE_MALLINFO */
}
argv[i] += l+1;
}
- if (argc == 0 && recurse) {
+ if (argc == 0 && (recurse || list_only)) {
argc = 1;
argv--;
argv[0] = ".";
int pid;
int status = 0;
int error_pipe[2], name_pipe[2];
- BOOL need_name_pipe = basis_dir[0] && !dry_run;
+ BOOL need_name_pipe = (basis_dir[0] || partial_dir) && !dry_run;
/* The receiving side mustn't obey this, or an existing symlink that
* points to an identical file won't be replaced by the referent. */
if (preserve_hard_links)
init_hard_links(flist);
- if (!delete_after) {
- /* I moved this here from recv_files() to prevent a race condition */
- if (recurse && delete_mode && !local_name && flist->count > 0)
- delete_files(flist);
+ if (delete_before && !local_name && flist->count > 0) {
+ /* Moved here from recv_files() to prevent a race condition */
+ delete_files(flist);
}
if (fd_pair(error_pipe) < 0
generate_files(f_out, flist, local_name, name_pipe[1]);
- get_redo_num(); /* Read final MSG_DONE and any prior messages. */
report(-1);
io_flush(FULL_FLUSH);
if (protocol_version >= 24) {
io_start_buffering_in();
if (delete_mode && !delete_excluded)
- recv_exclude_list(f_in);
+ recv_filter_list(f_in);
+ if (cvs_exclude && protocol_version < 29)
+ add_filter(&filter_list, ":C", 0);
if (filesfrom_fd >= 0) {
/* We need to send the files-from names to the sender at the
if (am_sender) {
keep_dirlinks = 0; /* Must be disabled on the sender. */
- recv_exclude_list(f_in);
+ recv_filter_list(f_in);
if (cvs_exclude)
add_cvs_excludes();
do_server_sender(f_in, f_out, argc, argv);
char *local_name = NULL;
cleanup_child_pid = pid;
- if (read_batch) {
- assert(am_sender == 0);
- } else {
+ if (!read_batch) {
set_nonblocking(f_in);
set_nonblocking(f_out);
}
if (cvs_exclude)
add_cvs_excludes();
if (delete_mode && !delete_excluded)
- send_exclude_list(f_out);
+ send_filter_list(f_out);
if (remote_filesfrom_file)
filesfrom_fd = f_in;
}
if (argc == 0)
- list_only = 1;
+ list_only |= 1;
if (!read_batch)
- send_exclude_list(f_out);
+ send_filter_list(f_out);
+ if (cvs_exclude)
+ add_cvs_excludes();
if (filesfrom_fd >= 0) {
io_set_filesfrom_fds(filesfrom_fd, f_out);
}
/* ... or no dest at all */
- if (!am_sender && argc == 0) {
- list_only = 1;
- }
+ if (!am_sender && argc == 0)
+ list_only |= 1;
pid = do_cmd(shell_cmd,shell_machine,shell_user,shell_path,
&f_in,&f_out);