Improvments by Matt for the --progress option, including updating
[rsync/rsync.git] / flist.c
diff --git a/flist.c b/flist.c
index 3c6cb4c..979090e 100644 (file)
--- a/flist.c
+++ b/flist.c
@@ -37,7 +37,6 @@ extern int numeric_ids;
 extern int recurse;
 extern int xfer_dirs;
 extern int filesfrom_fd;
-extern int curr_dir_depth;
 extern int one_file_system;
 extern int copy_dirlinks;
 extern int keep_dirlinks;
@@ -91,15 +90,15 @@ static int show_filelist_p(void)
 
 static void start_filelist_progress(char *kind)
 {
-       rprintf(FINFO, "%s ... ", kind);
+       rprintf(FCLIENT, "%s ... ", kind);
        if (verbose > 1 || do_progress)
-               rprintf(FINFO, "\n");
+               rprintf(FCLIENT, "\n");
        rflush(FINFO);
 }
 
 static void emit_filelist_progress(int count)
 {
-       rprintf(FINFO, " %d files...\r", count);
+       rprintf(FCLIENT, " %d files...\r", count);
 }
 
 static void maybe_emit_filelist_progress(int count)
@@ -283,7 +282,7 @@ void flist_expand(struct file_list *flist)
                                flist->malloced);
 
        if (verbose >= 2 && flist->malloced != FLIST_START) {
-               rprintf(FINFO, "[%s] expand file_list to %.0f bytes, did%s move\n",
+               rprintf(FCLIENT, "[%s] expand file_list to %.0f bytes, did%s move\n",
                    who_am_i(),
                    (double)sizeof flist->files[0] * flist->malloced,
                    (new_ptr == flist->files) ? " not" : "");
@@ -315,7 +314,7 @@ static void send_file_entry(struct file_struct *file, int f)
        if (!file) {
                write_byte(f, 0);
                modtime = 0, mode = 0;
-               dev = 0, rdev = makedev(0, 0);
+               dev = 0, rdev = MAKEDEV(0, 0);
                rdev_major = 0;
                uid = 0, gid = 0;
                *lastname = '\0';
@@ -347,7 +346,7 @@ static void send_file_entry(struct file_struct *file, int f)
                                flags |= XMIT_RDEV_MINOR_IS_SMALL;
                }
        } else if (protocol_version < 28)
-               rdev = makedev(0, 0);
+               rdev = MAKEDEV(0, 0);
        if (file->uid == uid)
                flags |= XMIT_SAME_UID;
        else
@@ -498,7 +497,7 @@ static struct file_struct *receive_file_entry(struct file_list *flist,
 
        if (!flist) {
                modtime = 0, mode = 0;
-               dev = 0, rdev = makedev(0, 0);
+               dev = 0, rdev = MAKEDEV(0, 0);
                rdev_major = 0;
                uid = 0, gid = 0;
                *lastname = '\0';
@@ -575,10 +574,10 @@ static struct file_struct *receive_file_entry(struct file_list *flist,
                                rdev_minor = read_byte(f);
                        else
                                rdev_minor = read_int(f);
-                       rdev = makedev(rdev_major, rdev_minor);
+                       rdev = MAKEDEV(rdev_major, rdev_minor);
                }
        } else if (protocol_version < 28)
-               rdev = makedev(0, 0);
+               rdev = MAKEDEV(0, 0);
 
 #ifdef SUPPORT_LINKS
        if (preserve_links && S_ISLNK(mode)) {
@@ -656,6 +655,8 @@ static struct file_struct *receive_file_entry(struct file_list *flist,
        if (linkname_len) {
                file->u.link = bp;
                read_sbuf(f, bp, linkname_len - 1);
+               if (lp_munge_symlinks(module_id))
+                       sanitize_path(bp, bp, "", lastdir_depth, NULL);
                bp += linkname_len;
        }
 #endif
@@ -1059,6 +1060,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
        int64 start_write;
        int use_ff_fd = 0;
 
+       rprintf(FLOG, "building file list\n");
        if (show_filelist_p())
                start_filelist_progress("building file list");
 
@@ -1069,6 +1071,8 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
 
        io_start_buffering_out();
        if (filesfrom_fd >= 0) {
+               if (sanitize_paths)
+                       die_on_unsafe_path(argv[0], 0);
                if (argv[0] && !push_dir(argv[0])) {
                        rsyserr(FERROR, errno, "push_dir %s failed",
                                full_fname(argv[0]));
@@ -1122,6 +1126,8 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
                                   && (len == 1 || fbuf[len-2] == '/');
                }
 
+               if (sanitize_paths)
+                       die_on_unsafe_path(fbuf, 1);
                if (link_stat(fbuf, &st, copy_dirlinks) != 0) {
                        io_error |= IOERR_GENERAL;
                        rsyserr(FERROR, errno, "link_stat %s failed",
@@ -1179,6 +1185,8 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
                                } else
                                        break;
                        }
+                       if (len == 1 && fn[0] == '/')
+                               fn[len++] = '.';
                        fn[len] = '\0';
                        /* Reject a ".." dir in the active part of the path. */
                        for (p = fn; (p = strstr(p, "..")) != NULL; p += 2) {
@@ -1325,6 +1333,7 @@ struct file_list *recv_file_list(int f)
        unsigned short flags;
        int64 start_read;
 
+       rprintf(FLOG, "receiving file list\n");
        if (show_filelist_p())
                start_filelist_progress("receiving file list");