summaryrefslogtreecommitdiff
path: root/src/pathtrace.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pathtrace.c')
-rw-r--r--src/pathtrace.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/src/pathtrace.c b/src/pathtrace.c
index 6836816ce..28ae5bdda 100644
--- a/src/pathtrace.c
+++ b/src/pathtrace.c
@@ -8,6 +8,7 @@
*/
#include "defs.h"
+#include <fnmatch.h>
#include <limits.h>
#include <poll.h>
#include <sys/stat.h>
@@ -30,8 +31,16 @@ static bool
pathmatch(const char *path, struct path_set *set, enum path_trace_flags flags)
{
for (unsigned int i = 0; i < set->num_selected; ++i) {
- if (strcmp(path, set->paths_selected[i].path))
- continue;
+ enum path_trace_flags type =
+ ptf_type(set->paths_selected[i].flags);
+ if (type == PTF_TYPE_STR) {
+ if (strcmp(path, set->paths_selected[i].path))
+ continue;
+ } else if (type == PTF_TYPE_GLOB) {
+ if (fnmatch(set->paths_selected[i].path, path,
+ set->paths_selected[i].fnmatch_flags))
+ continue;
+ }
if (flags & set->paths_selected[i].flags & PTF_DELETED_MASK)
return true;
@@ -81,9 +90,24 @@ storepath(const char *path, enum path_trace_flags flags, struct path_set *set)
xgrowarray(set->paths_selected, &set->size,
sizeof(set->paths_selected[0]));
+ if (!(flags & PTF_DELETED_MASK))
+ flags |= PTF_DELETED_MASK;
+ if (!ptf_type(flags))
+ flags |= PTF_TYPE_STR;
+
+ if (ptf_type(flags) == PTF_TYPE_GLOB) {
+ int fnmf = 0;
+
+ if (!(flags & PTF_GLOB_PATH))
+ fnmf |= FNM_PATHNAME;
+ if (!(flags & PTF_GLOB_ALL))
+ fnmf |= FNM_PERIOD;
+
+ set->paths_selected[set->num_selected].fnmatch_flags = fnmf;
+ }
+
set->paths_selected[set->num_selected].path = path;
- set->paths_selected[set->num_selected].flags =
- flags | (!(flags & PTF_DELETED_MASK) ? PTF_DELETED_MASK : 0);
+ set->paths_selected[set->num_selected].flags = flags;
set->num_selected++;
}