Added XFLG_DIR2WILD3 flag that the daemon uses to transform any
authorWayne Davison <wayned@samba.org>
Sat, 22 Mar 2008 19:34:03 +0000 (12:34 -0700)
committerWayne Davison <wayned@samba.org>
Sat, 22 Mar 2008 21:02:34 +0000 (14:02 -0700)
config-file dir/ exclude rule into a dir/*** rule.

clientserver.c
exclude.c
rsync.h

index 93c90c6..39a8ced 100644 (file)
@@ -533,24 +533,24 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host)
 
        p = lp_filter(i);
        parse_rule(&daemon_filter_list, p, MATCHFLG_WORD_SPLIT,
 
        p = lp_filter(i);
        parse_rule(&daemon_filter_list, p, MATCHFLG_WORD_SPLIT,
-                  XFLG_ABS_IF_SLASH);
+                  XFLG_ABS_IF_SLASH | XFLG_DIR2WILD3);
 
        p = lp_include_from(i);
        parse_filter_file(&daemon_filter_list, p, MATCHFLG_INCLUDE,
 
        p = lp_include_from(i);
        parse_filter_file(&daemon_filter_list, p, MATCHFLG_INCLUDE,
-           XFLG_ABS_IF_SLASH | XFLG_OLD_PREFIXES | XFLG_FATAL_ERRORS);
+           XFLG_ABS_IF_SLASH | XFLG_DIR2WILD3 | XFLG_OLD_PREFIXES | XFLG_FATAL_ERRORS);
 
        p = lp_include(i);
        parse_rule(&daemon_filter_list, p,
                   MATCHFLG_INCLUDE | MATCHFLG_WORD_SPLIT,
 
        p = lp_include(i);
        parse_rule(&daemon_filter_list, p,
                   MATCHFLG_INCLUDE | MATCHFLG_WORD_SPLIT,
-                  XFLG_ABS_IF_SLASH | XFLG_OLD_PREFIXES);
+                  XFLG_ABS_IF_SLASH | XFLG_DIR2WILD3 | XFLG_OLD_PREFIXES);
 
        p = lp_exclude_from(i);
        parse_filter_file(&daemon_filter_list, p, 0,
 
        p = lp_exclude_from(i);
        parse_filter_file(&daemon_filter_list, p, 0,
-           XFLG_ABS_IF_SLASH | XFLG_OLD_PREFIXES | XFLG_FATAL_ERRORS);
+           XFLG_ABS_IF_SLASH | XFLG_DIR2WILD3 | XFLG_OLD_PREFIXES | XFLG_FATAL_ERRORS);
 
        p = lp_exclude(i);
        parse_rule(&daemon_filter_list, p, MATCHFLG_WORD_SPLIT,
 
        p = lp_exclude(i);
        parse_rule(&daemon_filter_list, p, MATCHFLG_WORD_SPLIT,
-                  XFLG_ABS_IF_SLASH | XFLG_OLD_PREFIXES);
+                  XFLG_ABS_IF_SLASH | XFLG_DIR2WILD3 | XFLG_OLD_PREFIXES);
 
        log_init(1);
 
 
        log_init(1);
 
index 4c7a847..1ba5544 100644 (file)
--- a/exclude.c
+++ b/exclude.c
@@ -52,6 +52,8 @@ struct filter_list_struct daemon_filter_list = { 0, 0, " [daemon]" };
 #define MODIFIERS_INCL_EXCL "/!Crsp"
 #define MODIFIERS_HIDE_PROTECT "/!p"
 
 #define MODIFIERS_INCL_EXCL "/!Crsp"
 #define MODIFIERS_HIDE_PROTECT "/!p"
 
+#define SLASH_WILD3_SUFFIX "/***"
+
 /* The dirbuf is set by push_local_filters() to the current subdirectory
  * relative to curr_dir that is being processed.  The path always has a
  * trailing slash appended, and the variable dirbuf_len contains the length
 /* The dirbuf is set by push_local_filters() to the current subdirectory
  * relative to curr_dir that is being processed.  The path always has a
  * trailing slash appended, and the variable dirbuf_len contains the length
@@ -119,7 +121,7 @@ static void add_rule(struct filter_list_struct *listp, const char *pat,
 {
        struct filter_struct *ret;
        const char *cp;
 {
        struct filter_struct *ret;
        const char *cp;
-       unsigned int pre_len, slash_cnt = 0;
+       unsigned int pre_len, suf_len, slash_cnt = 0;
 
        if (verbose > 2) {
                rprintf(FINFO, "[%s] add_rule(%s%.*s%s)%s\n",
 
        if (verbose > 2) {
                rprintf(FINFO, "[%s] add_rule(%s%.*s%s)%s\n",
@@ -166,7 +168,15 @@ static void add_rule(struct filter_list_struct *listp, const char *pat,
        } else
                pre_len = 0;
 
        } else
                pre_len = 0;
 
-       if (!(ret->pattern = new_array(char, pre_len + pat_len + 1)))
+       /* The daemon wants dir-exclude rules to get an appended "/" + "***". */
+       if (xflags & XFLG_DIR2WILD3
+        && BITS_SETnUNSET(mflags, MATCHFLG_DIRECTORY, MATCHFLG_INCLUDE)) {
+               mflags &= ~MATCHFLG_DIRECTORY;
+               suf_len = sizeof SLASH_WILD3_SUFFIX - 1;
+       } else
+               suf_len = 0;
+
+       if (!(ret->pattern = new_array(char, pre_len + pat_len + suf_len + 1)))
                out_of_memory("add_rule");
        if (pre_len) {
                memcpy(ret->pattern, dirbuf + module_dirlen, pre_len);
                out_of_memory("add_rule");
        if (pre_len) {
                memcpy(ret->pattern, dirbuf + module_dirlen, pre_len);
@@ -177,6 +187,11 @@ static void add_rule(struct filter_list_struct *listp, const char *pat,
        }
        strlcpy(ret->pattern + pre_len, pat, pat_len + 1);
        pat_len += pre_len;
        }
        strlcpy(ret->pattern + pre_len, pat, pat_len + 1);
        pat_len += pre_len;
+       if (suf_len) {
+               memcpy(ret->pattern + pat_len, SLASH_WILD3_SUFFIX, suf_len+1);
+               pat_len += suf_len;
+               slash_cnt++;
+       }
 
        if (strpbrk(ret->pattern, "*[?")) {
                mflags |= MATCHFLG_WILD;
 
        if (strpbrk(ret->pattern, "*[?")) {
                mflags |= MATCHFLG_WILD;
diff --git a/rsync.h b/rsync.h
index 6be36d3..aca0817 100644 (file)
--- a/rsync.h
+++ b/rsync.h
 
 #define XFLG_FATAL_ERRORS      (1<<0)
 #define XFLG_OLD_PREFIXES      (1<<1)
 
 #define XFLG_FATAL_ERRORS      (1<<0)
 #define XFLG_OLD_PREFIXES      (1<<1)
-#define XFLG_ANCHORED2ABS      (1<<2)
-#define XFLG_ABS_IF_SLASH      (1<<3)
+#define XFLG_ANCHORED2ABS      (1<<2) /* leading slash indicates absolute */
+#define XFLG_ABS_IF_SLASH      (1<<3) /* leading or interior slash is absolute */
+#define XFLG_DIR2WILD3         (1<<4) /* dir/ match gets trailing *** added */
 
 #define ATTRS_REPORT           (1<<0)
 #define ATTRS_SKIP_MTIME       (1<<1)
 
 #define ATTRS_REPORT           (1<<0)
 #define ATTRS_SKIP_MTIME       (1<<1)