diff options
Diffstat (limited to 'src/internal')
-rw-r--r-- | src/internal/tpax_getdents_impl.h | 64 |
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 |