From: Wayne Davison Date: Sun, 22 Jan 2006 20:30:56 +0000 (+0000) Subject: New -x code had some problems, so restore the old code for now. X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/commitdiff_plain/535737bf39acb48354871d0d55e86d2ac580f0f7 New -x code had some problems, so restore the old code for now. --- diff --git a/flist.c b/flist.c index 61a6360d..64b0c23c 100644 --- a/flist.c +++ b/flist.c @@ -69,6 +69,7 @@ extern struct filter_list_struct server_filter_list; int io_error; int checksum_len; +dev_t filesystem_dev; /* used to implement -x */ static char empty_sum[MD4_SUM_LENGTH]; static int flist_count_offset; @@ -807,24 +808,16 @@ struct file_struct *make_file(char *fname, struct file_list *flist, /* We only care about directories because we need to avoid recursing * into a mount-point directory, not to avoid copying a symlinked * file if -L (or similar) was specified. */ - if (one_file_system && S_ISDIR(st.st_mode) && !(flags & FLAG_TOP_DIR)) { - STRUCT_STAT st2; - unsigned int len = strlcat(thisname, "/..", sizeof thisname); - /* If the directory's .. dir is on a different filesystem, - * either mark this dir as a mount-point or skip it. */ - if (len < sizeof thisname && do_stat(thisname, &st2) == 0 - && (st.st_dev != st2.st_dev || st.st_ino != st2.st_ino)) { - if (one_file_system > 1) { - if (verbose > 2) { - rprintf(FINFO, - "skipping mount-point dir %s\n", - thisname); - } - return NULL; + if (one_file_system && st.st_dev != filesystem_dev + && S_ISDIR(st.st_mode)) { + if (one_file_system > 1) { + if (verbose > 2) { + rprintf(FINFO, "skipping mount-point dir %s\n", + thisname); } - flags |= FLAG_MOUNT_POINT; + return NULL; } - thisname[len-3] = '\0'; + flags |= FLAG_MOUNT_POINT; } if (is_excluded(thisname, S_ISDIR(st.st_mode) != 0, filter_level)) @@ -1281,6 +1274,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) } } + if (one_file_system) + filesystem_dev = st.st_dev; + if (recurse || (xfer_dirs && is_dot_dir)) { struct file_struct *file; file = send_file_name(f, flist, fbuf, &st, FLAG_TOP_DIR);