+void send_extra_file_list(int f, int at_least)
+{
+ char fbuf[MAXPATHLEN];
+ struct file_list *flist;
+ int64 start_write;
+ int future_cnt, save_io_error = io_error;
+
+ if (flist_eof)
+ return;
+
+ /* Keep sending data until we have the requested number of
+ * files in the upcoming file-lists. */
+ if (cur_flist->next) {
+ flist = first_flist->prev; /* the newest flist */
+ future_cnt = flist->count
+ + flist->ndx_start - cur_flist->next->ndx_start;
+ } else
+ future_cnt = 0;
+ while (future_cnt < at_least) {
+ struct file_struct *file = dir_flist->files[send_dir_ndx];
+ int32 *dp;
+ int dlen;
+
+ f_name(file, fbuf);
+ dlen = strlen(fbuf);
+
+ if (F_ROOTDIR(file) != flist_dir) {
+ if (!push_flist_dir(F_ROOTDIR(file), -1))
+ exit_cleanup(RERR_FILESELECT);
+ }
+
+ flist = flist_new(0, "send_extra_file_list");
+ start_write = stats.total_written;
+
+ write_ndx(f, NDX_FLIST_OFFSET - send_dir_ndx);
+ change_local_filter_dir(fbuf, dlen, send_dir_depth);
+ send_directory(f, flist, send_dir_ndx, fbuf, dlen, FLAG_DIVERT_DIRS | FLAG_XFER_DIR);
+ write_byte(f, 0);
+
+ clean_flist(flist, 0, 0);
+ file_total += flist->count;
+ future_cnt += flist->count;
+ stats.flist_size += stats.total_written - start_write;
+ stats.num_files += flist->count;
+ if (verbose > 3)
+ output_flist(flist);
+
+ dp = F_DIRNODE_P(file);
+ if (DIR_FIRST_CHILD(dp) >= 0) {
+ send_dir_ndx = DIR_FIRST_CHILD(dp);
+ send_dir_depth++;
+ } else {
+ while (DIR_NEXT_SIBLING(dp) < 0) {
+ if ((send_dir_ndx = DIR_PARENT(dp)) < 0) {
+ write_ndx(f, NDX_FLIST_EOF);
+ flist_eof = 1;
+ change_local_filter_dir(NULL, 0, 0);
+ goto finish;
+ }
+ send_dir_depth--;
+ file = dir_flist->files[send_dir_ndx];
+ dp = F_DIRNODE_P(file);
+ }
+ send_dir_ndx = DIR_NEXT_SIBLING(dp);
+ }
+ }
+
+ finish:
+ if (io_error != save_io_error && !ignore_errors)
+ send_msg_int(MSG_IO_ERROR, io_error);
+}
+