The branch, master has been updated via 836e0c5 Create and use write_bigbuf() function for extra-large buffer sizes. via 2cd8708 Use chunked xattr reading in OS X sys_lgetxattr(). from eaa4e2d Fix itemize bug with --link-dest, -X, and -n.
;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 836e0c5df418a9fd0744e9101f05245322f8668a Author: Wayne Davison <way...@samba.org> Date: Mon Nov 25 13:12:35 2013 -0800 Create and use write_bigbuf() function for extra-large buffer sizes. commit 2cd87086f05d0a6d943e8fa71f7f6b53b5375d56 Author: Wayne Davison <way...@samba.org> Date: Mon Nov 25 13:12:09 2013 -0800 Use chunked xattr reading in OS X sys_lgetxattr(). ----------------------------------------------------------------------- Summary of changes: io.c | 13 +++++++++++++ lib/sysxattrs.c | 23 ++++++++++++++++++++++- xattrs.c | 4 ++-- 3 files changed, 37 insertions(+), 3 deletions(-) Changeset truncated at 500 lines: diff --git a/io.c b/io.c index c5b1ebc..264824e 100644 --- a/io.c +++ b/io.c @@ -2087,6 +2087,19 @@ void write_longint(int f, int64 x) #endif } +void write_bigbuf(int f, const char *buf, size_t len) +{ + size_t half_max = (iobuf.out.size - iobuf.out_empty_len) / 2; + + while (len > half_max + 1024) { + write_buf(f, buf, half_max); + buf += half_max; + len -= half_max; + } + + write_buf(f, buf, len); +} + void write_buf(int f, const char *buf, size_t len) { size_t pos, siz; diff --git a/lib/sysxattrs.c b/lib/sysxattrs.c index d55ee0c..ba1a290 100644 --- a/lib/sysxattrs.c +++ b/lib/sysxattrs.c @@ -24,6 +24,10 @@ #ifdef SUPPORT_XATTRS +#ifdef HAVE_OSX_XATTRS +#define GETXATTR_FETCH_LIMIT (64*1024*1024) +#endif + #if defined HAVE_LINUX_XATTRS ssize_t sys_lgetxattr(const char *path, const char *name, void *value, size_t size) @@ -55,7 +59,24 @@ ssize_t sys_llistxattr(const char *path, char *list, size_t size) ssize_t sys_lgetxattr(const char *path, const char *name, void *value, size_t size) { - return getxattr(path, name, value, size, 0, XATTR_NOFOLLOW); + ssize_t len = getxattr(path, name, value, size, 0, XATTR_NOFOLLOW); + + /* If we're retrieving data, handle resource forks > 64MB specially */ + if (value != NULL && len == GETXATTR_FETCH_LIMIT && (size_t)len < size) { + /* getxattr will only return 64MB of data at a time, need to call again with a new offset */ + u_int32_t offset = len; + size_t data_retrieved = len; + while (data_retrieved < size) { + len = getxattr(path, name, value + offset, size - data_retrieved, offset, XATTR_NOFOLLOW); + if (len <= 0) + break; + data_retrieved += len; + offset += (u_int32_t)len; + } + len = data_retrieved; + } + + return len; } ssize_t sys_fgetxattr(int filedes, const char *name, void *value, size_t size) diff --git a/xattrs.c b/xattrs.c index df2ea82..01d30e4 100644 --- a/xattrs.c +++ b/xattrs.c @@ -451,7 +451,7 @@ int send_xattr(int f, stat_x *sxp) if (rxa->datum_len > MAX_FULL_DATUM) write_buf(f, rxa->datum + 1, MAX_DIGEST_LEN); else - write_buf(f, rxa->datum, rxa->datum_len); + write_bigbuf(f, rxa->datum, rxa->datum_len); } ndx = rsync_xal_l.count; /* pre-incremented count */ rsync_xal_store(sxp->xattr); /* adds item to rsync_xal_l */ @@ -579,7 +579,7 @@ void send_xattr_request(const char *fname, struct file_struct *file, int f_out) } write_varint(f_out, len); /* length might have changed! */ - write_buf(f_out, ptr, len); + write_bigbuf(f_out, ptr, len); free(ptr); } } -- The rsync repository. _______________________________________________ rsync-cvs mailing list rsync-cvs@lists.samba.org https://lists.samba.org/mailman/listinfo/rsync-cvs