X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/08a740ff436a4c0dc1aa53d671f6f14b8bf2348a..0e9480317dbb5b8003535a769f4a03bc720d5f5f:/main.c diff --git a/main.c b/main.c index a103ff31..4052ea98 100644 --- a/main.c +++ b/main.c @@ -2,7 +2,7 @@ Copyright (C) 1996-2001 by Andrew Tridgell Copyright (C) Paul Mackerras 1996 - Copyright (C) 2001 by Martin Pool + Copyright (C) 2001, 2002 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 @@ -27,6 +27,7 @@ struct stats stats; extern int verbose; +static void show_malloc_stats(void); /**************************************************************************** wait for a process to exit, calling io_flush while waiting @@ -56,6 +57,12 @@ static void report(int f) extern int remote_version; int send_stats; + if (do_stats) { + /* These come out from every process */ + show_malloc_stats(); + show_flist_stats(); + } + if (am_daemon) { log_exit(0, __FILE__, __LINE__); if (f == -1 || !am_sender) return; @@ -126,6 +133,38 @@ static void report(int f) } +/** + * If our C library can get malloc statistics, then show them to FINFO + **/ +static void show_malloc_stats(void) +{ +#ifdef HAVE_MALLINFO + struct mallinfo mi; + extern int am_server; + extern int am_sender; + extern int am_daemon; + + mi = mallinfo(); + + rprintf(FINFO, RSYNC_NAME "[%d] (%s%s%s) heap statistics:\n", + getpid(), + am_server ? "server " : "", + am_daemon ? "daemon " : "", + am_sender ? "sender" : "receiver"); + rprintf(FINFO, " arena: %10d (bytes from sbrk)\n", mi.arena); + rprintf(FINFO, " ordblks: %10d (chunks not in use)\n", mi.ordblks); + rprintf(FINFO, " smblks: %10d\n", mi.smblks); + rprintf(FINFO, " hblks: %10d (chunks from mmap)\n", mi.hblks); + rprintf(FINFO, " hblkhd: %10d (bytes from mmap)\n", mi.hblkhd); + rprintf(FINFO, " usmblks: %10d\n", mi.usmblks); + rprintf(FINFO, " fsmblks: %10d\n", mi.fsmblks); + rprintf(FINFO, " uordblks: %10d (bytes used)\n", mi.uordblks); + rprintf(FINFO, " fordblks: %10d (bytes free)\n", mi.fordblks); + rprintf(FINFO, " keepcost: %10d (bytes in releasable chunk)\n", mi.keepcost); +#endif /* HAVE_MALLINFO */ +} + + /* Start the remote shell. cmd may be NULL to use the default. */ static pid_t do_cmd(char *cmd,char *machine,char *user,char *path,int *f_in,int *f_out) { @@ -583,6 +622,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 +657,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 +690,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 +700,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++; @@ -744,8 +804,10 @@ int main(int argc,char *argv[]) extern int write_batch; /* dw */ extern char *batch_ext; /* dw */ int orig_argc; /* dw */ + char **orig_argv; orig_argc = argc; /* dw */ + orig_argv = argv; signal(SIGUSR1, sigusr1_handler); signal(SIGUSR2, sigusr2_handler); @@ -785,7 +847,7 @@ int main(int argc,char *argv[]) if (write_batch) { /* dw */ create_batch_file_ext(); - write_batch_argvs_file(orig_argc, argc, argv); + write_batch_argvs_file(orig_argc, orig_argv); } if (read_batch) { /* dw */