static struct exclude_struct **exclude_list;
-/*
- * Optimization for special case when all included files are explicitly
- * listed without wildcards in the "exclude" list followed by a "- *"
- * to exclude the rest.
- * Contributed by Dave Dykstra <dwd@bell-labs.com>
- */
-static int only_included_files = 1;
-static struct exclude_struct *exclude_the_rest;
-
-int send_included_file_names(int f,struct file_list *flist)
-{
- struct exclude_struct *ex, **ex_list;
- int n;
- char *p;
-
- if (!only_included_files || (exclude_the_rest == NULL) || delete_mode)
- return 0;
-
- if (verbose > 1) {
- rprintf(FINFO,"(using include-only optimization) ");
- }
-
- /* set exclude_list to NULL temporarily so check_exclude */
- /* will always return true */
- ex_list = exclude_list;
- exclude_list = NULL;
- for (n=0; (ex = ex_list[n]) != NULL; n++) {
- if (ex == exclude_the_rest)
- break;
- p = ex->pattern;
- while (*p == '/') {
- /* skip the allowed beginning slashes */
- p++;
- }
- /* silently skip files that don't exist to
- be more like non-optimized case */
- if (access(p,0) == 0)
- send_file_name(f,flist,p,0,0);
- }
- exclude_list = ex_list;
-
- return 1;
-}
-
/* build an exclude structure given a exclude pattern */
static struct exclude_struct *make_exclude(char *pattern, int include)
{
if (!ret->pattern) out_of_memory("make_exclude");
if (strpbrk(pattern, "*[?")) {
- if (!ret->include && (*pattern == '*') && (*(pattern+1) == '\0')) {
- exclude_the_rest = ret;
- } else {
- only_included_files = 0;
- }
ret->regular_exp = 1;
ret->fnmatch_flags = strstr(pattern, "**") ? 0 : FNM_PATHNAME;
- } else if (!ret->include) {
- only_included_files = 0;
}
if (strlen(pattern) > 1 && pattern[strlen(pattern)-1] == '/') {
}
free((*list));
*list = NULL;
- only_included_files = 1;
- exclude_the_rest = NULL;
return;
}
}
for (i=0;exclude_list[i];i++) {
- char *pattern = exclude_list[i]->pattern;
int l;
+ char pattern[MAXPATHLEN];
+
+ strlcpy(pattern,exclude_list[i]->pattern,sizeof(pattern));
+ if (exclude_list[i]->directory) strlcat(pattern,"/", sizeof(pattern));
l = strlen(pattern);
if (l == 0) continue;