Fixed a couple iconv loops to properly handle incomplete chars
[rsync/rsync.git] / compat.c
index 212f927..d7e90be 100644 (file)
--- a/compat.c
+++ b/compat.c
@@ -3,7 +3,7 @@
  *
  * Copyright (C) Andrew Tridgell 1996
  * Copyright (C) Paul Mackerras 1996
- * Copyright (C) 2004-2008 Wayne Davison
+ * Copyright (C) 2004-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
@@ -27,6 +27,8 @@ int inc_recurse = 0;
 
 extern int am_server;
 extern int am_sender;
+extern int am_daemon;
+extern int io_timeout;
 extern int local_server;
 extern int inplace;
 extern int recurse;
@@ -52,7 +54,7 @@ extern char *partial_dir;
 extern char *dest_option;
 extern char *files_from;
 extern char *filesfrom_host;
-extern struct filter_list_struct filter_list;
+extern filter_rule_list filter_list;
 extern int need_unsorted_flist;
 #ifdef ICONV_OPTION
 extern iconv_t ic_send, ic_recv;
@@ -72,6 +74,7 @@ int filesfrom_convert = 0;
 #define CF_INC_RECURSE  (1<<0)
 #define CF_SYMLINK_TIMES (1<<1)
 #define CF_SYMLINK_ICONV (1<<2)
+#define CF_TIMEOUT_ACTIVE (1<<3)
 
 static const char *client_info;
 
@@ -248,15 +251,28 @@ void setup_protocol(int f_out,int f_in)
                int compat_flags;
                if (am_server) {
                        compat_flags = allow_inc_recurse ? CF_INC_RECURSE : 0;
-#if defined HAVE_LUTIMES && defined HAVE_UTIMES
+#ifdef CAN_SET_SYMLINK_TIMES
                        compat_flags |= CF_SYMLINK_TIMES;
 #endif
 #ifdef ICONV_OPTION
                        compat_flags |= CF_SYMLINK_ICONV;
 #endif
+                       if (am_daemon && io_timeout && protocol_version >= 31)
+                               compat_flags |= CF_TIMEOUT_ACTIVE;
                        write_byte(f_out, compat_flags);
-               } else
+                       if (compat_flags & CF_TIMEOUT_ACTIVE)
+                               write_varint(f_out, io_timeout);
+               } else {
                        compat_flags = read_byte(f_in);
+                       if (compat_flags & CF_TIMEOUT_ACTIVE) {
+                               int timeout = read_varint(f_in);
+                               if (!io_timeout || io_timeout > timeout) {
+                                       if (INFO_GTE(MISC, 2))
+                                               rprintf(FINFO, "Setting --timeout=%d to match server\n", timeout);
+                                       io_timeout = timeout;
+                               }
+                       }
+               }
                /* The inc_recurse var MUST be set to 0 or 1. */
                inc_recurse = compat_flags & CF_INC_RECURSE ? 1 : 0;
                if (am_sender) {
@@ -264,13 +280,13 @@ void setup_protocol(int f_out,int f_in)
                            ? strchr(client_info, 'L') != NULL
                            : !!(compat_flags & CF_SYMLINK_TIMES);
                }
-#if defined HAVE_LUTIMES && defined HAVE_UTIMES
+#ifdef CAN_SET_SYMLINK_TIMES
                else
                        receiver_symlink_times = 1;
 #endif
 #ifdef ICONV_OPTION
                sender_symlink_iconv = iconv_opt && (am_server
-                   ? strchr(client_info, 's') != NULL
+                   ? local_server || strchr(client_info, 's') != NULL
                    : !!(compat_flags & CF_SYMLINK_ICONV));
 #endif
                if (inc_recurse && !allow_inc_recurse) {
@@ -281,7 +297,7 @@ void setup_protocol(int f_out,int f_in)
                        exit_cleanup(RERR_SYNTAX);
                }
                need_messages_from_generator = 1;
-#if defined HAVE_LUTIMES && defined HAVE_UTIMES
+#ifdef CAN_SET_SYMLINK_TIMES
        } else if (!am_sender) {
                receiver_symlink_times = 1;
 #endif
@@ -291,10 +307,10 @@ void setup_protocol(int f_out,int f_in)
                unsort_ndx = ++file_extra_cnt;
 
        if (partial_dir && *partial_dir != '/' && (!am_server || local_server)) {
-               int flags = MATCHFLG_NO_PREFIXES | MATCHFLG_DIRECTORY;
+               int rflags = FILTRULE_NO_PREFIXES | FILTRULE_DIRECTORY;
                if (!am_sender || protocol_version >= 30)
-                       flags |= MATCHFLG_PERISHABLE;
-               parse_rule(&filter_list, partial_dir, flags, 0);
+                       rflags |= FILTRULE_PERISHABLE;
+               parse_filter_str(&filter_list, partial_dir, rule_template(rflags), 0);
        }