+extern int verbose;
+extern int dry_run;
+extern int list_only;
+extern int am_root;
+extern int am_server;
+extern int am_sender;
+extern int am_generator;
+extern int am_daemon;
+extern int blocking_io;
+extern int remove_sent_files;
+extern int daemon_over_rsh;
+extern int need_messages_from_generator;
+extern int kluge_around_eof;
+extern int do_stats;
+extern int log_got_error;
+extern int module_id;
+extern int orig_umask;
+extern int copy_links;
+extern int keep_dirlinks;
+extern int preserve_hard_links;
+extern int protocol_version;
+extern int recurse;
+extern int fuzzy_basis;
+extern int relative_paths;
+extern int rsync_port;
+extern int inplace;
+extern int make_backups;
+extern int whole_file;
+extern int read_batch;
+extern int write_batch;
+extern int batch_fd;
+extern int batch_gen_fd;
+extern int filesfrom_fd;
+extern pid_t cleanup_child_pid;
+extern struct stats stats;
+extern char *files_from;
+extern char *remote_filesfrom_file;
+extern char *partial_dir;
+extern char *basis_dir[];
+extern char *rsync_path;
+extern char *shell_cmd;
+extern char *batch_name;
+
+int local_server = 0;
+
+/* There's probably never more than at most 2 outstanding child processes,
+ * but set it higher, just in case. */
+#define MAXCHILDPROCS 5
+
+struct pid_status {
+ pid_t pid;
+ int status;
+} pid_stat_table[MAXCHILDPROCS];
+
+static void show_malloc_stats(void);
+
+/****************************************************************************
+wait for a process to exit, calling io_flush while waiting
+****************************************************************************/
+void wait_process(pid_t pid, int *status)
+{
+ pid_t waited_pid;
+ int cnt;