X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/d48810ba5b0b8d09b272092a70da1255c2346ab8..6d56efa6ea66afa2e6f4eb79d9dd5f3b54b723c3:/main.c diff --git a/main.c b/main.c index 5985f808..73440865 100644 --- a/main.c +++ b/main.c @@ -27,7 +27,6 @@ #include #endif -extern int verbose; extern int dry_run; extern int list_only; extern int am_root; @@ -37,10 +36,11 @@ extern int am_generator; extern int am_daemon; extern int inc_recurse; extern int blocking_io; +extern int human_readable; extern int remove_source_files; +extern int output_needs_newline; extern int need_messages_from_generator; extern int kluge_around_eof; -extern int do_stats; extern int got_xfer_error; extern int module_id; extern int copy_links; @@ -183,7 +183,7 @@ static void handle_stats(int f) total_read = stats.total_read; total_written = stats.total_written; - if (do_stats && verbose > 1) { + if (INFO_GTE(STATS, 3)) { /* These come out from every process */ show_malloc_stats(); show_flist_stats(); @@ -239,21 +239,21 @@ static void handle_stats(int f) static void output_summary(void) { - if (do_stats) { + if (INFO_GTE(STATS, 2)) { rprintf(FCLIENT, "\n"); rprintf(FINFO,"Number of files: %d\n", stats.num_files); rprintf(FINFO,"Number of files transferred: %d\n", stats.num_transferred_files); rprintf(FINFO,"Total file size: %s bytes\n", - human_num(stats.total_size)); + big_num(stats.total_size, human_readable)); rprintf(FINFO,"Total transferred file size: %s bytes\n", - human_num(stats.total_transferred_size)); + big_num(stats.total_transferred_size, human_readable)); rprintf(FINFO,"Literal data: %s bytes\n", - human_num(stats.literal_data)); + big_num(stats.literal_data, human_readable)); rprintf(FINFO,"Matched data: %s bytes\n", - human_num(stats.matched_data)); + big_num(stats.matched_data, human_readable)); rprintf(FINFO,"File list size: %s\n", - human_num(stats.flist_size)); + big_num(stats.flist_size, human_readable)); if (stats.flist_buildtime) { rprintf(FINFO, "File list generation time: %.3f seconds\n", @@ -263,19 +263,20 @@ static void output_summary(void) (double)stats.flist_xfertime / 1000); } rprintf(FINFO,"Total bytes sent: %s\n", - human_num(total_written)); + big_num(total_written, human_readable)); rprintf(FINFO,"Total bytes received: %s\n", - human_num(total_read)); + big_num(total_read, human_readable)); } - if (verbose || do_stats) { + if (INFO_GTE(STATS, 1)) { rprintf(FCLIENT, "\n"); rprintf(FINFO, "sent %s bytes received %s bytes %s bytes/sec\n", - human_num(total_written), human_num(total_read), + big_num(total_written, human_readable), + big_num(total_read, human_readable), human_dnum((total_written + total_read)/(0.5 + (endtime - starttime)), 2)); rprintf(FINFO, "total size is %s speedup is %.2f%s\n", - human_num(stats.total_size), + big_num(stats.total_size, human_readable), (double)stats.total_size / (total_written+total_read), write_batch < 0 ? " (BATCH ONLY)" : dry_run ? " (DRY RUN)" : ""); } @@ -434,7 +435,7 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in args[argc] = NULL; - if (verbose > 3) { + if (DEBUG_GTE(CMD, 2)) { for (i = 0; i < argc; i++) rprintf(FCLIENT, "cmd[%d]=%s ", i, args[i]); rprintf(FCLIENT, "\n"); @@ -499,7 +500,7 @@ static char *get_local_name(struct file_list *flist, char *dest_path) int statret; char *cp; - if (verbose > 2) { + if (DEBUG_GTE(RECV, 1)) { rprintf(FINFO, "get_local_name count=%d %s\n", file_total, NS(dest_path)); } @@ -507,20 +508,29 @@ static char *get_local_name(struct file_list *flist, char *dest_path) if (!dest_path || list_only) return NULL; - if (daemon_filter_list.head - && (check_filter(&daemon_filter_list, dest_path, 0 != 0) < 0 - || check_filter(&daemon_filter_list, dest_path, 1 != 0) < 0)) { - rprintf(FERROR, "skipping daemon-excluded destination \"%s\"\n", - dest_path); - exit_cleanup(RERR_FILESELECT); + if (daemon_filter_list.head) { + char *slash = strrchr(dest_path, '/'); + if (slash && (slash[1] == '\0' || (slash[1] == '.' && slash[2] == '\0'))) + *slash = '\0'; + else + slash = NULL; + if ((*dest_path != '.' || dest_path[1] != '\0') + && (check_filter(&daemon_filter_list, FLOG, dest_path, 0) < 0 + || check_filter(&daemon_filter_list, FLOG, dest_path, 1) < 0)) { + rprintf(FERROR, "skipping daemon-excluded destination \"%s\"\n", + dest_path); + exit_cleanup(RERR_FILESELECT); + } + if (slash) + *slash = '/'; } /* See what currently exists at the destination. */ if ((statret = do_stat(dest_path, &st)) == 0) { /* If the destination is a dir, enter it and use mode 1. */ if (S_ISDIR(st.st_mode)) { - if (!push_dir(dest_path, 0)) { - rsyserr(FERROR, errno, "push_dir#1 %s failed", + if (!change_dir(dest_path, CD_NORMAL)) { + rsyserr(FERROR, errno, "change_dir#1 %s failed", full_fname(dest_path)); exit_cleanup(RERR_FILESELECT); } @@ -571,7 +581,7 @@ static char *get_local_name(struct file_list *flist, char *dest_path) && strcmp(flist->files[flist->low]->basename, ".") == 0) flist->files[0]->flags |= FLAG_DIR_CREATED; - if (verbose) + if (INFO_GTE(NAME, 1)) rprintf(FINFO, "created directory %s\n", dest_path); if (dry_run) { @@ -579,8 +589,8 @@ static char *get_local_name(struct file_list *flist, char *dest_path) dry_run++; } - if (!push_dir(dest_path, dry_run > 1)) { - rsyserr(FERROR, errno, "push_dir#2 %s failed", + if (!change_dir(dest_path, dry_run > 1 ? CD_SKIP_CHDIR : CD_NORMAL)) { + rsyserr(FERROR, errno, "change_dir#2 %s failed", full_fname(dest_path)); exit_cleanup(RERR_FILESELECT); } @@ -599,8 +609,8 @@ static char *get_local_name(struct file_list *flist, char *dest_path) dest_path = "/"; *cp = '\0'; - if (!push_dir(dest_path, 0)) { - rsyserr(FERROR, errno, "push_dir#3 %s failed", + if (!change_dir(dest_path, CD_NORMAL)) { + rsyserr(FERROR, errno, "change_dir#3 %s failed", full_fname(dest_path)); exit_cleanup(RERR_FILESELECT); } @@ -673,7 +683,7 @@ static void do_server_sender(int f_in, int f_out, int argc, char *argv[]) struct file_list *flist; char *dir = argv[0]; - if (verbose > 2) { + if (DEBUG_GTE(SEND, 1)) { rprintf(FINFO, "server_sender starting pid=%ld\n", (long)getpid()); } @@ -692,8 +702,8 @@ static void do_server_sender(int f_in, int f_out, int argc, char *argv[]) } if (!relative_paths) { - if (!push_dir(dir, 0)) { - rsyserr(FERROR, errno, "push_dir#3 %s failed", + if (!change_dir(dir, CD_NORMAL)) { + rsyserr(FERROR, errno, "change_dir#3 %s failed", full_fname(dir)); exit_cleanup(RERR_FILESELECT); } @@ -766,6 +776,11 @@ static int do_recv(int f_in, int f_out, char *local_name) io_flush(FULL_FLUSH); handle_stats(f_in); + if (output_needs_newline) { + fputc('\n', stdout); + output_needs_newline = 0; + } + send_msg(MSG_DONE, "", 1, 0); write_varlong(error_pipe[1], stats.total_read, 3); io_flush(FULL_FLUSH); @@ -839,15 +854,17 @@ 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; - int save_verbose = verbose; + int negated_levels; if (filesfrom_fd >= 0) { /* We can't mix messages with files-from data on the socket, - * so temporarily turn off verbose messages. */ - verbose = 0; - } + * so temporarily turn off info/debug messages. */ + negate_output_levels(); + negated_levels = 1; + } else + negated_levels = 0; - if (verbose > 2) { + if (DEBUG_GTE(RECV, 1)) { rprintf(FINFO, "server_recv(%d) starting pid=%ld\n", argc, (long)getpid()); } @@ -862,8 +879,8 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[]) char *dir = argv[0]; argc--; argv++; - if (!am_daemon && !push_dir(dir, 0)) { - rsyserr(FERROR, errno, "push_dir#4 %s failed", + if (!am_daemon && !change_dir(dir, CD_NORMAL)) { + rsyserr(FERROR, errno, "change_dir#4 %s failed", full_fname(dir)); exit_cleanup(RERR_FILESELECT); } @@ -892,7 +909,9 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[]) } if (inc_recurse && file_total == 1) recv_additional_file_list(f_in); - verbose = save_verbose; + + if (negated_levels) + negate_output_levels(); if (argc > 0) local_name = get_local_name(flist,argv[0]); @@ -916,11 +935,11 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[]) char *dir = *dir_p; if (*dir == '/') dir += module_dirlen; - if (check_filter(elp, dir, 1) < 0) + if (check_filter(elp, FLOG, dir, 1) < 0) goto options_rejected; } if (partial_dir && *partial_dir == '/' - && check_filter(elp, partial_dir + module_dirlen, 1) < 0) { + && check_filter(elp, FLOG, partial_dir + module_dirlen, 1) < 0) { options_rejected: rprintf(FERROR, "Your options have been rejected by the server.\n"); @@ -1008,7 +1027,7 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) start_write_batch(f_out); flist = send_file_list(f_out, argc, argv); set_msg_fd_in(-1); - if (verbose > 3) + if (DEBUG_GTE(FLIST, 3)) rprintf(FINFO,"file list sent\n"); if (protocol_version >= 23) @@ -1021,7 +1040,7 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) if (protocol_version >= 24) read_final_goodbye(f_in); if (pid != -1) { - if (verbose > 3) + if (DEBUG_GTE(EXIT, 2)) rprintf(FINFO,"client_run waiting on %d\n", (int) pid); io_flush(FULL_FLUSH); wait_process_with_flush(pid, &exit_code); @@ -1038,11 +1057,6 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) io_start_multiplex_out(); } - if (argc == 0) { - list_only |= 1; - xfer_dirs |= 1; - } - send_filter_list(read_batch ? -1 : f_out); if (filesfrom_fd >= 0) { @@ -1068,7 +1082,7 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) } if (pid != -1) { - if (verbose > 3) + if (DEBUG_GTE(RECV, 1)) rprintf(FINFO,"client_run2 waiting on %d\n", (int) pid); io_flush(FULL_FLUSH); wait_process_with_flush(pid, &exit_code); @@ -1153,8 +1167,6 @@ static int start_client(int argc, char *argv[]) static char *dotarg[1] = { "." }; p = dotarg[0]; remote_argv = dotarg; - list_only |= 1; - xfer_dirs |= 1; } remote_argc = 1; @@ -1226,10 +1238,6 @@ static int start_client(int argc, char *argv[]) } remote_argv[i] = arg; } - if (argc == 0) { - list_only |= 1; - xfer_dirs |= 1; - } } if (daemon_over_rsh < 0) @@ -1256,7 +1264,7 @@ static int start_client(int argc, char *argv[]) } } - if (verbose > 3) { + if (DEBUG_GTE(CMD, 2)) { rprintf(FINFO,"cmd=%s machine=%s user=%s path=%s\n", NS(shell_cmd), NS(shell_machine), NS(shell_user), remote_argv ? NS(remote_argv[0]) : ""); @@ -1439,11 +1447,11 @@ int main(int argc,char *argv[]) SIGACTION(SIGXFSZ, SIG_IGN); #endif - /* Initialize push_dir here because on some old systems getcwd + /* Initialize change_dir() here because on some old systems getcwd * (implemented by forking "pwd" and reading its output) doesn't * work when there are other child processes. Also, on all systems * that implement getcwd that way "pwd" can't be found after chroot. */ - push_dir(NULL, 0); + change_dir(NULL, CD_NORMAL); init_flist(); @@ -1467,7 +1475,6 @@ int main(int argc,char *argv[]) read_stream_flags(batch_fd); else write_stream_flags(batch_fd); - } if (write_batch < 0) dry_run = 1;