use strlcat() strlcpy() and slprintf() whenever possible to avoid any
[rsync/rsync.git] / exclude.c
index 9a83741..901047e 100644 (file)
--- 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"))) {
-    sprintf(fname,"%s/.cvsignore",p);
-    add_exclude_file(fname,0);
+  if ((p=getenv("HOME")) && strlen(p) < (MAXPATHLEN-12)) {
+         slprintf(fname,sizeof(fname)-1, "%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"));
 }