- Use dev_t instead of DEV64_T.
[rsync/rsync.git] / exclude.c
index ee8016f..1003f6a 100644 (file)
--- a/exclude.c
+++ b/exclude.c
@@ -43,7 +43,7 @@ static struct exclude_struct *make_exclude(const char *pattern, int include)
        ret = new(struct exclude_struct);
        if (!ret) out_of_memory("make_exclude");
 
-       memset(ret, 0, sizeof(*ret));
+       memset(ret, 0, sizeof ret[0]);
 
        if (strncmp(pattern,"- ",2) == 0) {
                pattern += 2;
@@ -92,7 +92,7 @@ static struct exclude_struct *make_exclude(const char *pattern, int include)
 static void free_exclude(struct exclude_struct *ex)
 {
        free(ex->pattern);
-       memset(ex,0,sizeof(*ex));
+       memset(ex, 0, sizeof ex[0]);
        free(ex);
 }
 
@@ -246,7 +246,7 @@ void add_exclude(struct exclude_struct ***listp, const char *pattern, int includ
        if (list)
                for (; list[len]; len++) {}
 
-       list = *listp = realloc_array(list, 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");
@@ -328,40 +328,46 @@ void send_exclude_list(int f)
                add_exclude(&exclude_list, "/*/*", ADD_EXCLUDE);
 
        if (!exclude_list) {
-               write_int(f,0);
+               write_int(f, 0);
                return;
        }
 
-       for (i=0;exclude_list[i];i++) {
-               int l;
-               char pattern[MAXPATHLEN];
+       for (i = 0; exclude_list[i]; i++) {
+               unsigned int l;
+               char p[MAXPATHLEN+1];
 
-               strlcpy(pattern,exclude_list[i]->pattern,sizeof(pattern));
-               if (exclude_list[i]->directory) strlcat(pattern,"/", sizeof(pattern));
+               l = strlcpy(p, exclude_list[i]->pattern, sizeof p);
+               if (l == 0 || l >= MAXPATHLEN)
+                       continue;
+               if (exclude_list[i]->directory) {
+                       p[l++] = '/';
+                       p[l] = '\0';
+               }
 
-               l = strlen(pattern);
-               if (l == 0) continue;
                if (exclude_list[i]->include) {
-                       write_int(f,l+2);
-                       write_buf(f,"+ ",2);
-               } else {
-                       write_int(f,l);
-               }
-               write_buf(f,pattern,l);
+                       write_int(f, l + 2);
+                       write_buf(f, "+ ", 2);
+               } else if ((*p == '-' || *p == '+') && p[1] == ' ') {
+                       write_int(f, l + 2);
+                       write_buf(f, "- ", 2);
+               } else
+                       write_int(f, l);
+               write_buf(f, p, l);
        }
 
-       write_int(f,0);
+       write_int(f, 0);
 }
 
 
 void recv_exclude_list(int f)
 {
-       char line[MAXPATHLEN];
+       char line[MAXPATHLEN+1]; /* Allows a trailing slash on a max-len dir */
        unsigned int l;
 
-       while ((l=read_int(f))) {
-               if (l >= MAXPATHLEN) overflow("recv_exclude_list");
-               read_sbuf(f,line,l);
+       while ((l = read_int(f)) != 0) {
+               if (l >= sizeof line)
+                       overflow("recv_exclude_list");
+               read_sbuf(f, line, l);
                add_exclude(&exclude_list, line, ADD_EXCLUDE);
        }
 }
@@ -442,7 +448,7 @@ void add_cvs_excludes(void)
        char *p;
        int i;
 
-       for (i=0; cvs_ignore_list[i]; i++)
+       for (i = 0; cvs_ignore_list[i]; i++)
                add_exclude(&exclude_list, cvs_ignore_list[i], ADD_EXCLUDE);
 
        if ((p = getenv("HOME"))