X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/6902ed178ba54c8e1c410519f7ee576ddb42554c..d2094cc33dd87229f453176918e4ae2c2536f88e:/main.c diff --git a/main.c b/main.c index ec393527..c092bd23 100644 --- a/main.c +++ b/main.c @@ -2,6 +2,7 @@ Copyright (C) 1996-2001 by Andrew Tridgell Copyright (C) Paul Mackerras 1996 + Copyright (C) 2001 by Martin Pool This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -403,7 +404,6 @@ static void do_server_recv(int f_in, int f_out, int argc,char *argv[]) extern int module_id; extern int am_sender; extern int read_batch; /* dw */ - extern int write_batch; /* dw */ extern struct file_list *batch_flist; /* dw */ if (verbose > 2) @@ -529,7 +529,7 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) } if (pid != -1) { if (verbose > 3) - rprintf(FINFO,"client_run waiting on %d\n",pid); + rprintf(FINFO,"client_run waiting on %d\n", (int) pid); io_flush(); wait_process(pid, &status); } @@ -559,7 +559,7 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) if (pid != -1) { if (verbose > 3) - rprintf(FINFO,"client_run2 waiting on %d\n",pid); + rprintf(FINFO,"client_run2 waiting on %d\n", (int) pid); io_flush(); wait_process(pid, &status); } @@ -583,6 +583,22 @@ static char *find_colon(char *s) } +static int copy_argv (char *argv[]) +{ + int i; + + for (i = 0; argv[i]; i++) { + if (!(argv[i] = strdup(argv[i]))) { + rprintf (FERROR, "out of memory at %s(%d)\n", + __FILE__, __LINE__); + return RERR_MALLOC; + } + } + + return 0; +} + + /* * Start a client for either type of remote connection. Work out * whether the arguments request a remote shell or rsyncd connection, @@ -602,13 +618,18 @@ static int start_client(int argc, char *argv[]) extern char *shell_cmd; extern int rsync_port; extern int whole_file; - char *argv0 = strdup(argv[0]); extern int read_batch; + int rc; + + /* Don't clobber argv[] so that ps(1) can still show the right + command line. */ + if ((rc = copy_argv (argv))) + return rc; - if (strncasecmp(URL_PREFIX, argv0, strlen(URL_PREFIX)) == 0) { + if (strncasecmp(URL_PREFIX, argv[0], strlen(URL_PREFIX)) == 0) { char *host, *path; - host = argv0 + strlen(URL_PREFIX); + host = argv[0] + strlen(URL_PREFIX); p = strchr(host,'/'); if (p) { *p = 0; @@ -630,7 +651,7 @@ static int start_client(int argc, char *argv[]) if (p) { if (p[1] == ':') { *p = 0; - return start_socket_client(argv0, p+2, argc-1, argv+1); + return start_socket_client(argv[0], p+2, argc-1, argv+1); } if (argc < 1) { @@ -640,7 +661,7 @@ static int start_client(int argc, char *argv[]) am_sender = 0; *p = 0; - shell_machine = argv0; + shell_machine = argv[0]; shell_path = p+1; argc--; argv++; @@ -743,7 +764,6 @@ int main(int argc,char *argv[]) extern int read_batch; /* dw */ extern int write_batch; /* dw */ extern char *batch_ext; /* dw */ - int i; /* dw */ int orig_argc; /* dw */ orig_argc = argc; /* dw */