- We now filter all rwrite() output when it goes out to the terminal
[rsync/rsync.git] / main.c
diff --git a/main.c b/main.c
index 18156eb..d4963b1 100644 (file)
--- a/main.c
+++ b/main.c
@@ -45,7 +45,6 @@ extern int copy_links;
 extern int keep_dirlinks;
 extern int preserve_hard_links;
 extern int protocol_version;
-extern int always_checksum;
 extern int recurse;
 extern int relative_paths;
 extern int rsync_port;
@@ -61,10 +60,8 @@ extern char *filesfrom_host;
 extern char *rsync_path;
 extern char *shell_cmd;
 extern char *batch_name;
-extern char curr_dir[MAXPATHLEN];
 
 int local_server = 0;
-int pre_checksum = 0;
 struct file_list *the_file_list;
 
 /* There's probably never more than at most 2 outstanding child processes,
@@ -212,14 +209,14 @@ static void output_summary(void)
                rprintf(FINFO,"\nNumber of files: %d\n", stats.num_files);
                rprintf(FINFO,"Number of files transferred: %d\n",
                        stats.num_transferred_files);
-               rprintf(FINFO,"Total file size: %.0f bytes\n",
-                       (double)stats.total_size);
-               rprintf(FINFO,"Total transferred file size: %.0f bytes\n",
-                       (double)stats.total_transferred_size);
-               rprintf(FINFO,"Literal data: %.0f bytes\n",
-                       (double)stats.literal_data);
-               rprintf(FINFO,"Matched data: %.0f bytes\n",
-                       (double)stats.matched_data);
+               rprintf(FINFO,"Total file size: %s bytes\n",
+                       human_num(stats.total_size));
+               rprintf(FINFO,"Total transferred file size: %s bytes\n",
+                       human_num(stats.total_transferred_size));
+               rprintf(FINFO,"Literal data: %s bytes\n",
+                       human_num(stats.literal_data));
+               rprintf(FINFO,"Matched data: %s bytes\n",
+                       human_num(stats.matched_data));
                rprintf(FINFO,"File list size: %d\n", stats.flist_size);
                if (stats.flist_buildtime) {
                        rprintf(FINFO,
@@ -229,19 +226,19 @@ static void output_summary(void)
                                "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",
-                       (double)total_read);
+               rprintf(FINFO,"Total bytes sent: %s\n",
+                       human_num(total_written));
+               rprintf(FINFO,"Total bytes received: %s\n",
+                       human_num(total_read));
        }
 
        if (verbose || do_stats) {
                rprintf(FINFO,
-                       "\nsent %.0f bytes  received %.0f bytes  %.2f bytes/sec\n",
-                       (double)total_written, (double)total_read,
-                       (total_written + total_read)/(0.5 + (endtime - starttime)));
-               rprintf(FINFO, "total size is %.0f  speedup is %.2f\n",
-                       (double)stats.total_size,
+                       "\nsent %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",
+                       human_num(stats.total_size),
                        (double)stats.total_size / (total_written+total_read));
        }
 
@@ -296,10 +293,11 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char *path,
        int i, argc = 0;
        char *args[MAX_ARGS];
        pid_t ret;
-       char *tok, *dir = NULL;
+       char *dir = NULL;
        int dash_l_set = 0;
 
        if (!read_batch && !local_server) {
+               char *t, *f, in_quote = '\0';
                char *rsh_env = getenv(RSYNC_RSH_ENV);
                if (!cmd)
                        cmd = rsh_env;
@@ -309,13 +307,39 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char *path,
                if (!cmd)
                        goto oom;
 
-               for (tok = strtok(cmd, " "); tok; tok = strtok(NULL, " ")) {
+               for (t = f = cmd; *f; f++) {
+                       if (*f == ' ')
+                               continue;
                        /* Comparison leaves rooms for server_options(). */
                        if (argc >= MAX_ARGS - MAX_SERVER_ARGS) {
                                rprintf(FERROR, "internal: args[] overflowed in do_cmd()\n");
                                exit_cleanup(RERR_SYNTAX);
                        }
