X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/bd6abc4939621c455f931905f0530115eb8c443c..f05f993eb72937bbd446a4758b7f0232de764889:/flist.c diff --git a/flist.c b/flist.c index a9bfb551..22f688d1 100644 --- a/flist.c +++ b/flist.c @@ -31,6 +31,7 @@ extern struct stats stats; extern int verbose; extern int do_progress; +extern int am_root; extern int am_server; extern int always_checksum; extern int module_id; @@ -766,13 +767,12 @@ struct file_struct *make_file(char *fname, int exclude_level) return NULL; } - if (one_file_system && st.st_dev != filesystem_dev) { - /* We allow a directory though to preserve the mount point. - * However, flag it so that we don't recurse. */ - if (!S_ISDIR(st.st_mode)) - return NULL; + /* 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 && st.st_dev != filesystem_dev + && S_ISDIR(st.st_mode)) flags |= FLAG_MOUNT_POINT; - } if (check_exclude_file(thisname, S_ISDIR(st.st_mode) != 0, exclude_level)) return NULL; @@ -808,18 +808,22 @@ struct file_struct *make_file(char *fname, int exclude_level) linkname_len = 0; #endif - idev_len = 0; #if SUPPORT_HARD_LINKS - if (preserve_hard_links && st.st_nlink > 1) { + if (preserve_hard_links) { if (protocol_version < 28) { if (S_ISREG(st.st_mode)) idev_len = sizeof (struct idev); + else + idev_len = 0; } else { - if (!S_ISDIR(st.st_mode)) + if (!S_ISDIR(st.st_mode) && st.st_nlink > 1) idev_len = sizeof (struct idev); + else + idev_len = 0; } - } + } else #endif + idev_len = 0; sum_len = always_checksum && S_ISREG(st.st_mode) ? MD4_SUM_LENGTH : 0; file_struct_len = idev_len? sizeof file[0] : min_file_struct_len; @@ -1430,13 +1434,20 @@ static void clean_flist(struct file_list *flist, int strip_root, int no_dups) return; for (i = 0; i < flist->count; i++) { - rprintf(FINFO, "[%s] i=%d %s %s %s mode=0%o len=%.0f\n", - who_am_i(), i, - NS(flist->files[i]->basedir), - NS(flist->files[i]->dirname), - NS(flist->files[i]->basename), - (int) flist->files[i]->mode, - (double) flist->files[i]->length); + char uidbuf[16], gidbuf[16]; + struct file_struct *file = flist->files[i]; + if (am_root && preserve_uid) + sprintf(uidbuf, " uid=%ld", (long)file->uid); + else + *uidbuf = '\0'; + if (preserve_gid) + sprintf(gidbuf, " gid=%ld", (long)file->gid); + else + *gidbuf = '\0'; + rprintf(FINFO, "[%s] i=%d %s %s %s mode=0%o len=%.0f%s%s\n", + who_am_i(), i, NS(file->basedir), NS(file->dirname), + NS(file->basename), (int) file->mode, + (double) file->length, uidbuf, gidbuf); } }