X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/9cb20c605f2c4c9a0928496529ce318643536e1a..6500e0769a56919df1d47759828104a08df850bb:/xattrs.c diff --git a/xattrs.c b/xattrs.c index fcefebb5..3a7cb25b 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 @@ -139,7 +142,7 @@ static ssize_t get_xattr_names(const char *fname) got_error: rsyserr(FERROR_XFER, errno, "get_xattr_names: llistxattr(\"%s\",%s) failed", - fname, big_num(arg)); + full_fname(fname), big_num(arg)); return -1; } list_len = sys_llistxattr(fname, NULL, 0); @@ -175,7 +178,7 @@ static char *get_xattr_data(const char *fname, const char *name, size_t *len_ptr return NULL; rsyserr(FERROR_XFER, errno, "get_xattr_data: lgetxattr(\"%s\",\"%s\",0) failed", - fname, name); + full_fname(fname), name); return NULL; } @@ -192,11 +195,11 @@ static char *get_xattr_data(const char *fname, const char *name, size_t *len_ptr if (len == (size_t)-1) { rsyserr(FERROR_XFER, errno, "get_xattr_data: lgetxattr(\"%s\",\"%s\",%ld)" - " failed", fname, name, (long)datum_len); + " failed", full_fname(fname), name, (long)datum_len); } else { rprintf(FERROR_XFER, "get_xattr_data: lgetxattr(\"%s\",\"%s\",%ld)" - " returned %ld\n", fname, name, + " returned %ld\n", full_fname(fname), name, (long)datum_len, (long)len); } free(ptr); @@ -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); @@ -337,7 +346,7 @@ int copy_xattrs(const char *source, const char *dest) int save_errno = errno ? errno : EINVAL; rsyserr(FERROR_XFER, errno, "copy_xattrs: lsetxattr(\"%s\",\"%s\") failed", - dest, name); + full_fname(dest), name); errno = save_errno; return -1; } @@ -822,7 +831,7 @@ static int rsync_xal_set(const char *fname, item_list *xalp, else if (sys_lsetxattr(fname, name, ptr, len) < 0) { rsyserr(FERROR_XFER, errno, "rsync_xal_set: lsetxattr(\"%s\",\"%s\") failed", - fname, name); + full_fname(fname), name); ret = -1; } else /* make sure caller sets mtime */ sxp->st.st_mtime = (time_t)-1; @@ -843,7 +852,7 @@ static int rsync_xal_set(const char *fname, item_list *xalp, if (sys_lsetxattr(fname, name, rxas[i].datum, rxas[i].datum_len) < 0) { rsyserr(FERROR_XFER, errno, "rsync_xal_set: lsetxattr(\"%s\",\"%s\") failed", - fname, name); + full_fname(fname), name); ret = -1; } else /* make sure caller sets mtime */ sxp->st.st_mtime = (time_t)-1; @@ -873,7 +882,7 @@ static int rsync_xal_set(const char *fname, item_list *xalp, if (sys_lremovexattr(fname, name) < 0) { rsyserr(FERROR_XFER, errno, "rsync_xal_set: lremovexattr(\"%s\",\"%s\") failed", - fname, name); + full_fname(fname), name); ret = -1; } else /* make sure caller sets mtime */ sxp->st.st_mtime = (time_t)-1; @@ -935,7 +944,7 @@ int set_xattr_acl(const char *fname, int is_access_acl, const char *buf, size_t if (sys_lsetxattr(fname, name, buf, buf_len) < 0) { rsyserr(FERROR_XFER, errno, "set_xattr_acl: lsetxattr(\"%s\",\"%s\") failed", - fname, name); + full_fname(fname), name); return -1; } return 0;