summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
4c74d44)
config-file dir/ exclude rule into a dir/*** rule.
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_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);
#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
{
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",
- 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);
}
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;
#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)