extern struct stats stats;
extern int verbose;
+extern int do_progress;
extern int am_server;
extern int always_checksum;
static void clean_flist(struct file_list *flist, int strip_root);
-static int show_build_progress_p(void)
+static int show_filelist_p(void)
{
- extern int do_progress;
+ return verbose && recurse && !am_server;
+}
- return do_progress && verbose && recurse && !am_server;
+static void start_filelist_progress(char *kind)
+{
+ rprintf(FINFO, "%s ... ", kind);
+ if ((verbose > 1) || do_progress)
+ rprintf(FINFO, "\n");
+ rflush(FINFO);
}
-/**
- * True if we're local, etc, and should emit progress emssages.
- **/
-static void emit_build_progress(const struct file_list *flist)
+
+static void emit_filelist_progress(const struct file_list *flist)
{
rprintf(FINFO, " %d files...\r", flist->count);
}
-static void finish_build_progress(const struct file_list *flist)
+static void maybe_emit_filelist_progress(const struct file_list *flist)
{
- if (verbose && recurse && !am_server) {
- /* This overwrites the progress line, if any. */
- rprintf(FINFO, RSYNC_NAME ": %d files to consider.\n",
- flist->count);
- }
+ 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 file%sto consider\n",
+ flist->count, flist->count == 1 ? " " : "s ");
+ } else {
+ rprintf(FINFO, "done\n");
+ }
+}
+
void show_flist_stats(void)
{
/* Nothing yet */
}
-int readlink_stat(const char *Path, STRUCT_STAT * Buffer, char *Linkbuf)
+/**
+ * Stat either a symlink or its referent, depending on the settings of
+ * copy_links, copy_unsafe_links, etc.
+ *
+ * @retval -1 on error
+ *
+ * @retval 0 for success
+ *
+ * @post If @p path is a symlink, then @p linkbuf (of size @c
+ * MAXPATHLEN) contains the symlink target.
+ *
+ * @post @p buffer contains information about the link or the
+ * referrent as appropriate, if they exist.
+ **/
+int readlink_stat(const char *path, STRUCT_STAT * buffer, char *linkbuf)
{
#if SUPPORT_LINKS
if (copy_links) {
- return do_stat(Path, Buffer);
+ return do_stat(path, buffer);
}
- if (do_lstat(Path, Buffer) == -1) {
+ if (do_lstat(path, buffer) == -1) {
return -1;
}
- if (S_ISLNK(Buffer->st_mode)) {
+ if (S_ISLNK(buffer->st_mode)) {
int l;
- if ((l =
- readlink((char *) Path, Linkbuf,
- MAXPATHLEN - 1)) == -1) {
+ l = readlink((char *) path, linkbuf, MAXPATHLEN - 1);
+ if (l == -1)
return -1;
- }
- Linkbuf[l] = 0;
+ linkbuf[l] = 0;
if (copy_unsafe_links && (topsrcname[0] != '\0') &&
- unsafe_symlink(Linkbuf, topsrcname)) {
- return do_stat(Path, Buffer);
+ unsafe_symlink(linkbuf, topsrcname)) {
+ return do_stat(path, buffer);
}
}
return 0;
#else
- return do_stat(Path, Buffer);
+ return do_stat(path, buffer);
#endif
}
-int link_stat(const char *Path, STRUCT_STAT * Buffer)
+int link_stat(const char *path, STRUCT_STAT * buffer)
{
#if SUPPORT_LINKS
if (copy_links) {
- return do_stat(Path, Buffer);
+ return do_stat(path, buffer);
} else {
- return do_lstat(Path, Buffer);
+ return do_lstat(path, buffer);
}
#else
- return do_stat(Path, Buffer);
+ return do_stat(path, buffer);
#endif
}
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, RSYNC_NAME ": expand file_list to %.0f bytes, did%s move\n",
+ rprintf(FINFO, "expand file_list to %.0f bytes, did%s move\n",
(double) new_bytes,
(new_ptr == flist->files) ? " not" : "");
}
unsigned char flags;
static time_t last_time;
static mode_t last_mode;
- static dev_t last_rdev;
+ static DEV64_T last_rdev;
static uid_t last_uid;
static gid_t last_gid;
static char lastname[MAXPATHLEN];
{
static time_t last_time;
static mode_t last_mode;
- static dev_t last_rdev;
+ static DEV64_T last_rdev;
static uid_t last_uid;
static gid_t last_gid;
static char lastname[MAXPATHLEN];
/* 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)
{
file->gid = st.st_gid;
file->dev = st.st_dev;
file->inode = st.st_ino;
-#ifdef HAVE_ST_RDEV
+#ifdef HAVE_STRUCT_STAT_ST_RDEV
file->rdev = st.st_rdev;
#endif
if (!file)
return;
- if (show_build_progress_p() & !(flist->count % 100))
- emit_build_progress(flist);
+ maybe_emit_filelist_progress(flist);
flist_expand(flist);
struct file_list *flist;
int64 start_write;
- if (verbose && recurse && !am_server && f != -1) {
- rprintf(FINFO, RSYNC_NAME ": building file list...\n");
- if (verbose > 1)
- rprintf(FINFO, "\n");
- rflush(FINFO);
- }
+ if (show_filelist_p() && f != -1)
+ start_filelist_progress("building file list");
start_write = stats.total_written;
send_file_entry(NULL, f, 0);
}
- finish_build_progress(flist);
+ if (show_filelist_p() && f != -1) {
+ finish_filelist_progress(flist);
+ }
clean_flist(flist, 0);
}
if (f != -1) {
- io_end_buffering(f);
+ io_end_buffering();
stats.flist_size = stats.total_written - start_write;
stats.num_files = flist->count;
if (write_batch) /* dw */
int64 start_read;
extern int list_only;
- if (verbose && recurse && !am_server) {
- rprintf(FINFO, "receiving file list ... ");
- rflush(FINFO);
- }
+ if (show_filelist_p())
+ start_filelist_progress("receiving file list");
start_read = stats.total_read;
flist->count++;
+ maybe_emit_filelist_progress(flist);
+
if (verbose > 2)
rprintf(FINFO, "recv_file_name(%s)\n",
f_name(flist->files[i]));
clean_flist(flist, relative_paths);
- if (verbose && recurse && !am_server) {
- rprintf(FINFO, "done\n");
+ if (show_filelist_p()) {
+ finish_filelist_progress(flist);
}
/* now recv the uid/gid list. This was introduced in protocol version 15 */