From 863b70d198f62f28581162473a521208dd67879e Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Sat, 6 Mar 2021 13:40:24 -0500 Subject: Implement -flags, from FreeBSD find This is the last BSD-specific primary I'm aware of. Fixes #14. --- eval.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'eval.c') diff --git a/eval.c b/eval.c index a72be86..df047f0 100644 --- a/eval.c +++ b/eval.c @@ -441,6 +441,39 @@ done: return ret; } +/** + * -flags test. + */ +bool eval_flags(const struct expr *expr, struct eval_state *state) { + const struct bfs_stat *statbuf = eval_stat(state); + if (!statbuf) { + return false; + } + + if (!(statbuf->mask & BFS_STAT_ATTRS)) { + eval_error(state, "Couldn't get file %s.\n", bfs_stat_field_name(BFS_STAT_ATTRS)); + return false; + } + + unsigned long flags = statbuf->attrs; + unsigned long set = expr->set_flags; + unsigned long clear = expr->clear_flags; + + switch (expr->mode_cmp) { + case MODE_EXACT: + return flags == set && !(flags & clear); + + case MODE_ALL: + return (flags & set) == set && !(flags & clear); + + case MODE_ANY: + return (flags & set) || (flags & clear) != clear; + } + + assert(!"Invalid comparison mode"); + return false; +} + /** * -fstype test. */ @@ -590,6 +623,7 @@ bool eval_perm(const struct expr *expr, struct eval_state *state) { return !(mode & target) == !target; } + assert(!"Invalid comparison mode"); return false; } -- cgit v1.2.3