aboutsummaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2005-12-14 22:00:01 +0000
committerWayne Davison <wayned@samba.org>2005-12-14 22:00:01 +0000
commit82f0c63e8a94fc095d9b9507ad963a411625a0c7 (patch)
tree7eede25a7fba4def11419164392ae4c752320065 /main.c
parent5d9530fe47241bf21435bd89f10981cde25f50f8 (diff)
downloadandroid_external_rsync-82f0c63e8a94fc095d9b9507ad963a411625a0c7.tar.gz
android_external_rsync-82f0c63e8a94fc095d9b9507ad963a411625a0c7.tar.bz2
android_external_rsync-82f0c63e8a94fc095d9b9507ad963a411625a0c7.zip
Parse single- and double-quotes in the --rsh/-e option (and RSYNC_RSH).
Diffstat (limited to 'main.c')
-rw-r--r--main.c38
1 files changed, 32 insertions, 6 deletions
diff --git a/main.c b/main.c
index d680f153..835a9cde 100644
--- 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, safe_fname(args[i]));
+ rprintf(FINFO, "\n");
}
if (read_batch) {