diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2024-01-13 12:42:42 -0500 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2024-01-13 12:42:42 -0500 |
commit | e9588c49d5539ded993f720fc6855d6fa878c997 (patch) | |
tree | d827157c37f59335252ba874fd41604984775471 /src/bfstd.c | |
parent | d6cae04b54c1d58223e1719101b7c54d348e8d80 (diff) | |
download | bfs-e9588c49d5539ded993f720fc6855d6fa878c997.tar.xz |
bfstd: New {error,errno}_is_like() functions
We used to have is_nonexistence_error() to consistently treat ENOENT and
ENOTDIR the same. Recently, we started considering EFAULT the same as
ENAMETOOLONG on DragonFly BSD to work around a kernel bug. Unify both
of these behind a more generic interface.
Diffstat (limited to 'src/bfstd.c')
-rw-r--r-- | src/bfstd.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/bfstd.c b/src/bfstd.c index c0e61cb..15e8667 100644 --- a/src/bfstd.c +++ b/src/bfstd.c @@ -36,8 +36,27 @@ # include <util.h> #endif -bool is_nonexistence_error(int error) { - return error == ENOENT || errno == ENOTDIR; +bool error_is_like(int error, int category) { + if (error == category) { + return true; + } + + switch (category) { + case ENOENT: + return error == ENOTDIR; + +#if __DragonFly__ + // https://twitter.com/tavianator/status/1742991411203485713 + case ENAMETOOLONG: + return error == EFAULT; +#endif + } + + return false; +} + +bool errno_is_like(int category) { + return error_is_like(errno, category); } char *xdirname(const char *path) { |