Skip new symlink conversion step if the remote rsync is not
authorWayne Davison <wayned@samba.org>
Sat, 2 Aug 2008 14:06:15 +0000 (07:06 -0700)
committerWayne Davison <wayned@samba.org>
Sat, 2 Aug 2008 14:06:15 +0000 (07:06 -0700)
new enough to do symlink content conversions.

compat.c
flist.c
options.c

index 811f6ec..212f927 100644 (file)
--- 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 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 */
 #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;
 
 #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_INC_RECURSE  (1<<0)
 #define CF_SYMLINK_TIMES (1<<1)
+#define CF_SYMLINK_ICONV (1<<2)
 
 static const char *client_info;
 
 
 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;
                        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
 #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;
 #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. */
 #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 5e5fe64..41035ff 100644 (file)
--- 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 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;
 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. */
                /* 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)
                        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
                                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;
                                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
                        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) {
                                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) {
index f47c633..11860cb 100644 (file)
--- 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';
                        argstr[x++] = 'i';
 #if defined HAVE_LUTIMES && defined HAVE_UTIMES
                argstr[x++] = 'L';
+#endif
+#ifdef ICONV_OPTION
+               argstr[x++] = 's';
 #endif
        }
 
 #endif
        }