From 4504dd3599404a916f104e0c715a9bcf3fb0062b Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Wed, 6 Sep 2017 22:42:26 -0400 Subject: util: Factor out checks for nonexistent paths/broken links --- eval.c | 4 ++-- util.c | 6 +++++- util.h | 5 +++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/eval.c b/eval.c index 03c3d91..a387bdc 100644 --- a/eval.c +++ b/eval.c @@ -56,7 +56,7 @@ struct eval_state { */ static bool eval_should_ignore(const struct eval_state *state, int error) { return state->cmdline->ignore_races - && (error == ENOENT || errno == ENOTDIR) + && is_nonexistence_error(error) && state->ftwbuf->depth > 0; } @@ -829,7 +829,7 @@ bool eval_xtype(const struct expr *expr, struct eval_state *state) { struct stat sb; if (fstatat(ftwbuf->at_fd, ftwbuf->at_path, &sb, at_flags) != 0) { - if (!follow && (errno == ENOENT || errno == ENOTDIR)) { + if (!follow && is_nonexistence_error(errno)) { // Broken symlink return eval_type(expr, state); } else { diff --git a/util.c b/util.c index 5b2b3a9..bdb3620 100644 --- a/util.c +++ b/util.c @@ -226,10 +226,14 @@ const char *xbasename(const char *path) { return i; } +bool is_nonexistence_error(int error) { + return error == ENOENT || errno == ENOTDIR; +} + int xfstatat(int fd, const char *path, struct stat *buf, int flags) { int ret = fstatat(fd, path, buf, flags); - if (ret != 0 && !(flags & AT_SYMLINK_NOFOLLOW) && (errno == ENOENT || errno == ENOTDIR)) { + if (ret != 0 && !(flags & AT_SYMLINK_NOFOLLOW) && is_nonexistence_error(errno)) { flags |= AT_SYMLINK_NOFOLLOW; ret = fstatat(fd, path, buf, flags); } diff --git a/util.h b/util.h index e23acdc..57123e0 100644 --- a/util.h +++ b/util.h @@ -142,6 +142,11 @@ void format_mode(mode_t mode, char str[11]); */ const char *xbasename(const char *path); +/** + * Return whether an error code is due to a path not existing. + */ +bool is_nonexistence_error(int error); + /** * stat() a file, falling back on the link itself for broken symbolic links. * -- cgit v1.2.3