+/* The tmp_* vars are used as a cache area by make_file() to store data
+ * that the sender doesn't need to remember in its file list. The data
+ * will survive just long enough to be used by send_file_entry(). */
+static dev_t tmp_rdev;
+#ifdef SUPPORT_HARD_LINKS
+static int64 tmp_dev, tmp_ino;
+#endif
+static char tmp_sum[MD4_SUM_LENGTH];
+
+static char empty_sum[MD4_SUM_LENGTH];
+static int flist_count_offset; /* for --delete --progress */
+
+static void clean_flist(struct file_list *flist, int strip_root, int no_dups);
+static void output_flist(struct file_list *flist);
+
+void init_flist(void)
+{
+ if (verbose > 4) {
+ rprintf(FINFO, "FILE_STRUCT_LEN=%d, EXTRA_LEN=%d\n",
+ (int)FILE_STRUCT_LEN, (int)EXTRA_LEN);
+ }
+ checksum_len = protocol_version < 21 ? 2 : MD4_SUM_LENGTH;
+}
+
+static int show_filelist_p(void)
+{
+ return verbose && xfer_dirs && !am_server;
+}
+
+static void start_filelist_progress(char *kind)
+{
+ rprintf(FCLIENT, "%s ... ", kind);
+ if (verbose > 1 || do_progress)
+ rprintf(FCLIENT, "\n");
+ rflush(FINFO);
+}
+
+static void emit_filelist_progress(int count)
+{
+ rprintf(FCLIENT, " %d files...\r", count);
+}
+
+static void maybe_emit_filelist_progress(int count)
+{
+ if (do_progress && show_filelist_p() && (count % 100) == 0)
+ emit_filelist_progress(count);
+}
+
+static void finish_filelist_progress(const struct file_list *flist)
+{
+ if (do_progress) {
+ /* This overwrites the progress line */
+ rprintf(FINFO, "%d file%sto consider\n",
+ flist->count, flist->count == 1 ? " " : "s ");
+ } else
+ rprintf(FINFO, "done\n");
+}
+
+void show_flist_stats(void)
+{
+ /* Nothing yet */
+}
+
+static void list_file_entry(struct file_struct *f)
+{
+ char permbuf[PERMSTRING_SIZE];
+ double len;
+
+ if (!F_IS_ACTIVE(f)) {
+ /* this can happen if duplicate names were removed */
+ return;
+ }
+
+ permstring(permbuf, f->mode);
+ len = F_LENGTH(f);
+
+#ifdef SUPPORT_LINKS
+ if (preserve_links && S_ISLNK(f->mode)) {
+ rprintf(FINFO, "%s %11.0f %s %s -> %s\n",
+ permbuf, len, timestring(f->modtime),
+ f_name(f, NULL), F_SYMLINK(f));
+ } else
+#endif
+ {
+ rprintf(FINFO, "%s %11.0f %s %s\n",
+ permbuf, len, timestring(f->modtime),
+ f_name(f, NULL));
+ }
+}