From 585a9dafe86b51a2d120d107bb04a77b34cc1af0 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Sun, 14 Feb 2016 13:35:23 -0500 Subject: Implement -lname and -ilname. --- eval.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 63c1348..26596f0 100644 --- a/eval.c +++ b/eval.c @@ -307,6 +307,42 @@ bool eval_links(const struct expr *expr, struct eval_state *state) { return do_cmp(expr, statbuf->st_nlink); } +/** + * -i?lname test. + */ +bool eval_lname(const struct expr *expr, struct eval_state *state) { + struct BFTW *ftwbuf = state->ftwbuf; + if (ftwbuf->typeflag != BFTW_LNK) { + return false; + } + + const struct stat *statbuf = fill_statbuf(state); + if (!statbuf) { + return false; + } + + size_t size = statbuf->st_size + 1; + char *name = malloc(size); + if (!name) { + eval_error(state); + return false; + } + + ssize_t ret = readlinkat(ftwbuf->at_fd, ftwbuf->at_path, name, size); + if (ret < 0) { + eval_error(state); + return false; + } else if (ret >= size) { + return false; + } + + name[ret] = '\0'; + + bool match = fnmatch(expr->sdata, name, expr->idata) == 0; + free(name); + return match; +} + /** * -i?name test. */ -- cgit v1.2.3