From 6f24f4acd132670fd7edcaf2d87c4d465ae359ef Mon Sep 17 00:00:00 2001 From: midipix Date: Tue, 20 Apr 2021 22:15:00 +0000 Subject: internals: added tpax_getdents() and related PORTING document. --- src/internal/tpax_getdents_impl.h | 64 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/internal/tpax_getdents_impl.h (limited to 'src') 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 +#include + +/**************************************************************************/ +/* */ +/* 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 + +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 -- cgit v1.2.3