From 91fd15b8b654a3be886069510d85064d59ca5dc7 Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Sat, 2 Aug 2008 07:06:15 -0700 Subject: [PATCH] Skip new symlink conversion step if the remote rsync is not new enough to do symlink content conversions. --- compat.c | 11 +++++++++++ flist.c | 7 ++++--- options.c | 3 +++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/compat.c b/compat.c index 811f6ec3..212f927f 100644 --- a/compat.c +++ b/compat.c @@ -56,12 +56,14 @@ extern struct filter_list_struct filter_list; extern int need_unsorted_flist; #ifdef ICONV_OPTION extern iconv_t ic_send, ic_recv; +extern char *iconv_opt; #endif /* These index values are for the file-list's extra-attribute array. */ int uid_ndx, gid_ndx, acls_ndx, xattrs_ndx, unsort_ndx; int receiver_symlink_times = 0; /* receiver can set the time on a symlink */ +int sender_symlink_iconv = 0; /* sender should convert symlink content */ #ifdef ICONV_OPTION int filesfrom_convert = 0; @@ -69,6 +71,7 @@ int filesfrom_convert = 0; #define CF_INC_RECURSE (1<<0) #define CF_SYMLINK_TIMES (1<<1) +#define CF_SYMLINK_ICONV (1<<2) static const char *client_info; @@ -247,6 +250,9 @@ void setup_protocol(int f_out,int f_in) compat_flags = allow_inc_recurse ? CF_INC_RECURSE : 0; #if defined HAVE_LUTIMES && defined HAVE_UTIMES compat_flags |= CF_SYMLINK_TIMES; +#endif +#ifdef ICONV_OPTION + compat_flags |= CF_SYMLINK_ICONV; #endif write_byte(f_out, compat_flags); } else @@ -261,6 +267,11 @@ void setup_protocol(int f_out,int f_in) #if defined HAVE_LUTIMES && defined HAVE_UTIMES else receiver_symlink_times = 1; +#endif +#ifdef ICONV_OPTION + sender_symlink_iconv = iconv_opt && (am_server + ? strchr(client_info, 's') != NULL + : !!(compat_flags & CF_SYMLINK_ICONV)); #endif if (inc_recurse && !allow_inc_recurse) { /* This should only be able to happen in a batch. */ diff --git a/flist.c b/flist.c index 5e5fe64e..41035ff2 100644 --- a/flist.c +++ b/flist.c @@ -65,6 +65,7 @@ extern int protocol_version; extern int sanitize_paths; extern int munge_symlinks; extern int need_unsorted_flist; +extern int sender_symlink_iconv; extern int output_needs_newline; extern int sender_keeps_checksum; extern int unsort_ndx; @@ -840,7 +841,7 @@ static struct file_struct *recv_file_entry(struct file_list *flist, /* We don't know how much extra room we need to convert * the as-yet-unread symlink name when converting it, * so let's hope that a double-size buffer is plenty. */ - if (ic_recv != (iconv_t)-1) + if (sender_symlink_iconv) linkname_len = linkname_len * 2 + 1; #endif if (munge_symlinks) @@ -984,7 +985,7 @@ static struct file_struct *recv_file_entry(struct file_list *flist, linkname_len -= SYMLINK_PREFIX_LEN; } #ifdef ICONV_OPTION - if (ic_recv != (iconv_t)-1) { + if (sender_symlink_iconv) { xbuf outbuf, inbuf; alloc_len = linkname_len; @@ -1422,7 +1423,7 @@ static struct file_struct *send_file_name(int f, struct file_list *flist, fbuf[outbuf.len] = '\0'; #ifdef SUPPORT_LINKS - if (symlink_len) { + if (symlink_len && sender_symlink_iconv) { INIT_XBUF(inbuf, (char*)symlink_name, symlink_len, (size_t)-1); INIT_CONST_XBUF(outbuf, symlink_buf); if (iconvbufs(ic_send, &inbuf, &outbuf, 0) < 0) { diff --git a/options.c b/options.c index f47c633e..11860cbc 100644 --- a/options.c +++ b/options.c @@ -2244,6 +2244,9 @@ void server_options(char **args, int *argc_p) argstr[x++] = 'i'; #if defined HAVE_LUTIMES && defined HAVE_UTIMES argstr[x++] = 'L'; +#endif +#ifdef ICONV_OPTION + argstr[x++] = 's'; #endif } -- 2.34.1