+ }
+
+ if (dry_run) {
++ if (f_nameout >= 0)
++ write(f_nameout, "", 1);
+ write_int(f_out,i);
+ return;
+ }
+
+ if (disable_deltas_p()) {
++ if (f_nameout >= 0)
++ write(f_nameout, "", 1);
+ write_int(f_out,i);
+ write_sum_head(f_out, NULL);
+ return;
+@@ -516,6 +625,8 @@ static void recv_generator(char *fname,
+ /* pretend the file didn't exist */
+ if (preserve_hard_links && hard_link_check(file, HL_SKIP))
+ return;
++ if (f_nameout >= 0)
++ write(f_nameout, "", 1);
+ write_int(f_out,i);
+ write_sum_head(f_out, NULL);
+ return;
+@@ -534,6 +645,8 @@ static void recv_generator(char *fname,
+ if (verbose > 2)
+ rprintf(FINFO, "generating and sending sums for %d\n", i);
+
++ if (f_nameout >= 0)
++ write(f_nameout, fnamecmpbuf, strlen(fnamecmpbuf) + 1);
+ write_int(f_out,i);
+ generate_and_send_sums(mapbuf, st.st_size, f_out);
+
+@@ -543,10 +656,11 @@ static void recv_generator(char *fname,
+ }
+
+
+-void generate_files(int f, struct file_list *flist, char *local_name)
++void generate_files(int f, struct file_list *flist, char *local_name,
++ int f_nameout)
+ {
+ int i;
+- int phase=0;
++ int phase = 0;
+ char fbuf[MAXPATHLEN];
+
+ if (verbose > 2) {
+@@ -584,7 +698,7 @@ void generate_files(int f, struct file_l
+ }
+
+ recv_generator(local_name ? local_name : f_name_to(file, fbuf),
+- file, i, f);
++ file, i, f, f_nameout);
+ }
+
+ phase++;
+@@ -601,7 +715,7 @@ void generate_files(int f, struct file_l
+ while ((i = get_redo_num()) != -1) {
+ struct file_struct *file = flist->files[i];
+ recv_generator(local_name ? local_name : f_name_to(file, fbuf),
+- file, i, f);
++ file, i, f, f_nameout);
+ }
+
+ phase++;
+@@ -620,7 +734,7 @@ void generate_files(int f, struct file_l
+ if (!file->basename || !S_ISDIR(file->mode))
+ continue;
+ recv_generator(local_name ? local_name : f_name(file),
+- file, i, -1);
++ file, i, -1, -1);
+ }
+
+ if (verbose > 2)
+--- main.c 28 Jun 2004 17:45:40 -0000 1.201
++++ main.c 30 Jun 2004 07:35:57 -0000
+@@ -428,8 +428,8 @@ static void do_server_sender(int f_in, i
+ static int do_recv(int f_in,int f_out,struct file_list *flist,char *local_name)
+ {
+ int pid;
+- int status=0;
+- int error_pipe[2];
++ int status = 0;
++ int error_pipe[2], name_pipe[2];
+
+ if (preserve_hard_links)
+ init_hard_links(flist);
+@@ -441,17 +441,19 @@ static int do_recv(int f_in,int f_out,st
+ }
+ }
+
+- if (fd_pair(error_pipe) < 0) {
+- rprintf(FERROR,"error pipe failed in do_recv\n");
++ if (fd_pair(error_pipe) < 0 || fd_pair(name_pipe) < 0) {
++ rprintf(FERROR, "fd_pair() failed in do_recv\n");
+ exit_cleanup(RERR_SOCKETIO);
+ }
+
+ io_flush(NORMAL_FLUSH);
+
+- if ((pid=do_fork()) == 0) {
++ if ((pid = do_fork()) == 0) {
+ close(error_pipe[0]);
++ close(name_pipe[1]);
+ if (f_in != f_out)
+ close(f_out);
++ set_blocking(name_pipe[0]);
+
+ /* we can't let two processes write to the socket at one time */
+ io_multiplexing_close();
+@@ -459,7 +461,7 @@ static int do_recv(int f_in,int f_out,st
+ /* set place to send errors */
+ set_msg_fd_out(error_pipe[1]);
+
+- recv_files(f_in,flist,local_name);
++ recv_files(f_in, flist, local_name, name_pipe[0]);
+ io_flush(FULL_FLUSH);
+ report(f_in);
+
+@@ -475,14 +477,16 @@ static int do_recv(int f_in,int f_out,st
+ am_generator = 1;
+
+ close(error_pipe[1]);
++ close(name_pipe[0]);
+ if (f_in != f_out)
+ close(f_in);
++ set_blocking(name_pipe[1]);
+
+ io_start_buffering_out(f_out);
+
+ set_msg_fd_in(error_pipe[0]);
+
+- generate_files(f_out, flist, local_name);
++ generate_files(f_out, flist, local_name, name_pipe[1]);
+
+ get_redo_num(); /* Read final MSG_DONE and any prior messages. */
+ report(-1);