- 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 d680f15..d4963b1 100644 (file)
--- a/main.c
+++ b/main.c
@@ -293,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;
@@ -306,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
@@ -365,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) {
@@ -437,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++;
@@ -948,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 ... */
@@ -988,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))