int io_error;
int checksum_len;
+dev_t filesystem_dev; /* used to implement -x */
+unsigned int file_struct_len;
static char empty_sum[MD4_SUM_LENGTH];
static int flist_count_offset;
-static unsigned int file_struct_len;
static void clean_flist(struct file_list *flist, int strip_root, int no_dups);
static void output_flist(struct file_list *flist);
memset(bp, 0, file_struct_len);
bp += file_struct_len;
- file->flags = 0;
file->modtime = modtime;
file->length = file_length;
file->mode = mode;
in_del_hier = recurse;
del_hier_name_len = file->dir.depth == 0 ? 0 : l1 + l2;
if (relative_paths && del_hier_name_len > 2
- && basename_len == 1+1 && *basename == '.')
+ && lastname[del_hier_name_len-1] == '.'
+ && lastname[del_hier_name_len-2] == '/')
del_hier_name_len -= 2;
file->flags |= FLAG_TOP_DIR | FLAG_DEL_HERE;
} else if (in_del_hier) {
if (!relative_paths || !del_hier_name_len
|| (l1 >= del_hier_name_len
- && thisname[del_hier_name_len] == '/'))
+ && lastname[del_hier_name_len] == '/'))
file->flags |= FLAG_DEL_HERE;
else
in_del_hier = 0;
/* 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))
}
}
+ 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);
* without causing a compatibility problem with older versions. */
clean_flist(flist, 0, 0);
- /* Now send the uid/gid list. This was introduced in
- * protocol version 15 */
send_uid_list(f);
/* send the io_error flag */
clean_flist(flist, relative_paths, 1);
if (f >= 0) {
- /* Now send the uid/gid list. This was introduced in
- * protocol version 15 */
recv_uid_list(f, flist);
/* Recv the io_error flag */