diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2017-09-06 22:42:26 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2017-09-06 22:42:26 -0400 |
commit | 4504dd3599404a916f104e0c715a9bcf3fb0062b (patch) | |
tree | 7cf605481dae9ce89096c429c634e70ee7c9240e | |
parent | c3dcb94d52ea36bc1cefa2ccd4a7f305ba4df889 (diff) | |
download | bfs-4504dd3599404a916f104e0c715a9bcf3fb0062b.tar.xz |
util: Factor out checks for nonexistent paths/broken links
-rw-r--r-- | eval.c | 4 | ||||
-rw-r--r-- | util.c | 6 | ||||
-rw-r--r-- | util.h | 5 |
3 files changed, 12 insertions, 3 deletions
@@ -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 { @@ -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); } @@ -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 |