summaryrefslogtreecommitdiffstats
path: root/src/bfstd.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2024-01-13 12:42:42 -0500
committerTavian Barnes <tavianator@tavianator.com>2024-01-13 12:42:42 -0500
commite9588c49d5539ded993f720fc6855d6fa878c997 (patch)
treed827157c37f59335252ba874fd41604984775471 /src/bfstd.c
parentd6cae04b54c1d58223e1719101b7c54d348e8d80 (diff)
downloadbfs-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.c23
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) {