summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2021-04-20 22:15:00 +0000
committermidipix <writeonce@midipix.org>2021-04-20 19:27:27 +0000
commit6f24f4acd132670fd7edcaf2d87c4d465ae359ef (patch)
treefd47234f678f496a42dc98029c077f4ceaf3c186 /src
parentd7918a23986d28fe85d4ecb6021b40969036557c (diff)
downloadtpax-6f24f4acd132670fd7edcaf2d87c4d465ae359ef.tar.bz2
tpax-6f24f4acd132670fd7edcaf2d87c4d465ae359ef.tar.xz
internals: added tpax_getdents() and related PORTING document.
Diffstat (limited to 'src')
-rw-r--r--src/internal/tpax_getdents_impl.h64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/internal/tpax_getdents_impl.h b/src/internal/tpax_getdents_impl.h
new file mode 100644
index 0000000..e4d0e2f
--- /dev/null
+++ b/src/internal/tpax_getdents_impl.h
@@ -0,0 +1,64 @@
+/******************************************************/
+/* tpax: a topological pax implementation */
+/* Copyright (C) 2020--2021 Z. Gilboa */
+/* Released under GPLv2 and GPLv3; see COPYING.TPAX. */
+/******************************************************/
+
+#ifndef TPAX_GETDENTS_IMPL_H
+#define TPAX_GETDENTS_IMPL_H
+
+#include <sys/types.h>
+#include <dirent.h>
+
+/**************************************************************************/
+/* */
+/* provide a (static inlined) wrapper around a modern getdents interface. */
+/* */
+/* see also the PORTING document in the top-level source directory. */
+/* */
+/**************************************************************************/
+
+
+
+/* first priority given to a user-provided emulation */
+#if defined (TPAX_GETDENTS_PORTED)
+
+extern long tpax_getdents(int, struct dirent *, size_t);
+
+
+
+/* linux & midipix fallback: use the getdents64() system call. */
+#elif defined (__linux__) || defined (__midipix__)
+
+#include <sys/syscall.h>
+
+extern long syscall(long, ...);
+
+static long tpax_getdents(int fd, struct dirent * dirents, size_t count)
+{
+ return syscall(SYS_getdents64,fd,dirents,count);
+}
+
+
+
+/* freebsd fallback: use the __sys_getdirentries() system call. */
+#elif defined (__FreeBSD__)
+
+extern ssize_t __sys_getdirentries(int, struct dirent *, size_t, off_t *);
+
+static long tpax_getdents(int fd, struct dirent * dirents, size_t count)
+{
+ return __sys_getdirentries(fd,dirents,count,0);
+}
+
+
+
+/* not covered and no user-provided emulation */
+#else
+
+#error tpax: your target requires the emulation of a modern getdents interface.
+#error tpax: see the top-level PORTING document for additional information.
+
+#endif
+
+#endif