X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/14013906ca0ee2d226f0baba74811f60224c35e2..ddc5ae3d9e6cc632b93bac327b6f92d0545b0537:/xattrs.c diff --git a/xattrs.c b/xattrs.c index df1a2a1c..009da9b2 100644 --- a/xattrs.c +++ b/xattrs.c @@ -33,6 +33,9 @@ extern int am_generator; extern int read_only; extern int list_only; extern int preserve_xattrs; +extern int preserve_links; +extern int preserve_devices; +extern int preserve_specials; extern int checksum_seed; #define RSYNC_XAL_INITIAL 5 @@ -285,18 +288,24 @@ int get_xattr(const char *fname, stat_x *sxp) sxp->xattr = new(item_list); *sxp->xattr = empty_xattr; -#ifdef NO_SPECIAL_XATTRS - if (IS_SPECIAL(sxp->st.st_mode)) - return 0; + if (S_ISREG(sxp->st.st_mode) || S_ISDIR(sxp->st.st_mode)) { + /* Everyone supports this. */ + } else if (S_ISLNK(sxp->st.st_mode)) { +#ifndef NO_SYMLINK_XATTRS + if (!preserve_links) #endif -#ifdef NO_DEVICE_XATTRS - if (IS_DEVICE(sxp->st.st_mode)) - return 0; + return 0; + } else if (IS_SPECIAL(sxp->st.st_mode)) { +#ifndef NO_SPECIAL_XATTRS + if (!preserve_specials) #endif -#ifdef NO_SYMLINK_XATTRS - if (S_ISLNK(sxp->st.st_mode)) - return 0; + return 0; + } else if (IS_DEVICE(sxp->st.st_mode)) { +#ifndef NO_DEVICE_XATTRS + if (!preserve_devices) #endif + return 0; + } if (rsync_xal_get(fname, sxp->xattr) < 0) { free_xattr(sxp); @@ -449,9 +458,9 @@ int send_xattr(int f, stat_x *sxp) } /* Return a flag indicating if we need to change a file's xattrs. If - * "find_all" is specified, also mark any abbreviated xattrs that we + * "mark_needed" is specified, also mark any abbreviated xattrs that we * need so that send_xattr_request() can tell the sender about them. */ -int xattr_diff(struct file_struct *file, stat_x *sxp, int find_all) +int xattr_diff(struct file_struct *file, stat_x *sxp, BOOL mark_needed) { item_list *lst = rsync_xal_l.items; rsync_xa *snd_rxa, *rec_rxa; @@ -477,7 +486,8 @@ int xattr_diff(struct file_struct *file, stat_x *sxp, int find_all) /* If the count of the sender's xattrs is different from our * (receiver's) xattrs, the lists are not the same. */ if (snd_cnt != rec_cnt) { - if (!find_all) + if (!mark_needed) + /* We can return as soon as we find a difference. */ return 1; xattrs_equal = 0; } @@ -491,7 +501,7 @@ int xattr_diff(struct file_struct *file, stat_x *sxp, int find_all) && memcmp(snd_rxa->datum + 1, rec_rxa->datum + 1, MAX_DIGEST_LEN) == 0; /* Flag unrequested items that we need. */ - if (!same && find_all && snd_rxa->datum[0] == XSTATE_ABBREV) + if (!same && mark_needed && snd_rxa->datum[0] == XSTATE_ABBREV) snd_rxa->datum[0] = XSTATE_TODO; } else { same = cmp == 0 && snd_rxa->datum_len == rec_rxa->datum_len @@ -499,7 +509,7 @@ int xattr_diff(struct file_struct *file, stat_x *sxp, int find_all) snd_rxa->datum_len) == 0; } if (!same) { - if (!find_all) + if (!mark_needed) return 1; xattrs_equal = 0; }