Copyright (C) 1996-2001 by Andrew Tridgell <tridge@samba.org>
Copyright (C) Paul Mackerras 1996
+ Copyright (C) 2001, 2002 by Martin Pool <mbp@samba.org>
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
extern int verbose;
+static void show_malloc_stats(void);
/****************************************************************************
wait for a process to exit, calling io_flush while waiting
extern int remote_version;
int send_stats;
+ if (do_stats) {
+ /* These come out from every process */
+ show_malloc_stats();
+ }
+
if (am_daemon) {
log_exit(0, __FILE__, __LINE__);
if (f == -1 || !am_sender) return;
}
+/**
+ * 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)
{
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)
}
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);
}
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);
}
}
+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,
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;
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) {
am_sender = 0;
*p = 0;
- shell_machine = argv0;
+ shell_machine = argv[0];
shell_path = p+1;
argc--;
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 */