+
+struct exclude_tag
+{
+ const char *name;
+ size_t length;
+ struct exclude_tag *next;
+};
+
+static struct exclude_tag *exclude_tags;
+
+void
+add_exclude_tag (const char *name)
+{
+ struct exclude_tag *tag = xmalloc (sizeof tag[0]);
+ tag->next = exclude_tags;
+ tag->name = name;
+ tag->length = strlen (name);
+ exclude_tags = tag;
+}
+
+static bool
+check_exclude_tags (char *dirname)
+{
+ static char *tagname;
+ static size_t tagsize;
+ struct exclude_tag *tag;
+ size_t dlen = strlen (dirname);
+ char *nptr = NULL;
+ char *ret = NULL;
+
+ for (tag = exclude_tags; tag; tag = tag->next)
+ {
+ size_t size = dlen + tag->length + 1;
+ if (size > tagsize)
+ {
+ tagsize = size;
+ tagname = xrealloc (tagname, tagsize);
+ }
+
+ if (!nptr)
+ {
+ strcpy (tagname, dirname);
+ nptr = tagname + dlen;
+ }
+ strcpy (nptr, tag->name);
+ if (access (tagname, F_OK) == 0)
+ {
+ if (verbose_option)
+ WARN ((0, 0,
+ _("%s: contains a cache directory tag %s; not dumped"),
+ quotearg_colon (dirname),
+ quotearg_n (1, tag->name)));
+ return true;
+ }
+ }
+
+ return false;
+}
+