Split code out into separate files and remove some global variables to
[rsync/rsync.git] / flist.c
diff --git a/flist.c b/flist.c
index 9c35d36..3d0ff53 100644 (file)
--- a/flist.c
+++ b/flist.c
@@ -83,22 +83,31 @@ static void start_filelist_progress(char *kind)
        rflush(FINFO);
 }
 
+
 static void emit_filelist_progress(const struct file_list *flist)
 {
        rprintf(FINFO, " %d files...\r", flist->count);
 }
 
 
+static void maybe_emit_filelist_progress(const struct file_list *flist)
+{
+       if (do_progress && show_filelist_p() && ((flist->count % 100) == 0))
+               emit_filelist_progress(flist);
+}
+
+
 static void finish_filelist_progress(const struct file_list *flist)
 {
        if (do_progress) {
                /* This overwrites the progress line */
-               rprintf(FINFO, "%d files to consider\n", flist->count);
-       } else
+               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 */
@@ -183,6 +192,13 @@ static void list_file_entry(struct file_struct *f)
 }
 
 
+/**
+ * Stat either a symlink or its referent, depending on the settings of
+ * copy_links, copy_unsafe_links, etc.
+ *
+ * @return -1 on error; or 0.  If a symlink, then @p Linkbuf (of size
+ * MAXPATHLEN) contains the symlink target.
+ **/
 int readlink_stat(const char *Path, STRUCT_STAT * Buffer, char *Linkbuf)
 {
 #if SUPPORT_LINKS
@@ -293,7 +309,10 @@ static void flist_expand(struct file_list *flist)
 
                new_bytes = sizeof(flist->files[0]) * flist->malloced;
                
-               new_ptr = realloc(flist->files, new_bytes);
+               if (flist->files)
+                       new_ptr = realloc(flist->files, new_bytes);
+               else
+                       new_ptr = malloc(new_bytes);
 
                if (verbose >= 2) {
                        rprintf(FINFO, "expand file_list to %.0f bytes, did%s move\n",
@@ -594,7 +613,21 @@ static int skip_filesystem(char *fname, STRUCT_STAT * st)
 /* IRIX cc cares that the operands to the ternary have the same type. */
 #define MALLOC(ap, i)  (ap ? (void*) string_area_malloc(ap, i) : malloc(i))
 
-/* create a file_struct for a named file */
+/**
+ * Create a file_struct for a named file by reading its stat()
+ * information and performing extensive checks against global
+ * options.
+ *
+ * @return the new file, or NULL if there was an error or this file
+ * should be excluded.
+ *
+ * @todo There is a small optimization opportunity here to avoid
+ * stat()ing the file in some circumstances, which has a certain cost.
+ * We are called immediately after doing readdir(), and so we may
+ * already know the d_type of the file.  We could for example avoid
+ * statting directories if we're not recursing, but this is not a very
+ * important case.  Some systems may not have d_type.
+ **/
 struct file_struct *make_file(int f, char *fname, struct string_area **ap,
                              int noexcludes)
 {
@@ -740,8 +773,7 @@ void send_file_name(int f, struct file_list *flist, char *fname,
        if (!file)
                return;
 
-       if (do_progress && show_filelist_p() && ((flist->count % 100) == 0))
-               emit_filelist_progress(flist);
+       maybe_emit_filelist_progress(flist);
 
        flist_expand(flist);
 
@@ -963,8 +995,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
                send_file_entry(NULL, f, 0);
        }
 
-       if (show_filelist_p())
+       if (show_filelist_p() && f != -1) {
                finish_filelist_progress(flist);
+       }
 
        clean_flist(flist, 0);
 
@@ -1032,8 +1065,7 @@ struct file_list *recv_file_list(int f)
 
                flist->count++;
 
-               if (do_progress && show_filelist_p() && ((flist->count % 100) == 0))
-                       emit_filelist_progress(flist);
+               maybe_emit_filelist_progress(flist);
 
                if (verbose > 2)
                        rprintf(FINFO, "recv_file_name(%s)\n",