+static int interesting(void *tree, unsigned long size, const char *base)
+{
+ const char *path;
+ unsigned mode;
+ int i;
+ int baselen, pathlen;
+
+ if (!nr_paths)
+ return 1;
+
+ (void)extract(tree, size, &path, &mode);
+
+ pathlen = strlen(path);
+ baselen = strlen(base);
+
+ for (i=0; i < nr_paths; i++) {
+ const char *match = paths[i];
+ int matchlen = pathlens[i];
+
+ if (baselen >= matchlen) {
+ /* If it doesn't match, move along... */
+ if (strncmp(base, match, matchlen))
+ continue;
+
+ /* The base is a subdirectory of a path which was specified. */
+ return 1;
+ }
+
+ /* Does the base match? */
+ if (strncmp(base, match, baselen))
+ continue;
+
+ match += baselen;
+ matchlen -= baselen;
+
+ if (pathlen > matchlen)
+ continue;
+
+ if (strncmp(path, match, pathlen))
+ continue;
+
+ return 1;
+ }
+ return 0; /* No matches */
+}
+