from libc.stdint cimport *
from types cimport *
+# dirent struct with common fields and platform-specific d_off handling
+cdef extern from *:
+ """
+ #include <dirent.h>
+ #if defined(__FreeBSD__) || defined(__APPLE__)
+ #define DIRENT_D_OFF(d) 0UL
+ #else
+ #define DIRENT_D_OFF(d) ((d)->d_off)
+ #endif
+ """
+ # Declare struct with common fields
+ cdef struct dirent:
+ long int d_ino
+ unsigned short int d_reclen
+ unsigned char d_type
+ char d_name[256]
+ # Note: d_off only on Linux - use DIRENT_D_OFF macro to access
+
+ # Macro to get d_off portably
+ unsigned long DIRENT_D_OFF(dirent *d)
+
cdef extern from "../include/platform_errno.h":
ctypedef signed int int32_t;
int32_t ceph_to_hostos_errno(int32_t e)
return False
def readdir(self):
+ cdef dirent *dirent
+
self.lib.require_state("mounted")
with nogil:
if not dirent:
return None
- IF UNAME_SYSNAME == "FreeBSD" or UNAME_SYSNAME == "Darwin":
- return DirEntry(d_ino=dirent.d_ino,
- d_off=0,
- d_reclen=dirent.d_reclen,
- d_type=dirent.d_type,
- d_name=dirent.d_name,
- d_snapid=CEPH_NOSNAP)
- ELSE:
- return DirEntry(d_ino=dirent.d_ino,
- d_off=dirent.d_off,
- d_reclen=dirent.d_reclen,
- d_type=dirent.d_type,
- d_name=dirent.d_name,
- d_snapid=CEPH_NOSNAP)
+ return DirEntry(d_ino=dirent.d_ino,
+ d_off=DIRENT_D_OFF(dirent),
+ d_reclen=dirent.d_reclen,
+ d_type=dirent.d_type,
+ d_name=dirent.d_name,
+ d_snapid=CEPH_NOSNAP)
def close(self):
if self.handle:
if ret == 0:
return None
- IF UNAME_SYSNAME == "FreeBSD" or UNAME_SYSNAME == "Darwin":
- return DirEntry(d_ino=difent.dir_entry.d_ino,
- d_off=0,
- d_reclen=difent.dir_entry.d_reclen,
- d_type=difent.dir_entry.d_type,
- d_name=difent.dir_entry.d_name,
- d_snapid=difent.snapid)
- ELSE:
- return DirEntry(d_ino=difent.dir_entry.d_ino,
- d_off=difent.dir_entry.d_off,
- d_reclen=difent.dir_entry.d_reclen,
- d_type=difent.dir_entry.d_type,
- d_name=difent.dir_entry.d_name,
- d_snapid=difent.snapid)
+ return DirEntry(d_ino=difent.dir_entry.d_ino,
+ d_off=DIRENT_D_OFF(&difent.dir_entry),
+ d_reclen=difent.dir_entry.d_reclen,
+ d_type=difent.dir_entry.d_type,
+ d_name=difent.dir_entry.d_name,
+ d_snapid=difent.snapid)
def close(self):
if (not self.opened):
pass
+cdef extern from *:
+ """
+ // Mock dirent struct and DIRENT_D_OFF macro for BUILD_DOC
+ struct dirent {
+ long int d_ino;
+ unsigned short int d_reclen;
+ unsigned char d_type;
+ char d_name[256];
+ };
+ #define DIRENT_D_OFF(d) 0UL
+ """
+ # dirent struct for mock (matches declaration in c_cephfs.pxd)
+ cdef struct dirent:
+ long int d_ino
+ unsigned short int d_reclen
+ unsigned char d_type
+ char d_name[256]
+
+ # Macro to get d_off portably (always returns 0 in mock)
+ unsigned long DIRENT_D_OFF(dirent *d)
+
+
cdef:
cdef struct statx "ceph_statx":
uint32_t stx_mask
int dummy
cdef struct ceph_snapdiff_entry_t:
- int dummy
+ dirent dir_entry
+ uint64_t snapid
ctypedef void* rados_t