X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/5be7fa93fc1ba106411801029fcd06093fe9a23b..76c21947140b90edaa5591c63b10ca00f939ad9b:/exclude.c diff --git a/exclude.c b/exclude.c index 3b8b7f0a..a459f295 100644 --- a/exclude.c +++ b/exclude.c @@ -40,7 +40,7 @@ static struct exclude_struct *make_exclude(const char *pattern, int include) char *cp; int pat_len; - ret = (struct exclude_struct *)malloc(sizeof(*ret)); + ret = new(struct exclude_struct); if (!ret) out_of_memory("make_exclude"); memset(ret, 0, sizeof(*ret)); @@ -57,8 +57,8 @@ static struct exclude_struct *make_exclude(const char *pattern, int include) if (exclude_path_prefix) ret->match_flags |= MATCHFLG_ABS_PATH; if (exclude_path_prefix && *pattern == '/') { - ret->pattern = malloc(strlen(exclude_path_prefix) - + strlen(pattern) + 1); + ret->pattern = new_array(char, + strlen(exclude_path_prefix) + strlen(pattern) + 1); if (!ret->pattern) out_of_memory("make_exclude"); sprintf(ret->pattern, "%s%s", exclude_path_prefix, pattern); } @@ -70,12 +70,6 @@ static struct exclude_struct *make_exclude(const char *pattern, int include) if (strpbrk(pattern, "*[?")) { ret->match_flags |= MATCHFLG_WILD; if (strstr(pattern, "**")) { - static int tested; - if (!tested) { - tested = 1; - if (fnmatch("a/b/*","a/b/c/d",FNM_PATHNAME)==0) - rprintf(FERROR,"WARNING: fnmatch FNM_PATHNAME is broken on your system\n"); - } ret->match_flags |= MATCHFLG_WILD2; /* If the pattern starts with **, note that. */ if (*pattern == '*' && pattern[1] == '*') @@ -155,8 +149,6 @@ static int check_one_exclude(char *name, struct exclude_struct *ex, } if (ex->match_flags & MATCHFLG_WILD) { - int fnmatch_flags = (ex->match_flags & MATCHFLG_WILD2)? - 0 : FNM_PATHNAME; /* A non-anchored match with an infix slash and no "**" * needs to match the last slash_cnt+1 name elements. */ if (!match_start && ex->slash_cnt && @@ -168,14 +160,13 @@ static int check_one_exclude(char *name, struct exclude_struct *ex, } name = p+1; } - if (fnmatch(pattern, name, fnmatch_flags) == 0) + if (wildmatch(pattern, name)) return 1; if (ex->match_flags & MATCHFLG_WILD2_PREFIX) { /* If the **-prefixed pattern has a '/' as the next * character, then try to match the rest of the * pattern at the root. */ - if (pattern[2] == '/' && - fnmatch(pattern+3, name, fnmatch_flags) == 0) + if (pattern[2] == '/' && wildmatch(pattern+3, name)) return 1; } else if (!match_start && ex->match_flags & MATCHFLG_WILD2) { @@ -184,7 +175,7 @@ static int check_one_exclude(char *name, struct exclude_struct *ex, * after every slash. */ while ((name = strchr(name, '/')) != NULL) { name++; - if (fnmatch(pattern, name, fnmatch_flags) == 0) + if (wildmatch(pattern, name)) return 1; } } @@ -254,7 +245,7 @@ void add_exclude(struct exclude_struct ***listp, const char *pattern, int includ if (list) for (; list[len]; len++) {} - list = *listp = (struct exclude_struct **)Realloc(list,sizeof(struct exclude_struct *)*(len+2)); + list = *listp = realloc_array(list, struct exclude_struct *, len+2); if (!list || !(list[len] = make_exclude(pattern, include))) out_of_memory("add_exclude"); @@ -325,7 +316,7 @@ void add_exclude_file(struct exclude_struct ***listp, const char *fname, void send_exclude_list(int f) { int i; - extern int remote_version; + extern int protocol_version; extern int list_only, recurse; /* This is a complete hack - blame Rusty. @@ -350,7 +341,7 @@ void send_exclude_list(int f) l = strlen(pattern); if (l == 0) continue; if (exclude_list[i]->include) { - if (remote_version < 19) { + if (protocol_version < 19) { rprintf(FERROR,"remote rsync does not support include syntax - aborting\n"); exit_cleanup(RERR_UNSUPPORTED); }