X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/97dde6b6200aa0a3333e4f821e24dd5f0f91ec75..cb197514d99d17dc3a1ce26ff8918d63307d75e4:/xattrs.c diff --git a/xattrs.c b/xattrs.c index 85341b37..b9034751 100644 --- a/xattrs.c +++ b/xattrs.c @@ -3,7 +3,7 @@ * Written by Jay Fenlason, vaguely based on the ACLs patch. * * Copyright (C) 2004 Red Hat, Inc. - * Copyright (C) 2006-2008 Wayne Davison + * Copyright (C) 2006-2009 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ #include "rsync.h" #include "ifuncs.h" +#include "inums.h" #include "lib/sysxattrs.h" #ifdef SUPPORT_XATTRS @@ -81,6 +82,8 @@ static char *namebuf = NULL; static item_list empty_xattr = EMPTY_ITEM_LIST; static item_list rsync_xal_l = EMPTY_ITEM_LIST; +static size_t prior_xattr_count = (size_t)-1; + /* ------------------------------------------------------------------------- */ static void rsync_xal_free(item_list *xalp) @@ -114,7 +117,7 @@ static int rsync_xal_compare_names(const void *x1, const void *x2) static ssize_t get_xattr_names(const char *fname) { ssize_t list_len; - double arg; + int64 arg; if (!namebuf) { namebuf_len = 1024; @@ -132,11 +135,11 @@ static ssize_t get_xattr_names(const char *fname) } else if (errno == ENOTSUP) return 0; else if (errno != ERANGE) { - arg = (double)namebuf_len; + arg = namebuf_len; got_error: rsyserr(FERROR_XFER, errno, - "get_xattr_names: llistxattr(\"%s\",%.0f) failed", - fname, arg); + "get_xattr_names: llistxattr(\"%s\",%s) failed", + fname, big_num(arg)); return -1; } list_len = sys_llistxattr(fname, NULL, 0); @@ -724,13 +727,15 @@ void receive_xattr(struct file_struct *file, int f) /* Turn the xattr data in stat_x into cached xattr data, setting the index * values in the file struct. */ -void cache_xattr(struct file_struct *file, stat_x *sxp) +void cache_tmp_xattr(struct file_struct *file, stat_x *sxp) { int ndx; if (!sxp->xattr) return; + if (prior_xattr_count == (size_t)-1) + prior_xattr_count = rsync_xal_l.count; ndx = find_matching_xattr(sxp->xattr); if (ndx < 0) rsync_xal_store(sxp->xattr); /* adds item to rsync_xal_l */ @@ -738,6 +743,21 @@ void cache_xattr(struct file_struct *file, stat_x *sxp) F_XATTR(file) = ndx; } +void uncache_tmp_xattrs(void) +{ + if (prior_xattr_count != (size_t)-1) { + item_list *xattr_item = rsync_xal_l.items; + item_list *xattr_start = xattr_item + prior_xattr_count; + xattr_item += rsync_xal_l.count; + rsync_xal_l.count = prior_xattr_count; + while (xattr_item-- > xattr_start) { + rsync_xal_free(xattr_item); + free(xattr_item); + } + prior_xattr_count = (size_t)-1; + } +} + static int rsync_xal_set(const char *fname, item_list *xalp, const char *fnamecmp, stat_x *sxp) {