Changed rprintf() messages that started with a newline into two
[rsync/rsync.git] / main.c
diff --git a/main.c b/main.c
index 912d562..3e19095 100644 (file)
--- a/main.c
+++ b/main.c
@@ -62,10 +62,12 @@ extern int filesfrom_fd;
 extern pid_t cleanup_child_pid;
 extern struct stats stats;
 extern char *filesfrom_host;
+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 server_filter_list;
 
 int local_server = 0;
 mode_t orig_umask = 0;
@@ -174,7 +176,6 @@ static void handle_stats(int f)
                return;
 
        if (am_daemon) {
-               log_exit(0, __FILE__, __LINE__);
                if (f == -1 || !am_sender)
                        return;
        }
@@ -222,7 +223,8 @@ static void handle_stats(int f)
 static void output_summary(void)
 {
        if (do_stats) {
-               rprintf(FINFO,"\nNumber of files: %d\n", stats.num_files);
+               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",
@@ -249,8 +251,9 @@ static void output_summary(void)
        }
 
        if (verbose || do_stats) {
+               rprintf(FCLIENT, "\n");
                rprintf(FINFO,
-                       "\nsent %s bytes  received %s bytes  %s bytes/sec\n",
+                       "sent %s bytes  received %s bytes  %s bytes/sec\n",
                        human_num(total_written), human_num(total_read),
                        human_dnum((total_written + total_read)/(0.5 + (endtime - starttime)), 2));
                rprintf(FINFO, "total size is %s  speedup is %.2f\n",
@@ -273,7 +276,8 @@ static void show_malloc_stats(void)
 
        mi = mallinfo();
 
-       rprintf(FINFO, "\n" RSYNC_NAME "[%d] (%s%s%s) heap statistics:\n",
+       rprintf(FCLIENT, "\n");
+       rprintf(FINFO, RSYNC_NAME "[%d] (%s%s%s) heap statistics:\n",
                getpid(), am_server ? "server " : "",
                am_daemon ? "daemon " : "", who_am_i());
        rprintf(FINFO, "  arena:     %10ld   (bytes from sbrk)\n",
@@ -409,8 +413,8 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char *path,
 
        if (verbose > 3) {
                for (i = 0; i < argc; i++)
-                       rprintf(FINFO, "cmd[%d]=%s ", i, args[i]);
-               rprintf(FINFO, "\n");
+                       rprintf(FCLIENT, "cmd[%d]=%s ", i, args[i]);
+               rprintf(FCLIENT, "\n");
        }
 
        if (read_batch) {
@@ -805,8 +809,32 @@ static void do_server_recv(int f_in, int f_out, int argc,char *argv[])
         * we can sanitize the --link-/copy-/compare-dest args correctly. */
        if (sanitize_paths) {
                char **dir;
-               for (dir = basis_dir; *dir; dir++)
+               for (dir = basis_dir; *dir; dir++) {
                        *dir = sanitize_path(NULL, *dir, NULL, curr_dir_depth, NULL);
+                       die_on_unsafe_path(*dir, 0);
+               }
+               if (partial_dir) {
+                       partial_dir = sanitize_path(NULL, partial_dir, NULL, curr_dir_depth, NULL);
+                       /* A relative path gets this checked at every dir change. */
+                       if (*partial_dir == '/')
+                               die_on_unsafe_path(partial_dir, 0);
+               }
+       }
+       if (server_filter_list.head) {
+               char **dir;
+               struct filter_list_struct *elp = &server_filter_list;
+
+               for (dir = basis_dir; *dir; dir++) {
+                       if (check_filter(elp, *dir, 1) < 0)
+                               goto options_rejected;
+               }
+               if (partial_dir && *partial_dir == '/'
+                && check_filter(elp, partial_dir, 1) < 0) {
+                   options_rejected:
+                       rprintf(FERROR,
+                               "Your options have been rejected by the server.\n");
+                       exit_cleanup(RERR_SYNTAX);
+               }
        }
 
        exit_code = do_recv(f_in,f_out,flist,local_name);