A simple patch for adding last-match filter-rule files.
authorWayne Davison <wayned@samba.org>
Sun, 27 Feb 2005 07:40:09 +0000 (07:40 +0000)
committerWayne Davison <wayned@samba.org>
Sun, 27 Feb 2005 07:40:09 +0000 (07:40 +0000)
last-match.diff [new file with mode: 0644]

diff --git a/last-match.diff b/last-match.diff
new file mode 100644 (file)
index 0000000..0421349
--- /dev/null
@@ -0,0 +1,61 @@
+This adds the ability to put rules into a filter/include/exclude file
+in last-match-wins order.  All you need to do is to start the file with
+this line:
+
+[last-match]
+
+--- orig/exclude.c     2005-02-26 03:22:59
++++ exclude.c  2005-02-26 03:22:20
+@@ -73,6 +73,7 @@ static BOOL parent_dirscan = False;
+ static struct filter_struct **mergelist_parents;
+ static int mergelist_cnt = 0;
+ static int mergelist_size = 0;
++static int reversing_rules = 0;
+ /* Each filter_list_struct describes a singly-linked list by keeping track
+  * of both the head and tail pointers.  The list is slightly unusual in that
+@@ -231,6 +232,9 @@ static void add_rule(struct filter_list_
+       if (!listp->tail) {
+               ret->next = listp->head;
+               listp->head = listp->tail = ret;
++      } else if (reversing_rules) {
++              ret->next = listp->head;
++              listp->head = ret;
+       } else {
+               ret->next = listp->tail->next;
+               listp->tail->next = ret;
+@@ -959,6 +963,7 @@ void parse_filter_file(struct filter_lis
+       char line[MAXPATHLEN+MAX_RULE_PREFIX+1]; /* +1 for trailing slash. */
+       char *eob = line + sizeof line - 1;
+       int word_split = mflags & MATCHFLG_WORD_SPLIT;
++      int save_reversing_rules = reversing_rules;
+       if (!fname || !*fname)
+               return;
+@@ -994,6 +999,7 @@ void parse_filter_file(struct filter_lis
+       }
+       dirbuf[dirbuf_len] = '\0';
++      reversing_rules = 0;
+       while (1) {
+               char *s = line;
+               int ch, overflow = 0;
+@@ -1017,6 +1023,10 @@ void parse_filter_file(struct filter_lis
+                       s = line;
+               }
+               *s = '\0';
++              if (*line == '[' && strcmp(line+1, "last-match]") == 0) {
++                      reversing_rules = 1;
++                      continue;
++              }
+               /* Skip an empty token and (when line parsing) comments. */
+               if (*line && (word_split || (*line != ';' && *line != '#')))
+                       parse_rule(listp, line, mflags, xflags);
+@@ -1024,6 +1034,7 @@ void parse_filter_file(struct filter_lis
+                       break;
+       }
+       fclose(fp);
++      reversing_rules = save_reversing_rules;
+ }
+ /* If the "for_xfer" flag is set, the prefix is made compatible with the