aboutsummaryrefslogtreecommitdiffstats
path: root/exclude.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2008-03-22 12:34:03 -0700
committerWayne Davison <wayned@samba.org>2008-03-22 14:02:34 -0700
commitf5aeb6ff9b04432a84b5c79f5baac26be1f3f4e9 (patch)
tree7f4d04fb775e653056986dc38b429db3145cf00e /exclude.c
parent4c74d44dabd887a5b865e95e8fca697f9084b40f (diff)
downloadandroid_external_rsync-f5aeb6ff9b04432a84b5c79f5baac26be1f3f4e9.tar.gz
android_external_rsync-f5aeb6ff9b04432a84b5c79f5baac26be1f3f4e9.tar.bz2
android_external_rsync-f5aeb6ff9b04432a84b5c79f5baac26be1f3f4e9.zip
Added XFLG_DIR2WILD3 flag that the daemon uses to transform any
config-file dir/ exclude rule into a dir/*** rule.
Diffstat (limited to 'exclude.c')
-rw-r--r--exclude.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/exclude.c b/exclude.c
index 4c7a8474..1ba55443 100644
--- 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 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
@@ -119,7 +121,7 @@ static void add_rule(struct filter_list_struct *listp, const char *pat,
{
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",
@@ -166,7 +168,15 @@ static void add_rule(struct filter_list_struct *listp, const char *pat,
} 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);
@@ -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;
+ 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;