*/
#include "rsync.h"
+#include "inums.h"
extern int dry_run;
extern int list_only;
extern int do_xfers;
extern int link_dest;
extern int preserve_acls;
+extern int preserve_xattrs;
extern int make_backups;
extern int protocol_version;
extern int remove_source_files;
extern int stdout_format_has_i;
extern int maybe_ATTRS_REPORT;
extern int unsort_ndx;
-extern char *basis_dir[];
-extern struct file_list *cur_flist, *first_flist;
+extern char *basis_dir[MAX_BASIS_DIRS+1];
+extern struct file_list *cur_flist;
#ifdef SUPPORT_HARD_LINKS
if (DEBUG_GTE(HLINK, 3)) {
rprintf(FINFO,
"[%s] created hashtable for dev %s\n",
- who_am_i(), big_num(dev, 0));
+ who_am_i(), big_num(dev));
}
}
} else
if (inc_recurse) {
node = hashtable_find(prior_hlinks, gnum, 1);
if (!node->data) {
- node->data = new_array0(char, 5);
+ if (!(node->data = new_array0(char, 5)))
+ out_of_memory("match_gnums");
assert(gnum >= hlink_flist->ndx_start);
file->flags |= FLAG_HLINK_FIRST;
prev = -1;
} else if (CVAL(node->data, 0) == 0) {
struct file_list *flist;
prev = IVAL(node->data, 1);
- flist = flist_for_ndx(prev);
+ flist = flist_for_ndx(prev, NULL);
if (flist)
flist->files[prev - flist->ndx_start]->flags &= ~FLAG_HLINK_LAST;
else {
while (1) {
struct file_list *flist;
if (prev_ndx < 0
- || (flist = flist_for_ndx(prev_ndx)) == NULL)
+ || (flist = flist_for_ndx(prev_ndx, NULL)) == NULL)
break;
fp = flist->files[prev_ndx - flist->ndx_start];
if (!(fp->flags & FLAG_SKIP_HLINK)) {
int j = 0;
#ifdef SUPPORT_ACLS
alt_sx.acc_acl = alt_sx.def_acl = NULL;
+#endif
+#ifdef SUPPORT_XATTRS
+ alt_sx.xattr = NULL;
#endif
do {
pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
sxp->st = alt_sx.st;
#ifdef SUPPORT_ACLS
if (preserve_acls && !S_ISLNK(file->mode)) {
- if (!ACL_READY(*sxp))
+ free_acl(sxp);
+ if (!ACL_READY(alt_sx))
get_acl(cmpbuf, sxp);
else {
sxp->acc_acl = alt_sx.acc_acl;
sxp->def_acl = alt_sx.def_acl;
+ alt_sx.acc_acl = alt_sx.def_acl = NULL;
}
}
#endif
- }
+#ifdef SUPPORT_XATTRS
+ if (preserve_xattrs) {
+ free_xattr(sxp);
+ if (!XATTR_READY(alt_sx))
+ get_xattr(cmpbuf, sxp);
+ else {
+ sxp->xattr = alt_sx.xattr;
+ alt_sx.xattr = NULL;
+ }
+ }
+#endif
+ } else {
#ifdef SUPPORT_ACLS
- else if (preserve_acls)
- free_acl(&alt_sx);
+ if (preserve_acls)
+ free_acl(&alt_sx);
+#endif
+#ifdef SUPPORT_XATTRS
+ if (preserve_xattrs)
+ free_xattr(&alt_sx);
#endif
+ }
}
if (maybe_hard_link(file, ndx, fname, statret, sxp, prev_name, &prev_st,
#ifdef SUPPORT_ACLS
prev_sx.acc_acl = prev_sx.def_acl = NULL;
#endif
+#ifdef SUPPORT_XATTRS
+ prev_sx.xattr = NULL;
+#endif
while ((ndx = prev_ndx) >= 0) {
int val;
- flist = flist_for_ndx(ndx);
- if (flist == NULL) {
- int start1 = first_flist ? first_flist->ndx_start : 0;
- int start2 = first_flist ? first_flist->prev->ndx_start : 0;
- int used = first_flist ? first_flist->prev->used : 0;
- rprintf(FERROR,
- "File index not found: %d (%d - %d)\n",
- ndx, start1 - 1, start2 + used - 1);
- exit_cleanup(RERR_PROTOCOL);
- }
+ flist = flist_for_ndx(ndx, "finish_hard_link");
file = flist->files[ndx - flist->ndx_start];
file->flags = (file->flags & ~FLAG_HLINK_FIRST) | FLAG_HLINK_DONE;
prev_ndx = F_HL_PREV(file);
#ifdef SUPPORT_ACLS
if (preserve_acls)
free_acl(&prev_sx);
+#endif
+#ifdef SUPPORT_XATTRS
+ if (preserve_xattrs)
+ free_xattr(&prev_sx);
#endif
if (val < 0)
continue;