summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compat.c11
-rw-r--r--flist.c7
-rw-r--r--options.c3
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;
@@ -248,6 +251,9 @@ void setup_protocol(int f_out,int f_in)
#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
compat_flags = read_byte(f_in);
@@ -262,6 +268,11 @@ void setup_protocol(int f_out,int f_in)
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. */
fprintf(stderr,
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
@@ -2245,6 +2245,9 @@ void server_options(char **args, int *argc_p)
#if defined HAVE_LUTIMES && defined HAVE_UTIMES
argstr[x++] = 'L';
#endif
+#ifdef ICONV_OPTION
+ argstr[x++] = 's';
+#endif
}
if (x >= (int)sizeof argstr) { /* Not possible... */