From e07cbd10f59a8197a0b5fc789ea3781a863548e8 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Sat, 29 Oct 2016 16:24:23 -0400 Subject: Implement -perm. --- eval.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'eval.c') diff --git a/eval.c b/eval.c index f930bac..54d9a7c 100644 --- a/eval.c +++ b/eval.c @@ -635,6 +635,37 @@ bool eval_path(const struct expr *expr, struct eval_state *state) { return fnmatch(expr->sdata, ftwbuf->path, expr->idata) == 0; } +/** + * -perm test. + */ +bool eval_perm(const struct expr *expr, struct eval_state *state) { + const struct stat *statbuf = fill_statbuf(state); + if (!statbuf) { + return false; + } + + mode_t mode = statbuf->st_mode; + mode_t target; + if (state->ftwbuf->typeflag == BFTW_DIR) { + target = expr->dir_mode; + } else { + target = expr->file_mode; + } + + switch (expr->mode_cmp) { + case MODE_EXACT: + return (mode & 07777) == target; + + case MODE_ALL: + return (mode & target) == target; + + case MODE_ANY: + return !(mode & target) == !target; + } + + return false; +} + /** * -print action. */ -- cgit v1.2.3