This patch adds a switch --fat-filenames which replaces all characters
that aren't legal on FAT filesystems with an underscore. This is the first
time I touch the rsync code, so I may not be going about it the right way,
but it seems to be working.

Naturally there's some potential for collisions, but it's probably better
than what happens currently (such files are simply not copied).
Alternatives could be to use a different character for each illegal character.

Not sure if this list allows attachments, or if this is the right place,
but here goes. It's a tiny patch at any rate.

-- 
Jonas Häggqvist
rasher(at)rasher(dot)dk
diff --git a/options.c b/options.c
index 8b67275..bfcb3e6 100644
--- a/options.c
+++ b/options.c
@@ -197,6 +197,7 @@ int need_unsorted_flist = 0;
 #ifdef ICONV_OPTION
 char *iconv_opt = ICONV_OPTION;
 #endif
+int fat_filenames = 0;
 
 struct chmod_mode_struct *chmod_modes = NULL;
 
@@ -779,6 +780,7 @@ void usage(enum logcode F)
 #ifdef ICONV_OPTION
   rprintf(F,"     --iconv=CONVERT_SPEC    request charset conversion of 
filenames\n");
 #endif
+  rprintf(F,"     --fat-filenames         ensure filenames are legal on fat 
filesystems\n");
   rprintf(F," -4, --ipv4                  prefer IPv4\n");
   rprintf(F," -6, --ipv6                  prefer IPv6\n");
   rprintf(F,"     --version               print version number\n");
@@ -990,6 +992,7 @@ static struct poptOption long_options[] = {
   {"iconv",            0,  POPT_ARG_STRING, &iconv_opt, 0, 0, 0 },
   {"no-iconv",         0,  POPT_ARG_NONE,   0, OPT_NO_ICONV, 0, 0 },
 #endif
+  {"fat-filenames",    0,  POPT_ARG_NONE,   &fat_filenames, 0, 0, 0 },
   {"ipv4",            '4', POPT_ARG_VAL,    &default_af_hint, AF_INET, 0, 0 },
   {"ipv6",            '6', POPT_ARG_VAL,    &default_af_hint, AF_INET6, 0, 0 },
   {"8-bit-output",    '8', POPT_ARG_VAL,    &allow_8bit_chars, 1, 0, 0 },
diff --git a/receiver.c b/receiver.c
index 4325e30..bc9dc90 100644
--- a/receiver.c
+++ b/receiver.c
@@ -38,6 +38,7 @@ extern int relative_paths;
 extern int preserve_hard_links;
 extern int preserve_perms;
 extern int preserve_xattrs;
+extern int fat_filenames;
 extern int basis_dir_cnt;
 extern int make_backups;
 extern int cleanup_got_literal;
@@ -441,6 +442,8 @@ int recv_files(int f_in, char *local_name)
        const char *parent_dirname = "";
 #endif
        int ndx, recv_ok;
+    int i;
+    static const char fat_invalid_chars[] = "*/:<>?\\|\"";
 
        if (DEBUG_GTE(RECV, 1))
                rprintf(FINFO, "recv_files(%d) starting\n", cur_flist->used);
@@ -487,6 +490,14 @@ int recv_files(int f_in, char *local_name)
                        file = dir_flist->files[cur_flist->parent_ndx];
                fname = local_name ? local_name : f_name(file, fbuf);
 
+        if (fat_filenames) {
+            for (i = 0; *fname != 0; i++, fname++) {
+               if (strchr(fat_invalid_chars, *fname))
+                    *fname = '_';
+            }            
+            fname -= i; /* Reset pointer */
+        }
+
                if (DEBUG_GTE(RECV, 1))
                        rprintf(FINFO, "recv_files(%s)\n", fname);
 
-- 
Please use reply-all for most replies to avoid omitting the mailing list.
To unsubscribe or change options: https://lists.samba.org/mailman/listinfo/rsync
Before posting, read: http://www.catb.org/~esr/faqs/smart-questions.html

Reply via email to