X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/34ccb63e71367fb1f93530f60147ef6e4ac4e3e4..8f3a2d54a6d3ffa7eefa13478c67ccfa9a3df513:/exclude.c diff --git a/exclude.c b/exclude.c index 9a837411..d5c126fe 100644 --- a/exclude.c +++ b/exclude.c @@ -25,7 +25,7 @@ extern int verbose; -static char **exclude_list = NULL; +static char **exclude_list; static int is_regex(char *str) { @@ -42,6 +42,8 @@ static int check_one_exclude(char *name,char *pattern) if (!name[0]) return 0; + if (*pattern == '/' && *name != '/') pattern++; + if (is_regex(pattern)) { if (fnmatch(pattern, name, 0) == 0) return 1; @@ -86,7 +88,7 @@ void add_exclude_list(char *pattern,char ***list) if (strcmp(pattern,"!") == 0) { if (verbose > 2) - fprintf(stderr,"clearing exclude list\n"); + rprintf(FINFO,"clearing exclude list\n"); while ((len)--) free((*list)[len]); free((*list)); @@ -104,7 +106,7 @@ void add_exclude_list(char *pattern,char ***list) out_of_memory("add_exclude"); if (verbose > 2) - fprintf(stderr,"add_exclude(%s)\n",pattern); + rprintf(FINFO,"add_exclude(%s)\n",pattern); (*list)[len+1] = NULL; } @@ -121,7 +123,7 @@ char **make_exclude_list(char *fname,char **list1,int fatal) char line[MAXPATHLEN]; if (!f) { if (fatal) { - fprintf(stderr,"%s : %s\n",fname,strerror(errno)); + rprintf(FERROR,"%s : %s\n",fname,strerror(errno)); exit_cleanup(1); } return list; @@ -140,7 +142,9 @@ char **make_exclude_list(char *fname,char **list1,int fatal) void add_exclude_file(char *fname,int fatal) { - exclude_list = make_exclude_list(fname,exclude_list,fatal); + if (!fname || !*fname) return; + + exclude_list = make_exclude_list(fname,exclude_list,fatal); } @@ -163,13 +167,25 @@ void recv_exclude_list(int f) char line[MAXPATHLEN]; int l; while ((l=read_int(f))) { - read_buf(f,line,l); - line[l] = 0; - add_exclude(line); + if (l >= MAXPATHLEN) overflow("recv_exclude_list"); + read_sbuf(f,line,l); + add_exclude(line); } } +void add_exclude_line(char *p) +{ + char *tok; + if (!p || !*p) return; + p = strdup(p); + if (!p) out_of_memory("add_exclude_line"); + for (tok=strtok(p," "); tok; tok=strtok(NULL," ")) + add_exclude(tok); + free(p); +} + + static char *cvs_ignore_list[] = { "RCS","SCCS","CVS","CVS.adm","RCSLOG","cvslog.*", "tags","TAGS",".make.state",".nse_depinfo", @@ -188,14 +204,10 @@ void add_cvs_excludes(void) for (i=0; cvs_ignore_list[i]; i++) add_exclude(cvs_ignore_list[i]); - if ((p=getenv("HOME"))) { + if ((p=getenv("HOME")) && strlen(p) < (MAXPATHLEN-12)) { sprintf(fname,"%s/.cvsignore",p); add_exclude_file(fname,0); } - if ((p=getenv("CVSIGNORE"))) { - char *tok; - for (tok=strtok(p," "); tok; tok=strtok(NULL," ")) - add_exclude(tok); - } + add_exclude_line(getenv("CVSIGNORE")); }