-                       args[argc++] = tok;
+                       args[argc++] = t;
+                       while (*f != ' ' || in_quote) {
+                               if (!*f) {
+                                       if (in_quote) {
+                                               rprintf(FERROR,
+                                                   "Missing trailing-%c in remote-shell command.\n",
+                                                   in_quote);
+                                               exit_cleanup(RERR_SYNTAX);
+                                       }
+                                       f--;
+                                       break;
+                               }
+                               if (*f == '\'' || *f == '"') {
+                                       if (!in_quote) {
+                                               in_quote = *f++;
+                                               continue;
+                                       }
+                                       if (*f == in_quote && *++f != in_quote) {
+                                               in_quote = '\0';
+                                               continue;
+                                       }
+                               }
+                               *t++ = *f++;
+                       }
+                       *t++ = '\0';
                }
 
                /* check to see if we've already been given '-l user' in
@@ -368,10 +392,9 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char *path,
        args[argc] = NULL;
 
        if (verbose > 3) {
-               rprintf(FINFO,"cmd=");
                for (i = 0; i < argc; i++)
-                       rprintf(FINFO, "%s ", safe_fname(args[i]));
-               rprintf(FINFO,"\n");
+                       rprintf(FINFO, "cmd[%d]=%s ", i, args[i]);
+               rprintf(FINFO, "\n");
        }
 
        if (read_batch) {
@@ -398,7 +421,7 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char *path,
 
        return ret;
 
-oom:
+  oom:
        out_of_memory("do_cmd");
        return 0; /* not reached */
 }
@@ -440,7 +463,7 @@ static char *get_local_name(struct file_list *flist,char *name)
                exit_cleanup(RERR_FILEIO);
        }
        if (verbose > 0)
-               rprintf(FINFO, "created directory %s\n", safe_fname(name));
+               rprintf(FINFO, "created directory %s\n", name);
 
        if (dry_run) {
                dry_run++;
@@ -636,7 +659,6 @@ static void do_server_recv(int f_in, int f_out, int argc,char *argv[])
        struct file_list *flist;
        char *local_name = NULL;
        char *dir = NULL;
-       char olddir[sizeof curr_dir];
        int save_verbose = verbose;
 
        if (filesfrom_fd >= 0) {
@@ -656,7 +678,6 @@ static void do_server_recv(int f_in, int f_out, int argc,char *argv[])
                return;
        }
 
-
        if (argc > 0) {
                dir = argv[0];
                argc--;
@@ -681,10 +702,6 @@ static void do_server_recv(int f_in, int f_out, int argc,char *argv[])
                filesfrom_fd = -1;
        }
 
-       strlcpy(olddir, curr_dir, sizeof olddir);
-       if (always_checksum && argc > 0)
-               pre_checksum = push_dir(argv[0]);
-
        flist = recv_file_list(f_in);
        verbose = save_verbose;
        if (!flist) {
@@ -693,9 +710,6 @@ static void do_server_recv(int f_in, int f_out, int argc,char *argv[])
        }
        the_file_list = flist;
 
-       if (pre_checksum)
-               pop_dir(olddir);
-
        if (argc > 0)
                local_name = get_local_name(flist,argv[0]);
 
@@ -744,7 +758,6 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[])
 {
        struct file_list *flist = NULL;
        int exit_code = 0, exit_code2 = 0;
-       char olddir[sizeof curr_dir];
        char *local_name = NULL;
 
        cleanup_child_pid = pid;
@@ -816,18 +829,11 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[])
                filesfrom_fd = -1;
        }
 
-       strlcpy(olddir, curr_dir, sizeof olddir);
-       if (always_checksum)
-               pre_checksum = push_dir(argv[0]);
-
        if (write_batch && !am_server)
                start_write_batch(f_in);
        flist = recv_file_list(f_in);
        the_file_list = flist;
 
-       if (pre_checksum)
-               pop_dir(olddir);
-
        if (flist && flist->count > 0) {
                local_name = get_local_name(flist, argv[0]);
 
@@ -968,10 +974,10 @@ static int start_client(int argc, char *argv[])
 
        if (verbose > 3) {
                rprintf(FINFO,"cmd=%s machine=%s user=%s path=%s\n",
-                       shell_cmd ? safe_fname(shell_cmd) : "",
-                       shell_machine ? safe_fname(shell_machine) : "",
-                       shell_user ? safe_fname(shell_user) : "",
-                       shell_path ? safe_fname(shell_path) : "");
+                       shell_cmd ? shell_cmd : "",
+                       shell_machine ? shell_machine : "",
+                       shell_user ? shell_user : "",
+                       shell_path ? shell_path : "");
        }
 
        /* for remote source, only single dest arg can remain ... */
@@ -1008,7 +1014,7 @@ static int start_client(int argc, char *argv[])
 
 static RETSIGTYPE sigusr1_handler(UNUSED(int val))
 {
-       exit_cleanup(RERR_SIGNAL);
+       exit_cleanup(RERR_SIGNAL1);
 }
 
 static RETSIGTYPE sigusr2_handler(UNUSED(int val))