summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2017-09-06 22:42:26 -0400
committerTavian Barnes <tavianator@tavianator.com>2017-09-06 22:42:26 -0400
commit4504dd3599404a916f104e0c715a9bcf3fb0062b (patch)
tree7cf605481dae9ce89096c429c634e70ee7c9240e
parentc3dcb94d52ea36bc1cefa2ccd4a7f305ba4df889 (diff)
downloadbfs-4504dd3599404a916f104e0c715a9bcf3fb0062b.tar.xz
util: Factor out checks for nonexistent paths/broken links
-rw-r--r--eval.c4
-rw-r--r--util.c6
-rw-r--r--util.h5
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
@@ -143,6 +143,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.
*
* @param fd