Call renamed cmp_time() function (was cmp_modtime()).
[rsync/rsync.git] / rsync.c
diff --git a/rsync.c b/rsync.c
index 6d1ee8f..aa9eabe 100644 (file)
--- a/rsync.c
+++ b/rsync.c
    process */
 
 #include "rsync.h"
+#if defined HAVE_ICONV_OPEN && defined HAVE_ICONV_H
+#include <iconv.h>
+#endif
+#if defined HAVE_LIBCHARSET_H && defined HAVE_LOCALE_CHARSET
+#include <libcharset.h>
+#elif defined HAVE_LANGINFO_H && defined HAVE_NL_LANGINFO
+#include <langinfo.h>
+#endif
 
 extern int verbose;
 extern int dry_run;
@@ -35,6 +43,7 @@ extern int am_server;
 extern int am_sender;
 extern int am_generator;
 extern int am_starting_up;
+extern int allow_8bit_chars;
 extern int preserve_uid;
 extern int preserve_gid;
 extern int inplace;
@@ -42,6 +51,43 @@ extern int keep_dirlinks;
 extern int make_backups;
 extern struct stats stats;
 
+#if defined HAVE_ICONV_OPEN && defined HAVE_ICONV_H
+iconv_t ic_chck = (iconv_t)-1;
+
+static const char *default_charset(void)
+{
+#if defined HAVE_LIBCHARSET_H && defined HAVE_LOCALE_CHARSET
+       return locale_charset();
+#elif defined HAVE_LANGINFO_H && defined HAVE_NL_LANGINFO
+       return nl_langinfo(CODESET);
+#else
+       return ""; /* Works with (at the very least) gnu iconv... */
+#endif
+}
+
+void setup_iconv()
+{
+       if (!am_server && !allow_8bit_chars) {
+               const char *defset = default_charset();
+
+               /* It's OK if this fails... */
+               ic_chck = iconv_open(defset, defset);
+
+               if (verbose > 3) {
+                       if (ic_chck == (iconv_t)-1) {
+                               rprintf(FINFO,
+                                       "note: iconv_open(\"%s\", \"%s\") failed (%d)"
+                                       " -- using isprint() instead of iconv().\n",
+                                       defset, defset, errno);
+                       } else {
+                               rprintf(FINFO,
+                                       "note: iconv_open(\"%s\", \"%s\") succeeded.\n",
+                                       defset, defset);
+                       }
+               }
+       }
+}
+#endif
 
 /*
   free a sums struct
@@ -100,7 +146,7 @@ int set_file_attrs(char *fname, struct file_struct *file, STRUCT_STAT *st,
        if (!preserve_times || (S_ISDIR(st->st_mode) && omit_dir_times))
                flags |= ATTRS_SKIP_MTIME;
        if (!(flags & ATTRS_SKIP_MTIME)
-           && cmp_modtime(st->st_mtime, file->modtime) != 0) {
+           && cmp_time(st->st_mtime, file->modtime) != 0) {
                int ret = set_modtime(fname, file->modtime, st->st_mode);
                if (ret < 0) {
                        rsyserr(FERROR, errno, "failed to set times on %s",