Improved rwrite() to handle a stderr exception without playing games
[rsync/rsync.git] / main.c
diff --git a/main.c b/main.c
index 939004a..dc3c533 100644 (file)
--- a/main.c
+++ b/main.c
@@ -32,7 +32,6 @@ 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 inc_recurse;
 extern int blocking_io;
@@ -43,6 +42,7 @@ extern int output_needs_newline;
 extern int need_messages_from_generator;
 extern int kluge_around_eof;
 extern int got_xfer_error;
+extern int msgs2stderr;
 extern int module_id;
 extern int copy_links;
 extern int copy_dirlinks;
@@ -64,8 +64,11 @@ extern int whole_file;
 extern int read_batch;
 extern int write_batch;
 extern int batch_fd;
+extern int flist_eof;
 extern int filesfrom_fd;
+extern int delete_during;
 extern int connect_timeout;
+extern int check_for_io_err;
 extern pid_t cleanup_child_pid;
 extern unsigned int module_dirlen;
 extern struct stats stats;
@@ -74,16 +77,17 @@ extern char *logfile_format;
 extern char *filesfrom_host;
 extern char *partial_dir;
 extern char *dest_option;
-extern char *basis_dir[];
 extern char *rsync_path;
 extern char *shell_cmd;
 extern char *batch_name;
 extern char *password_file;
 extern char curr_dir[MAXPATHLEN];
+extern char *basis_dir[MAX_BASIS_DIRS+1];
 extern struct file_list *first_flist;
 extern struct filter_list_struct daemon_filter_list;
 
 uid_t our_uid;
+int am_generator = 0;
 int local_server = 0;
 int daemon_over_rsh = 0;
 mode_t orig_umask = 0;
@@ -764,6 +768,8 @@ static int do_recv(int f_in, int f_out, char *local_name)
                exit_cleanup(RERR_IPC);
        }
 
+       check_for_io_err = inc_recurse && delete_during && !flist_eof;
+
        if (pid == 0) {
                close(error_pipe[0]);
                if (f_in != f_out)
@@ -860,7 +866,7 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[])
        char *local_name = NULL;
        int negated_levels;
 
-       if (filesfrom_fd >= 0) {
+       if (filesfrom_fd >= 0 && !msgs2stderr) {
                /* We can't mix messages with files-from data on the socket,
                 * so temporarily turn off info/debug messages. */
                negate_output_levels();