+static void free_regex(regex_t *preg)
+{
+ if (!preg)
+ return;
+ regfree(preg);
+ free(preg);
+}
+
+static int compile_regex(regex_t **preg, int *invert)
+{
+ int ret;
+ size_t size;
+ char *buf, *p = select_conf.pattern_arg;
+
+ if (!select_conf.pattern_given || !p[0]) {
+ *preg = NULL;
+ return 0;
+ }
+ if (p[0] == '!') {
+ if (!p[1]) {
+ *preg = NULL;
+ return -E_REGEX;
+ }
+ *invert = 1;
+ p++;
+ } else
+ *invert = 0;
+ *preg = adu_malloc(sizeof(regex_t));
+ ret = regcomp(*preg, p, 0);
+ if (!ret)
+ return 1;
+ size = regerror(ret, *preg, NULL, 0);
+ buf = adu_malloc(size);
+ regerror(ret, *preg, buf, size);
+ ERROR_LOG("%s\n", buf);
+ free(buf);
+ free_regex(*preg);
+ *preg = NULL;
+ return -E_REGEX;
+}
+
+static int dir_is_admissible(char *dirname, regex_t *preg, int inverse_matching)
+{
+ int ret;
+
+ if (!preg)
+ return 1;
+ ret = regexec(preg, dirname, 0, NULL, 0);
+ if (ret == REG_NOMATCH && !inverse_matching)
+ return 0;
+ if (ret != REG_NOMATCH && inverse_matching)
+ return 0;
+ return 1;
+}
+