Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
liblongpath-rsync
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
liblongpath
liblongpath-rsync
Commits
b32d4254
Commit
b32d4254
authored
May 23, 2009
by
Wayne Davison
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Change filter MATCHFLGs to FILTRULEs.
parent
134f97c9
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
175 additions
and
175 deletions
+175
-175
batch.c
batch.c
+2
-2
clientserver.c
clientserver.c
+4
-4
compat.c
compat.c
+3
-3
exclude.c
exclude.c
+138
-138
options.c
options.c
+2
-2
rsync.h
rsync.h
+26
-26
No files found.
batch.c
View file @
b32d4254
...
...
@@ -196,10 +196,10 @@ static void write_filter_rules(int fd)
write_sbuf
(
fd
,
" <<'#E#'
\n
"
);
for
(
ent
=
filter_list
.
head
;
ent
;
ent
=
ent
->
next
)
{
unsigned
int
plen
;
char
*
p
=
get_rule_prefix
(
ent
->
match_
flags
,
"- "
,
0
,
&
plen
);
char
*
p
=
get_rule_prefix
(
ent
->
r
flags
,
"- "
,
0
,
&
plen
);
write_buf
(
fd
,
p
,
plen
);
write_sbuf
(
fd
,
ent
->
pattern
);
if
(
ent
->
match_flags
&
MATCHFLG
_DIRECTORY
)
if
(
ent
->
rflags
&
FILTRULE
_DIRECTORY
)
write_byte
(
fd
,
'/'
);
write_byte
(
fd
,
eol_nulls
?
0
:
'\n'
);
}
...
...
clientserver.c
View file @
b32d4254
...
...
@@ -620,16 +620,16 @@ static int rsync_module(int f_in, int f_out, int i, const char *addr, const char
set_filter_dir
(
module_dir
,
module_dirlen
);
p
=
lp_filter
(
i
);
parse_rule
(
&
daemon_filter_list
,
p
,
MATCHFLG
_WORD_SPLIT
,
parse_rule
(
&
daemon_filter_list
,
p
,
FILTRULE
_WORD_SPLIT
,
XFLG_ABS_IF_SLASH
|
XFLG_DIR2WILD3
);
p
=
lp_include_from
(
i
);
parse_filter_file
(
&
daemon_filter_list
,
p
,
MATCHFLG
_INCLUDE
,
parse_filter_file
(
&
daemon_filter_list
,
p
,
FILTRULE
_INCLUDE
,
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
,
FILTRULE_INCLUDE
|
FILTRULE
_WORD_SPLIT
,
XFLG_ABS_IF_SLASH
|
XFLG_DIR2WILD3
|
XFLG_OLD_PREFIXES
);
p
=
lp_exclude_from
(
i
);
...
...
@@ -637,7 +637,7 @@ static int rsync_module(int f_in, int f_out, int i, const char *addr, const char
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
,
parse_rule
(
&
daemon_filter_list
,
p
,
FILTRULE
_WORD_SPLIT
,
XFLG_ABS_IF_SLASH
|
XFLG_DIR2WILD3
|
XFLG_OLD_PREFIXES
);
log_init
(
1
);
...
...
compat.c
View file @
b32d4254
...
...
@@ -291,10 +291,10 @@ void setup_protocol(int f_out,int f_in)
unsort_ndx
=
++
file_extra_cnt
;
if
(
partial_dir
&&
*
partial_dir
!=
'/'
&&
(
!
am_server
||
local_server
))
{
int
flags
=
MATCHFLG_NO_PREFIXES
|
MATCHFLG
_DIRECTORY
;
int
rflags
=
FILTRULE_NO_PREFIXES
|
FILTRULE
_DIRECTORY
;
if
(
!
am_sender
||
protocol_version
>=
30
)
flags
|=
MATCHFLG
_PERISHABLE
;
parse_rule
(
&
filter_list
,
partial_dir
,
flags
,
0
);
rflags
|=
FILTRULE
_PERISHABLE
;
parse_rule
(
&
filter_list
,
partial_dir
,
r
flags
,
0
);
}
...
...
exclude.c
View file @
b32d4254
...
...
@@ -124,7 +124,7 @@ static void teardown_mergelist(struct filter_struct *ex)
static
void
free_filter
(
struct
filter_struct
*
ex
)
{
if
(
ex
->
match_flags
&
MATCHFLG
_PERDIR_MERGE
)
if
(
ex
->
rflags
&
FILTRULE
_PERDIR_MERGE
)
teardown_mergelist
(
ex
);
free
(
ex
->
pattern
);
free
(
ex
);
...
...
@@ -153,7 +153,7 @@ static void free_filters(struct filter_struct *head)
/* Build a filter structure given a filter pattern. The value in "pat"
* is not null-terminated. */
static
void
add_rule
(
struct
filter_list_struct
*
listp
,
const
char
*
pat
,
unsigned
int
pat_len
,
uint32
m
flags
,
int
xflags
)
unsigned
int
pat_len
,
uint32
r
flags
,
int
xflags
)
{
struct
filter_struct
*
ret
;
const
char
*
cp
;
...
...
@@ -161,21 +161,21 @@ static void add_rule(struct filter_list_struct *listp, const char *pat,
if
(
DEBUG_GTE
(
FILTER
,
2
))
{
rprintf
(
FINFO
,
"[%s] add_rule(%s%.*s%s)%s
\n
"
,
who_am_i
(),
get_rule_prefix
(
m
flags
,
pat
,
0
,
NULL
),
who_am_i
(),
get_rule_prefix
(
r
flags
,
pat
,
0
,
NULL
),
(
int
)
pat_len
,
pat
,
(
mflags
&
MATCHFLG
_DIRECTORY
)
?
"/"
:
""
,
(
rflags
&
FILTRULE
_DIRECTORY
)
?
"/"
:
""
,
listp
->
debug_type
);
}
/* These flags also indicate that we're reading a list that
* needs to be filtered now, not post-filtered later. */
if
(
xflags
&
(
XFLG_ANCHORED2ABS
|
XFLG_ABS_IF_SLASH
))
{
uint32
mf
=
mflags
&
(
MATCHFLG_RECEIVER_SIDE
|
MATCHFLG
_SENDER_SIDE
);
uint32
mf
=
rflags
&
(
FILTRULE_RECEIVER_SIDE
|
FILTRULE
_SENDER_SIDE
);
if
(
am_sender
)
{
if
(
mf
==
MATCHFLG
_RECEIVER_SIDE
)
if
(
mf
==
FILTRULE
_RECEIVER_SIDE
)
return
;
}
else
{
if
(
mf
==
MATCHFLG
_SENDER_SIDE
)
if
(
mf
==
FILTRULE
_SENDER_SIDE
)
return
;
}
}
...
...
@@ -185,7 +185,7 @@ static void add_rule(struct filter_list_struct *listp, const char *pat,
if
(
pat_len
>
1
&&
pat
[
pat_len
-
1
]
==
'/'
)
{
pat_len
--
;
mflags
|=
MATCHFLG
_DIRECTORY
;
rflags
|=
FILTRULE
_DIRECTORY
;
}
for
(
cp
=
pat
;
cp
<
pat
+
pat_len
;
cp
++
)
{
...
...
@@ -193,10 +193,10 @@ static void add_rule(struct filter_list_struct *listp, const char *pat,
slash_cnt
++
;
}
if
(
!
(
mflags
&
(
MATCHFLG_ABS_PATH
|
MATCHFLG
_MERGE_FILE
))
if
(
!
(
rflags
&
(
FILTRULE_ABS_PATH
|
FILTRULE
_MERGE_FILE
))
&&
((
xflags
&
(
XFLG_ANCHORED2ABS
|
XFLG_ABS_IF_SLASH
)
&&
*
pat
==
'/'
)
||
(
xflags
&
XFLG_ABS_IF_SLASH
&&
slash_cnt
)))
{
mflags
|=
MATCHFLG
_ABS_PATH
;
rflags
|=
FILTRULE
_ABS_PATH
;
if
(
*
pat
==
'/'
)
pre_len
=
dirbuf_len
-
module_dirlen
-
1
;
else
...
...
@@ -206,8 +206,8 @@ static void add_rule(struct filter_list_struct *listp, const char *pat,
/* The daemon wants dir-exclude rules to get an appended "/" + "***". */
if
(
xflags
&
XFLG_DIR2WILD3
&&
BITS_SETnUNSET
(
mflags
,
MATCHFLG_DIRECTORY
,
MATCHFLG
_INCLUDE
))
{
mflags
&=
~
MATCHFLG
_DIRECTORY
;
&&
BITS_SETnUNSET
(
rflags
,
FILTRULE_DIRECTORY
,
FILTRULE
_INCLUDE
))
{
rflags
&=
~
FILTRULE
_DIRECTORY
;
suf_len
=
sizeof
SLASH_WILD3_SUFFIX
-
1
;
}
else
suf_len
=
0
;
...
...
@@ -230,22 +230,22 @@ static void add_rule(struct filter_list_struct *listp, const char *pat,
}
if
(
strpbrk
(
ret
->
pattern
,
"*[?"
))
{
mflags
|=
MATCHFLG
_WILD
;
rflags
|=
FILTRULE
_WILD
;
if
((
cp
=
strstr
(
ret
->
pattern
,
"**"
))
!=
NULL
)
{
mflags
|=
MATCHFLG
_WILD2
;
rflags
|=
FILTRULE
_WILD2
;
/* If the pattern starts with **, note that. */
if
(
cp
==
ret
->
pattern
)
mflags
|=
MATCHFLG
_WILD2_PREFIX
;
rflags
|=
FILTRULE
_WILD2_PREFIX
;
/* If the pattern ends with ***, note that. */
if
(
pat_len
>=
3
&&
ret
->
pattern
[
pat_len
-
3
]
==
'*'
&&
ret
->
pattern
[
pat_len
-
2
]
==
'*'
&&
ret
->
pattern
[
pat_len
-
1
]
==
'*'
)
mflags
|=
MATCHFLG
_WILD3_SUFFIX
;
rflags
|=
FILTRULE
_WILD3_SUFFIX
;
}
}
if
(
mflags
&
MATCHFLG
_PERDIR_MERGE
)
{
if
(
rflags
&
FILTRULE
_PERDIR_MERGE
)
{
struct
filter_list_struct
*
lp
;
unsigned
int
len
;
int
i
;
...
...
@@ -295,7 +295,7 @@ static void add_rule(struct filter_list_struct *listp, const char *pat,
}
else
ret
->
u
.
slash_cnt
=
slash_cnt
;
ret
->
match_flags
=
m
flags
;
ret
->
rflags
=
r
flags
;
if
(
!
listp
->
tail
)
{
ret
->
next
=
listp
->
head
;
...
...
@@ -454,8 +454,8 @@ static BOOL setup_merge_file(int mergelist_num, struct filter_struct *ex,
*
y
=
'\0'
;
dirbuf_len
=
y
-
dirbuf
;
strlcpy
(
x
,
ex
->
pattern
,
MAXPATHLEN
-
(
x
-
buf
));
parse_filter_file
(
lp
,
buf
,
ex
->
match_
flags
,
XFLG_ANCHORED2ABS
);
if
(
ex
->
match_flags
&
MATCHFLG
_NO_INHERIT
)
{
parse_filter_file
(
lp
,
buf
,
ex
->
r
flags
,
XFLG_ANCHORED2ABS
);
if
(
ex
->
rflags
&
FILTRULE
_NO_INHERIT
)
{
/* Free the undesired rules to clean up any per-dir
* mergelists they defined. Otherwise pop_local_filters
* may crash trying to restore nonexistent state for
...
...
@@ -527,18 +527,18 @@ void *push_local_filters(const char *dir, unsigned int dirlen)
}
lp
->
tail
=
NULL
;
/* Switch any local rules to inherited. */
if
(
ex
->
match_flags
&
MATCHFLG
_NO_INHERIT
)
if
(
ex
->
rflags
&
FILTRULE
_NO_INHERIT
)
lp
->
head
=
NULL
;
if
(
ex
->
match_flags
&
MATCHFLG
_FINISH_SETUP
)
{
ex
->
match_flags
&=
~
MATCHFLG
_FINISH_SETUP
;
if
(
ex
->
rflags
&
FILTRULE
_FINISH_SETUP
)
{
ex
->
rflags
&=
~
FILTRULE
_FINISH_SETUP
;
if
(
setup_merge_file
(
i
,
ex
,
lp
))
set_filter_dir
(
dir
,
dirlen
);
}
if
(
strlcpy
(
dirbuf
+
dirbuf_len
,
ex
->
pattern
,
MAXPATHLEN
-
dirbuf_len
)
<
MAXPATHLEN
-
dirbuf_len
)
{
parse_filter_file
(
lp
,
dirbuf
,
ex
->
match_
flags
,
parse_filter_file
(
lp
,
dirbuf
,
ex
->
r
flags
,
XFLG_ANCHORED2ABS
);
}
else
{
io_error
|=
IOERR_GENERAL
;
...
...
@@ -637,7 +637,7 @@ void change_local_filter_dir(const char *dname, int dlen, int dir_depth)
static
int
rule_matches
(
const
char
*
fname
,
struct
filter_struct
*
ex
,
int
name_is_dir
)
{
int
slash_handling
,
str_cnt
=
0
,
anchored_match
=
0
;
int
ret_match
=
ex
->
match_flags
&
MATCHFLG
_NEGATE
?
0
:
1
;
int
ret_match
=
ex
->
rflags
&
FILTRULE
_NEGATE
?
0
:
1
;
char
*
p
,
*
pattern
=
ex
->
pattern
;
const
char
*
strings
[
16
];
/* more than enough */
const
char
*
name
=
fname
+
(
*
fname
==
'/'
);
...
...
@@ -645,28 +645,28 @@ static int rule_matches(const char *fname, struct filter_struct *ex, int name_is
if
(
!*
name
)
return
0
;
if
(
!
ex
->
u
.
slash_cnt
&&
!
(
ex
->
match_flags
&
MATCHFLG
_WILD2
))
{
if
(
!
ex
->
u
.
slash_cnt
&&
!
(
ex
->
rflags
&
FILTRULE
_WILD2
))
{
/* If the pattern does not have any slashes AND it does
* not have a "**" (which could match a slash), then we
* just match the name portion of the path. */
if
((
p
=
strrchr
(
name
,
'/'
))
!=
NULL
)
name
=
p
+
1
;
}
else
if
(
ex
->
match_flags
&
MATCHFLG
_ABS_PATH
&&
*
fname
!=
'/'
}
else
if
(
ex
->
rflags
&
FILTRULE
_ABS_PATH
&&
*
fname
!=
'/'
&&
curr_dir_len
>
module_dirlen
+
1
)
{
/* If we're matching against an absolute-path pattern,
* we need to prepend our full path info. */
strings
[
str_cnt
++
]
=
curr_dir
+
module_dirlen
+
1
;
strings
[
str_cnt
++
]
=
"/"
;
}
else
if
(
ex
->
match_flags
&
MATCHFLG
_WILD2_PREFIX
&&
*
fname
!=
'/'
)
{
}
else
if
(
ex
->
rflags
&
FILTRULE
_WILD2_PREFIX
&&
*
fname
!=
'/'
)
{
/* Allow "**"+"/" to match at the start of the string. */
strings
[
str_cnt
++
]
=
"/"
;
}
strings
[
str_cnt
++
]
=
name
;
if
(
name_is_dir
)
{
/* Allow a trailing "/"+"***" to match the directory. */
if
(
ex
->
match_flags
&
MATCHFLG
_WILD3_SUFFIX
)
if
(
ex
->
rflags
&
FILTRULE
_WILD3_SUFFIX
)
strings
[
str_cnt
++
]
=
"/"
;
}
else
if
(
ex
->
match_flags
&
MATCHFLG
_DIRECTORY
)
}
else
if
(
ex
->
rflags
&
FILTRULE
_DIRECTORY
)
return
!
ret_match
;
strings
[
str_cnt
]
=
NULL
;
...
...
@@ -676,12 +676,12 @@ static int rule_matches(const char *fname, struct filter_struct *ex, int name_is
}
if
(
!
anchored_match
&&
ex
->
u
.
slash_cnt
&&
!
(
ex
->
match_flags
&
MATCHFLG
_WILD2
))
{
&&
!
(
ex
->
rflags
&
FILTRULE
_WILD2
))
{
/* A non-anchored match with an infix slash and no "**"
* needs to match the last slash_cnt+1 name elements. */
slash_handling
=
ex
->
u
.
slash_cnt
+
1
;
}
else
if
(
!
anchored_match
&&
!
(
ex
->
match_flags
&
MATCHFLG
_WILD2_PREFIX
)
&&
ex
->
match_flags
&
MATCHFLG
_WILD2
)
{
}
else
if
(
!
anchored_match
&&
!
(
ex
->
rflags
&
FILTRULE
_WILD2_PREFIX
)
&&
ex
->
rflags
&
FILTRULE
_WILD2
)
{
/* A non-anchored match with an infix or trailing "**" (but not
* a prefixed "**") needs to try matching after every slash. */
slash_handling
=
-
1
;
...
...
@@ -690,7 +690,7 @@ static int rule_matches(const char *fname, struct filter_struct *ex, int name_is
slash_handling
=
0
;
}
if
(
ex
->
match_flags
&
MATCHFLG
_WILD
)
{
if
(
ex
->
rflags
&
FILTRULE
_WILD
)
{
if
(
wildmatch_array
(
pattern
,
strings
,
slash_handling
))
return
ret_match
;
}
else
if
(
str_cnt
>
1
)
{
...
...
@@ -726,9 +726,9 @@ static void report_filter_result(enum logcode code, char const *name,
=
{
{
"show"
,
"hid"
},
{
"risk"
,
"protect"
}
};
const
char
*
w
=
who_am_i
();
rprintf
(
code
,
"[%s] %sing %s %s because of pattern %s%s%s
\n
"
,
w
,
actions
[
*
w
!=
's'
][
!
(
ent
->
match_flags
&
MATCHFLG
_INCLUDE
)],
w
,
actions
[
*
w
!=
's'
][
!
(
ent
->
rflags
&
FILTRULE
_INCLUDE
)],
name_is_dir
?
"directory"
:
"file"
,
name
,
ent
->
pattern
,
ent
->
match_flags
&
MATCHFLG
_DIRECTORY
?
"/"
:
""
,
type
);
ent
->
rflags
&
FILTRULE
_DIRECTORY
?
"/"
:
""
,
type
);
}
}
...
...
@@ -743,16 +743,16 @@ int check_filter(struct filter_list_struct *listp, enum logcode code,
struct
filter_struct
*
ent
;
for
(
ent
=
listp
->
head
;
ent
;
ent
=
ent
->
next
)
{
if
(
ignore_perishable
&&
ent
->
match_flags
&
MATCHFLG
_PERISHABLE
)
if
(
ignore_perishable
&&
ent
->
rflags
&
FILTRULE
_PERISHABLE
)
continue
;
if
(
ent
->
match_flags
&
MATCHFLG
_PERDIR_MERGE
)
{
if
(
ent
->
rflags
&
FILTRULE
_PERDIR_MERGE
)
{
int
rc
=
check_filter
(
ent
->
u
.
mergelist
,
code
,
name
,
name_is_dir
);
if
(
rc
)
return
rc
;
continue
;
}
if
(
ent
->
match_flags
&
MATCHFLG
_CVS_IGNORE
)
{
if
(
ent
->
rflags
&
FILTRULE
_CVS_IGNORE
)
{
int
rc
=
check_filter
(
&
cvs_filter_list
,
code
,
name
,
name_is_dir
);
if
(
rc
)
...
...
@@ -762,7 +762,7 @@ int check_filter(struct filter_list_struct *listp, enum logcode code,
if
(
rule_matches
(
name
,
ent
,
name_is_dir
))
{
report_filter_result
(
code
,
name
,
ent
,
name_is_dir
,
listp
->
debug_type
);
return
ent
->
match_flags
&
MATCHFLG
_INCLUDE
?
1
:
-
1
;
return
ent
->
rflags
&
FILTRULE
_INCLUDE
?
1
:
-
1
;
}
}
...
...
@@ -786,17 +786,17 @@ static const uchar *rule_strcmp(const uchar *str, const char *rule, int rule_len
* be '\0' terminated, so use the returned length to limit the string.
* Also, be sure to add this length to the returned pointer before passing
* it back to ask for the next token. This routine parses the "!" (list-
* clearing) token and (depending on the
m
flags) the various prefixes.
* The *
mflags_ptr value will be set on exit to the new MATCHFLG
_* bits
* clearing) token and (depending on the
r
flags) the various prefixes.
* The *
rflags_ptr value will be set on exit to the new FILTRULE
_* bits
* for the current token. */
static
const
char
*
parse_rule_tok
(
const
char
*
p
,
uint32
m
flags
,
int
xflags
,
unsigned
int
*
len_ptr
,
uint32
*
m
flags_ptr
)
static
const
char
*
parse_rule_tok
(
const
char
*
p
,
uint32
r
flags
,
int
xflags
,
unsigned
int
*
len_ptr
,
uint32
*
r
flags_ptr
)
{
const
uchar
*
s
=
(
const
uchar
*
)
p
;
uint32
new_
m
flags
;
uint32
new_
r
flags
;
unsigned
int
len
;
if
(
mflags
&
MATCHFLG
_WORD_SPLIT
)
{
if
(
rflags
&
FILTRULE
_WORD_SPLIT
)
{
/* Skip over any initial whitespace. */
while
(
isspace
(
*
s
))
s
++
;
...
...
@@ -806,26 +806,26 @@ static const char *parse_rule_tok(const char *p, uint32 mflags, int xflags,
if
(
!*
s
)
return
NULL
;
new_
mflags
=
mflags
&
MATCHFLG
S_FROM_CONTAINER
;
new_
rflags
=
rflags
&
FILTRULE
S_FROM_CONTAINER
;
/* Figure out what kind of a filter rule "s" is pointing at. Note
* that if
MATCHFLG
_NO_PREFIXES is set, the rule is either an include
* or an exclude based on the inheritance of the
MATCHFLG
_INCLUDE
* that if
FILTRULE
_NO_PREFIXES is set, the rule is either an include
* or an exclude based on the inheritance of the
FILTRULE
_INCLUDE
* flag (above). XFLG_OLD_PREFIXES indicates a compatibility mode
* for old include/exclude patterns where just "+ " and "- " are
* allowed as optional prefixes. */
if
(
mflags
&
MATCHFLG
_NO_PREFIXES
)
{
if
(
*
s
==
'!'
&&
mflags
&
MATCHFLG
_CVS_IGNORE
)
new_
mflags
|=
MATCHFLG
_CLEAR_LIST
;
/* Tentative! */
if
(
rflags
&
FILTRULE
_NO_PREFIXES
)
{
if
(
*
s
==
'!'
&&
rflags
&
FILTRULE
_CVS_IGNORE
)
new_
rflags
|=
FILTRULE
_CLEAR_LIST
;
/* Tentative! */
}
else
if
(
xflags
&
XFLG_OLD_PREFIXES
)
{
if
(
*
s
==
'-'
&&
s
[
1
]
==
' '
)
{
new_
mflags
&=
~
MATCHFLG
_INCLUDE
;
new_
rflags
&=
~
FILTRULE
_INCLUDE
;
s
+=
2
;
}
else
if
(
*
s
==
'+'
&&
s
[
1
]
==
' '
)
{
new_
mflags
|=
MATCHFLG
_INCLUDE
;
new_
rflags
|=
FILTRULE
_INCLUDE
;
s
+=
2
;
}
else
if
(
*
s
==
'!'
)
new_
mflags
|=
MATCHFLG
_CLEAR_LIST
;
/* Tentative! */
new_
rflags
|=
FILTRULE
_CLEAR_LIST
;
/* Tentative! */
}
else
{
char
ch
=
0
,
*
mods
=
""
;
switch
(
*
s
)
{
...
...
@@ -873,35 +873,35 @@ static const char *parse_rule_tok(const char *p, uint32 mflags, int xflags,
}
switch
(
ch
)
{
case
':'
:
new_
mflags
|=
MATCHFLG
_PERDIR_MERGE
|
MATCHFLG
_FINISH_SETUP
;
new_
rflags
|=
FILTRULE
_PERDIR_MERGE
|
FILTRULE
_FINISH_SETUP
;
/* FALL THROUGH */
case
'.'
:
new_
mflags
|=
MATCHFLG
_MERGE_FILE
;
new_
rflags
|=
FILTRULE
_MERGE_FILE
;
mods
=
MODIFIERS_INCL_EXCL
MODIFIERS_MERGE_FILE
;
break
;
case
'+'
:
new_
mflags
|=
MATCHFLG
_INCLUDE
;
new_
rflags
|=
FILTRULE
_INCLUDE
;
/* FALL THROUGH */
case
'-'
:
mods
=
MODIFIERS_INCL_EXCL
;
break
;
case
'S'
:
new_
mflags
|=
MATCHFLG
_INCLUDE
;
new_
rflags
|=
FILTRULE
_INCLUDE
;
/* FALL THROUGH */
case
'H'
:
new_
mflags
|=
MATCHFLG
_SENDER_SIDE
;
new_
rflags
|=
FILTRULE
_SENDER_SIDE
;
mods
=
MODIFIERS_HIDE_PROTECT
;
break
;
case
'R'
:
new_
mflags
|=
MATCHFLG
_INCLUDE
;
new_
rflags
|=
FILTRULE
_INCLUDE
;
/* FALL THROUGH */
case
'P'
:
new_
mflags
|=
MATCHFLG
_RECEIVER_SIDE
;
new_
rflags
|=
FILTRULE
_RECEIVER_SIDE
;
mods
=
MODIFIERS_HIDE_PROTECT
;
break
;
case
'!'
:
new_
mflags
|=
MATCHFLG
_CLEAR_LIST
;
new_
rflags
|=
FILTRULE
_CLEAR_LIST
;
mods
=
NULL
;
break
;
default:
...
...
@@ -910,7 +910,7 @@ static const char *parse_rule_tok(const char *p, uint32 mflags, int xflags,
}
while
(
mods
&&
*++
s
&&
*
s
!=
' '
&&
*
s
!=
'_'
)
{
if
(
strchr
(
mods
,
*
s
)
==
NULL
)
{
if
(
mflags
&
MATCHFLG
_WORD_SPLIT
&&
isspace
(
*
s
))
{
if
(
rflags
&
FILTRULE
_WORD_SPLIT
&&
isspace
(
*
s
))
{
s
--
;
break
;
}
...
...
@@ -922,47 +922,47 @@ static const char *parse_rule_tok(const char *p, uint32 mflags, int xflags,
}
switch
(
*
s
)
{
case
'-'
:
if
(
new_
mflags
&
MATCHFLG
_NO_PREFIXES
)
if
(
new_
rflags
&
FILTRULE
_NO_PREFIXES
)
goto
invalid
;
new_
mflags
|=
MATCHFLG
_NO_PREFIXES
;
new_
rflags
|=
FILTRULE
_NO_PREFIXES
;
break
;
case
'+'
:
if
(
new_
mflags
&
MATCHFLG
_NO_PREFIXES
)
if
(
new_
rflags
&
FILTRULE
_NO_PREFIXES
)
goto
invalid
;
new_
mflags
|=
MATCHFLG
_NO_PREFIXES
|
MATCHFLG
_INCLUDE
;
new_
rflags
|=
FILTRULE
_NO_PREFIXES
|
FILTRULE
_INCLUDE
;
break
;
case
'/'
:
new_
mflags
|=
MATCHFLG
_ABS_PATH
;
new_
rflags
|=
FILTRULE
_ABS_PATH
;
break
;
case
'!'
:
new_
mflags
|=
MATCHFLG
_NEGATE
;
new_
rflags
|=
FILTRULE
_NEGATE
;
break
;
case
'C'
:
if
(
new_
mflags
&
MATCHFLG
_NO_PREFIXES
)
if
(
new_
rflags
&
FILTRULE
_NO_PREFIXES
)
goto
invalid
;
new_
mflags
|=
MATCHFLG
_NO_PREFIXES
|
MATCHFLG
_WORD_SPLIT
|
MATCHFLG
_NO_INHERIT
|
MATCHFLG
_CVS_IGNORE
;
new_
rflags
|=
FILTRULE
_NO_PREFIXES
|
FILTRULE
_WORD_SPLIT
|
FILTRULE
_NO_INHERIT
|
FILTRULE
_CVS_IGNORE
;
break
;
case
'e'
:
new_
mflags
|=
MATCHFLG
_EXCLUDE_SELF
;
new_
rflags
|=
FILTRULE
_EXCLUDE_SELF
;
break
;
case
'n'
:
new_
mflags
|=
MATCHFLG
_NO_INHERIT
;
new_
rflags
|=
FILTRULE
_NO_INHERIT
;
break
;
case
'p'
:
new_
mflags
|=
MATCHFLG
_PERISHABLE
;
new_
rflags
|=
FILTRULE
_PERISHABLE
;
break
;
case
'r'
:
new_
mflags
|=
MATCHFLG
_RECEIVER_SIDE
;
new_
rflags
|=
FILTRULE
_RECEIVER_SIDE
;
break
;
case
's'
:
new_
mflags
|=
MATCHFLG
_SENDER_SIDE
;
new_
rflags
|=
FILTRULE
_SENDER_SIDE
;
break
;
case
'w'
:
new_
mflags
|=
MATCHFLG
_WORD_SPLIT
;
new_
rflags
|=
FILTRULE
_WORD_SPLIT
;
break
;
}
}
...
...
@@ -970,7 +970,7 @@ static const char *parse_rule_tok(const char *p, uint32 mflags, int xflags,
s
++
;
}
if
(
mflags
&
MATCHFLG
_WORD_SPLIT
)
{
if
(
rflags
&
FILTRULE
_WORD_SPLIT
)
{
const
uchar
*
cp
=
s
;
/* Token ends at whitespace or the end of the string. */
while
(
!
isspace
(
*
cp
)
&&
*
cp
!=
'\0'
)
...
...
@@ -979,16 +979,16 @@ static const char *parse_rule_tok(const char *p, uint32 mflags, int xflags,
}
else
len
=
strlen
((
char
*
)
s
);
if
(
new_
mflags
&
MATCHFLG
_CLEAR_LIST
)
{
if
(
!
(
mflags
&
MATCHFLG
_NO_PREFIXES
)
if
(
new_
rflags
&
FILTRULE
_CLEAR_LIST
)
{
if
(
!
(
rflags
&
FILTRULE
_NO_PREFIXES
)
&&
!
(
xflags
&
XFLG_OLD_PREFIXES
)
&&
len
)
{
rprintf
(
FERROR
,
"'!' rule has trailing characters: %s
\n
"
,
p
);
exit_cleanup
(
RERR_SYNTAX
);
}
if
(
len
>
1
)
new_
mflags
&=
~
MATCHFLG
_CLEAR_LIST
;
}
else
if
(
!
len
&&
!
(
new_
mflags
&
MATCHFLG
_CVS_IGNORE
))
{
new_
rflags
&=
~
FILTRULE
_CLEAR_LIST
;
}
else
if
(
!
len
&&
!
(
new_
rflags
&
FILTRULE
_CVS_IGNORE
))
{
rprintf
(
FERROR
,
"unexpected end of filter rule: %s
\n
"
,
p
);
exit_cleanup
(
RERR_SYNTAX
);
}
...
...
@@ -997,13 +997,13 @@ static const char *parse_rule_tok(const char *p, uint32 mflags, int xflags,
* sender-side rule. We also affect per-dir merge files that take
* no prefixes as a simple optimization. */
if
(
delete_excluded
&&
!
(
new_
mflags
&
(
MATCHFLG_RECEIVER_SIDE
|
MATCHFLG
_SENDER_SIDE
))
&&
(
!
(
new_
mflags
&
MATCHFLG
_PERDIR_MERGE
)
||
new_
mflags
&
MATCHFLG
_NO_PREFIXES
))
new_
mflags
|=
MATCHFLG
_SENDER_SIDE
;
&&
!
(
new_
rflags
&
(
FILTRULE_RECEIVER_SIDE
|
FILTRULE
_SENDER_SIDE
))
&&
(
!
(
new_
rflags
&
FILTRULE
_PERDIR_MERGE
)
||
new_
rflags
&
FILTRULE
_NO_PREFIXES
))
new_
rflags
|=
FILTRULE
_SENDER_SIDE
;
*
len_ptr
=
len
;
*
mflags_ptr
=
new_m
flags
;
*
rflags_ptr
=
new_r
flags
;
return
(
const
char
*
)
s
;
}
...
...
@@ -1018,7 +1018,7 @@ static char default_cvsignore[] =
/* The rest we added to suit ourself. */
" .svn/ .git/ .bzr/"
;
static
void
get_cvs_excludes
(
uint32
m
flags
)
static
void
get_cvs_excludes
(
uint32
r
flags
)
{
static
int
initialized
=
0
;
char
*
p
,
fname
[
MAXPATHLEN
];
...
...
@@ -1028,22 +1028,22 @@ static void get_cvs_excludes(uint32 mflags)
initialized
=
1
;
parse_rule
(
&
cvs_filter_list
,
default_cvsignore
,
mflags
|
(
protocol_version
>=
30
?
MATCHFLG
_PERISHABLE
:
0
),
rflags
|
(
protocol_version
>=
30
?
FILTRULE
_PERISHABLE
:
0
),
0
);
p
=
module_id
>=
0
&&
lp_use_chroot
(
module_id
)
?
"/"
:
getenv
(
"HOME"
);
if
(
p
&&
pathjoin
(
fname
,
MAXPATHLEN
,
p
,
".cvsignore"
)
<
MAXPATHLEN
)
parse_filter_file
(
&
cvs_filter_list
,
fname
,
m
flags
,
0
);
parse_filter_file
(
&
cvs_filter_list
,
fname
,
r
flags
,
0
);
parse_rule
(
&
cvs_filter_list
,
getenv
(
"CVSIGNORE"
),
m
flags
,
0
);
parse_rule
(
&
cvs_filter_list
,
getenv
(
"CVSIGNORE"
),
r
flags
,
0
);
}
void
parse_rule
(
struct
filter_list_struct
*
listp
,
const
char
*
pattern
,
uint32
m
flags
,
int
xflags
)
uint32
r
flags
,
int
xflags
)
{
unsigned
int
pat_len
;
uint32
new_
m
flags
;
uint32
new_
r
flags
;
const
char
*
cp
,
*
p
;
if
(
!
pattern
)
...
...
@@ -1051,8 +1051,8 @@ void parse_rule(struct filter_list_struct *listp, const char *pattern,
while
(
1
)
{
/* Remember that the returned string is NOT '\0' terminated! */
cp
=
parse_rule_tok
(
pattern
,
m
flags
,
xflags
,
&
pat_len
,
&
new_
m
flags
);
cp
=
parse_rule_tok
(
pattern
,
r
flags
,
xflags
,
&
pat_len
,
&
new_
r
flags
);
if
(
!
cp
)
break
;
...
...
@@ -1064,7 +1064,7 @@ void parse_rule(struct filter_list_struct *listp, const char *pattern,
continue
;
}
if
(
new_
mflags
&
MATCHFLG
_CLEAR_LIST
)
{
if
(
new_
rflags
&
FILTRULE
_CLEAR_LIST
)
{
if
(
DEBUG_GTE
(
FILTER
,
2
))
{
rprintf
(
FINFO
,
"[%s] clearing filter list%s
\n
"
,
...
...
@@ -1074,54 +1074,54 @@ void parse_rule(struct filter_list_struct *listp, const char *pattern,
continue
;
}
if
(
new_
mflags
&
MATCHFLG
_MERGE_FILE
)
{
if
(
new_
rflags
&
FILTRULE
_MERGE_FILE
)
{
unsigned
int
len
;
if
(
!
pat_len
)
{
cp
=
".cvsignore"
;
pat_len
=
10
;
}
len
=
pat_len
;
if
(
new_
mflags
&
MATCHFLG
_EXCLUDE_SELF
)
{
if
(
new_
rflags
&
FILTRULE
_EXCLUDE_SELF
)
{
const
char
*
name
=
cp
+
len
;
while
(
name
>
cp
&&
name
[
-
1
]
!=
'/'
)
name
--
;
len
-=
name
-
cp
;
add_rule
(
listp
,
name
,
len
,
0
,
0
);
new_
mflags
&=
~
MATCHFLG
_EXCLUDE_SELF
;
new_
rflags
&=
~
FILTRULE
_EXCLUDE_SELF
;
len
=
pat_len
;
}
if
(
new_
mflags
&
MATCHFLG
_PERDIR_MERGE
)
{
if
(
new_
rflags
&
FILTRULE
_PERDIR_MERGE
)
{
if
(
parent_dirscan
)
{
if
(
!
(
p
=
parse_merge_name
(
cp
,
&
len
,
module_dirlen
)))
continue
;
add_rule
(
listp
,
p
,
len
,
new_
m
flags
,
0
);
add_rule
(
listp
,
p
,
len
,
new_
r
flags
,
0
);
continue
;
}
}
else
{
if
(
!
(
p
=
parse_merge_name
(
cp
,
&
len
,
0
)))
continue
;
parse_filter_file
(
listp
,
p
,
new_
m
flags
,
parse_filter_file
(
listp
,
p
,
new_
r
flags
,
XFLG_FATAL_ERRORS
);
continue
;
}
}
add_rule
(
listp
,
cp
,
pat_len
,
new_
m
flags
,
xflags
);
add_rule
(
listp
,
cp
,
pat_len
,
new_
r
flags
,
xflags
);
if
(
new_
mflags
&
MATCHFLG
_CVS_IGNORE
&&
!
(
new_
mflags
&
MATCHFLG
_MERGE_FILE
))
get_cvs_excludes
(
new_
m
flags
);
if
(
new_
rflags
&
FILTRULE
_CVS_IGNORE
&&
!
(
new_
rflags
&
FILTRULE
_MERGE_FILE
))
get_cvs_excludes
(
new_
r
flags
);
}
}
void
parse_filter_file
(
struct
filter_list_struct
*
listp
,
const
char
*
fname
,
uint32
m
flags
,
int
xflags
)
uint32
r
flags
,
int
xflags
)
{
FILE
*
fp
;
char
line
[
BIGPATHBUFLEN
];
char
*
eob
=
line
+
sizeof
line
-
1
;
int
word_split
=
mflags
&
MATCHFLG
_WORD_SPLIT
;
int
word_split
=
rflags
&
FILTRULE
_WORD_SPLIT
;
if
(
!
fname
||
!*
fname
)
return
;
...
...
@@ -1141,7 +1141,7 @@ void parse_filter_file(struct filter_list_struct *listp, const char *fname,
if
(
DEBUG_GTE
(
FILTER
,
2
))
{
rprintf
(
FINFO
,
"[%s] parse_filter_file(%s,%x,%x)%s
\n
"
,
who_am_i
(),
fname
,
m
flags
,
xflags
,
who_am_i
(),
fname
,
r
flags
,
xflags
,
fp
?
""
:
" [not found]"
);
}
...
...
@@ -1149,7 +1149,7 @@ void parse_filter_file(struct filter_list_struct *listp, const char *fname,
if
(
xflags
&
XFLG_FATAL_ERRORS
)
{
rsyserr
(
FERROR
,
errno
,
"failed to open %sclude file %s"
,
mflags
&
MATCHFLG
_INCLUDE
?
"in"
:
"ex"
,
rflags
&
FILTRULE
_INCLUDE
?
"in"
:
"ex"
,
fname
);
exit_cleanup
(
RERR_FILEIO
);
}
...
...
@@ -1184,7 +1184,7 @@ void parse_filter_file(struct filter_list_struct *listp, const char *fname,
*
s
=
'\0'
;
/* Skip an empty token and (when line parsing) comments. */
if
(
*
line
&&
(
word_split
||
(
*
line
!=
';'
&&
*
line
!=
'#'
)))
parse_rule
(
listp
,
line
,
m
flags
,
xflags
);
parse_rule
(
listp
,
line
,
r
flags
,
xflags
);
if
(
ch
==
EOF
)
break
;
}
...
...
@@ -1194,18 +1194,18 @@ void parse_filter_file(struct filter_list_struct *listp, const char *fname,
/* If the "for_xfer" flag is set, the prefix is made compatible with the
* current protocol_version (if possible) or a NULL is returned (if not
* possible). */
char
*
get_rule_prefix
(
int
match_
flags
,
const
char
*
pat
,
int
for_xfer
,
char
*
get_rule_prefix
(
int
r
flags
,
const
char
*
pat
,
int
for_xfer
,
unsigned
int
*
plen_ptr
)
{
static
char
buf
[
MAX_RULE_PREFIX
+
1
];
char
*
op
=
buf
;
int
legal_len
=
for_xfer
&&
protocol_version
<
29
?
1
:
MAX_RULE_PREFIX
-
1
;
if
(
match_flags
&
MATCHFLG
_PERDIR_MERGE
)
{
if
(
rflags
&
FILTRULE
_PERDIR_MERGE
)
{
if
(
legal_len
==
1
)
return
NULL
;
*
op
++
=
':'
;
}
else
if
(
match_flags
&
MATCHFLG
_INCLUDE
)
}
else
if
(
rflags
&
FILTRULE
_INCLUDE
)
*
op
++
=
'+'
;
else
if
(
legal_len
!=
1
||
((
*
pat
==
'-'
||
*
pat
==
'+'
)
&&
pat
[
1
]
==
' '
))
...
...
@@ -1213,32 +1213,32 @@ char *get_rule_prefix(int match_flags, const char *pat, int for_xfer,
else
legal_len
=
0
;
if
(
match_flags
&
MATCHFLG
_NEGATE
)
if
(
rflags
&
FILTRULE
_NEGATE
)
*
op
++
=
'!'
;
if
(
match_flags
&
MATCHFLG
_CVS_IGNORE
)
if
(
rflags
&
FILTRULE
_CVS_IGNORE
)
*
op
++
=
'C'
;
else
{
if
(
match_flags
&
MATCHFLG
_NO_INHERIT
)
if
(
rflags
&
FILTRULE
_NO_INHERIT
)
*
op
++
=
'n'
;
if
(
match_flags
&
MATCHFLG
_WORD_SPLIT
)
if
(
rflags
&
FILTRULE
_WORD_SPLIT
)
*
op
++
=
'w'
;
if
(
match_flags
&
MATCHFLG
_NO_PREFIXES
)
{
if
(
match_flags
&
MATCHFLG
_INCLUDE
)
if
(
rflags
&
FILTRULE
_NO_PREFIXES
)
{
if
(
rflags
&
FILTRULE
_INCLUDE
)
*
op
++
=
'+'
;
else
*
op
++
=
'-'
;
}
}
if
(
match_flags
&
MATCHFLG
_EXCLUDE_SELF
)
if
(
rflags
&
FILTRULE
_EXCLUDE_SELF
)
*
op
++
=
'e'
;
if
(
match_flags
&
MATCHFLG
_SENDER_SIDE
if
(
rflags
&
FILTRULE
_SENDER_SIDE
&&
(
!
for_xfer
||
protocol_version
>=
29
))
*
op
++
=
's'
;
if
(
match_flags
&
MATCHFLG
_RECEIVER_SIDE
if
(
rflags
&
FILTRULE
_RECEIVER_SIDE
&&
(
!
for_xfer
||
protocol_version
>=
29
||
(
delete_excluded
&&
am_sender
)))
*
op
++
=
'r'
;
if
(
match_flags
&
MATCHFLG
_PERISHABLE
)
{
if
(
rflags
&
FILTRULE
_PERISHABLE
)
{
if
(
!
for_xfer
||
protocol_version
>=
30
)
*
op
++
=
'p'
;
else
if
(
am_sender
)
...
...
@@ -1270,13 +1270,13 @@ static void send_rules(int f_out, struct filter_list_struct *flp)
* backward compatibility problem, and we elide any no-prefix
* merge files as an optimization (since they can only have
* include/exclude rules). */
if
(
ent
->
match_flags
&
MATCHFLG
_SENDER_SIDE
)
if
(
ent
->
rflags
&
FILTRULE
_SENDER_SIDE
)
elide
=
am_sender
?
1
:
-
1
;
if
(
ent
->
match_flags
&
MATCHFLG
_RECEIVER_SIDE
)
if
(
ent
->
rflags
&
FILTRULE
_RECEIVER_SIDE
)
elide
=
elide
?
0
:
am_sender
?
-
1
:
1
;
else
if
(
delete_excluded
&&
!
elide
&&
(
!
(
ent
->
match_flags
&
MATCHFLG
_PERDIR_MERGE
)
||
ent
->
match_flags
&
MATCHFLG
_NO_PREFIXES
))
&&
(
!
(
ent
->
rflags
&
FILTRULE
_PERDIR_MERGE
)
||
ent
->
rflags
&
FILTRULE
_NO_PREFIXES
))
elide
=
am_sender
?
1
:
-
1
;
if
(
elide
<
0
)
{
if
(
prev
)
...
...
@@ -1287,14 +1287,14 @@ static void send_rules(int f_out, struct filter_list_struct *flp)
prev
=
ent
;
if
(
elide
>
0
)
continue
;
if
(
ent
->
match_flags
&
MATCHFLG
_CVS_IGNORE
&&
!
(
ent
->
match_flags
&
MATCHFLG
_MERGE_FILE
))
{
if
(
ent
->
rflags
&
FILTRULE
_CVS_IGNORE
&&
!
(
ent
->
rflags
&
FILTRULE
_MERGE_FILE
))
{
int
f
=
am_sender
||
protocol_version
<
29
?
f_out
:
-
2
;
send_rules
(
f
,
&
cvs_filter_list
);
if
(
f
==
f_out
)
continue
;
}
p
=
get_rule_prefix
(
ent
->
match_
flags
,
ent
->
pattern
,
1
,
&
plen
);
p
=
get_rule_prefix
(
ent
->
r
flags
,
ent
->
pattern
,
1
,
&
plen
);
if
(
!
p
)
{
rprintf
(
FERROR
,
"filter rules are too modern for remote rsync.
\n
"
);
...
...
@@ -1303,7 +1303,7 @@ static void send_rules(int f_out, struct filter_list_struct *flp)
if
(
f_out
<
0
)
continue
;
len
=
strlen
(
ent
->
pattern
);
dlen
=
ent
->
match_flags
&
MATCHFLG
_DIRECTORY
?
1
:
0
;
dlen
=
ent
->
rflags
&
FILTRULE
_DIRECTORY
?
1
:
0
;
if
(
!
(
plen
+
len
+
dlen
))
continue
;
write_int
(
f_out
,
plen
+
len
+
dlen
);
...
...
options.c
View file @
b32d4254
...
...
@@ -1409,7 +1409,7 @@ int parse_arguments(int *argc_p, const char ***argv_p)
case
OPT_INCLUDE
:
parse_rule
(
&
filter_list
,
poptGetOptArg
(
pc
),
MATCHFLG
_INCLUDE
,
XFLG_OLD_PREFIXES
);
FILTRULE
_INCLUDE
,
XFLG_OLD_PREFIXES
);
break
;
case
OPT_EXCLUDE_FROM
:
...
...
@@ -1432,7 +1432,7 @@ int parse_arguments(int *argc_p, const char ***argv_p)
goto
options_rejected
;
}
parse_filter_file
(
&
filter_list
,
arg
,
opt
==
OPT_INCLUDE_FROM
?
MATCHFLG
_INCLUDE
:
0
,
opt
==
OPT_INCLUDE_FROM
?
FILTRULE
_INCLUDE
:
0
,
XFLG_FATAL_ERRORS
|
XFLG_OLD_PREFIXES
);
break
;
...
...
rsync.h
View file @
b32d4254
...
...
@@ -798,36 +798,36 @@ struct map_struct {
int
status
;
/* first errno from read errors */
};
#define
MATCHFLG
_WILD (1<<0)
/* pattern has '*', '[', and/or '?' */
#define
MATCHFLG
_WILD2 (1<<1)
/* pattern has '**' */
#define
MATCHFLG
_WILD2_PREFIX (1<<2)
/* pattern starts with "**" */
#define
MATCHFLG
_WILD3_SUFFIX (1<<3)
/* pattern ends with "***" */
#define
MATCHFLG
_ABS_PATH (1<<4)
/* path-match on absolute path */
#define
MATCHFLG
_INCLUDE (1<<5)
/* this is an include, not an exclude */
#define
MATCHFLG
_DIRECTORY (1<<6)
/* this matches only directories */
#define
MATCHFLG
_WORD_SPLIT (1<<7)
/* split rules on whitespace */
#define
MATCHFLG
_NO_INHERIT (1<<8)
/* don't inherit these rules */
#define
MATCHFLG
_NO_PREFIXES (1<<9)
/* parse no prefixes from patterns */
#define
MATCHFLG
_MERGE_FILE (1<<10)
/* specifies a file to merge */
#define
MATCHFLG
_PERDIR_MERGE (1<<11)
/* merge-file is searched per-dir */
#define
MATCHFLG
_EXCLUDE_SELF (1<<12)
/* merge-file name should be excluded */
#define
MATCHFLG
_FINISH_SETUP (1<<13)
/* per-dir merge file needs setup */
#define
MATCHFLG
_NEGATE (1<<14)
/* rule matches when pattern does not */
#define
MATCHFLG
_CVS_IGNORE (1<<15)
/* rule was -C or :C */
#define
MATCHFLG
_SENDER_SIDE (1<<16)
/* rule applies to the sending side */
#define
MATCHFLG
_RECEIVER_SIDE (1<<17)
/* rule applies to the receiving side */
#define
MATCHFLG_CLEAR_LIST
(1<<18)
/* this item is the "!" token */
#define
MATCHFLG
_PERISHABLE (1<<19)
/* perishable if parent dir goes away */
#define
MATCHFLGS_FROM_CONTAINER (MATCHFLG_ABS_PATH | MATCHFLG
_INCLUDE \
|
MATCHFLG_DIRECTORY | MATCHFLG
_SENDER_SIDE \
|
MATCHFLG_NEGATE | MATCHFLG
_RECEIVER_SIDE \
|
MATCHFLG
_PERISHABLE)
#define
FILTRULE
_WILD (1<<0)
/* pattern has '*', '[', and/or '?' */
#define
FILTRULE
_WILD2 (1<<1)
/* pattern has '**' */
#define
FILTRULE
_WILD2_PREFIX (1<<2)
/* pattern starts with "**" */
#define
FILTRULE
_WILD3_SUFFIX (1<<3)
/* pattern ends with "***" */
#define
FILTRULE
_ABS_PATH (1<<4)
/* path-match on absolute path */
#define
FILTRULE
_INCLUDE (1<<5)
/* this is an include, not an exclude */
#define
FILTRULE
_DIRECTORY (1<<6)
/* this matches only directories */
#define
FILTRULE
_WORD_SPLIT (1<<7)
/* split rules on whitespace */
#define
FILTRULE
_NO_INHERIT (1<<8)
/* don't inherit these rules */
#define
FILTRULE
_NO_PREFIXES (1<<9)
/* parse no prefixes from patterns */
#define
FILTRULE
_MERGE_FILE (1<<10)
/* specifies a file to merge */
#define
FILTRULE
_PERDIR_MERGE (1<<11)
/* merge-file is searched per-dir */
#define
FILTRULE
_EXCLUDE_SELF (1<<12)
/* merge-file name should be excluded */
#define
FILTRULE
_FINISH_SETUP (1<<13)
/* per-dir merge file needs setup */
#define
FILTRULE
_NEGATE (1<<14)
/* rule matches when pattern does not */
#define
FILTRULE
_CVS_IGNORE (1<<15)
/* rule was -C or :C */
#define
FILTRULE
_SENDER_SIDE (1<<16)
/* rule applies to the sending side */
#define
FILTRULE
_RECEIVER_SIDE (1<<17)
/* rule applies to the receiving side */
#define
FILTRULE_CLEAR_LIST
(1<<18)
/* this item is the "!" token */
#define
FILTRULE
_PERISHABLE (1<<19)
/* perishable if parent dir goes away */
#define
FILTRULES_FROM_CONTAINER (FILTRULE_ABS_PATH | FILTRULE
_INCLUDE \
|
FILTRULE_DIRECTORY | FILTRULE
_SENDER_SIDE \
|
FILTRULE_NEGATE | FILTRULE
_RECEIVER_SIDE \
|
FILTRULE
_PERISHABLE)
struct
filter_struct
{
struct
filter_struct
*
next
;
char
*
pattern
;
uint32
match_
flags
;
uint32
r
flags
;
union
{
int
slash_cnt
;
struct
filter_list_struct
*
mergelist
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment