from libc.stdint cimport *
from libc.stdlib cimport malloc, realloc, free
+# Platform-specific errno handling using C preprocessor
+cdef extern from *:
+ """
+ #include <errno.h>
+ #if defined(__FreeBSD__) || defined(__APPLE__)
+ // FreeBSD/Darwin use ENOATTR for "no data"
+ #define CEPH_ENODATA ENOATTR
+ #else
+ // Linux uses ENODATA
+ #define CEPH_ENODATA ENODATA
+ #endif
+ """
+ int CEPH_ENODATA
+
{{if BUILD_DOC}}
include "mock_rados.pxi"
{{else}}
super(ConnectionShutdown, self).__init__(
"RADOS connection was shutdown (%s)" % message, errno)
-
-# Build errno mapping based on platform
-# FreeBSD uses ENOATTR while Linux uses ENODATA
-{{if UNAME_SYSNAME == "FreeBSD"}}
-cdef errno_to_exception = {
- errno.EPERM : PermissionError,
- errno.ENOENT : ObjectNotFound,
- errno.EIO : IOError,
- errno.ENOSPC : NoSpace,
- errno.EEXIST : ObjectExists,
- errno.EBUSY : ObjectBusy,
- errno.ENOATTR : NoData,
- errno.EINTR : InterruptedOrTimeoutError,
- errno.ETIMEDOUT : TimedOut,
- errno.EACCES : PermissionDeniedError,
- errno.EINPROGRESS : InProgress,
- errno.EISCONN : IsConnected,
- errno.EINVAL : InvalidArgumentError,
- errno.ENOTCONN : NotConnected,
- errno.ESHUTDOWN : ConnectionShutdown,
-}
-{{else}}
+# Build errno mapping
+# Use CEPH_ENODATA which resolves to ENOATTR on FreeBSD or ENODATA on Linux
cdef errno_to_exception = {
errno.EPERM : PermissionError,
errno.ENOENT : ObjectNotFound,
errno.ENOSPC : NoSpace,
errno.EEXIST : ObjectExists,
errno.EBUSY : ObjectBusy,
- errno.ENODATA : NoData,
+ CEPH_ENODATA : NoData,
errno.EINTR : InterruptedOrTimeoutError,
errno.ETIMEDOUT : TimedOut,
errno.EACCES : PermissionDeniedError,
errno.ENOTCONN : NotConnected,
errno.ESHUTDOWN : ConnectionShutdown,
}
-{{endif}}
cdef make_ex(ret: int, msg: str):
from itertools import filterfalse, takewhile
import os
-import platform
import shutil
import sys
import tempfile
if 'BUILD_DOC' in os.environ or 'READTHEDOCS' in os.environ:
ext_args = dict(extra_compile_args=['-DBUILD_DOC'])
- cython_constants = dict(BUILD_DOC=True, UNAME_SYSNAME=platform.system())
+ cython_constants = dict(BUILD_DOC=True)
elif check_sanity():
ext_args = get_python_flags(['rados'])
- cython_constants = dict(BUILD_DOC=False, UNAME_SYSNAME=platform.system())
+ cython_constants = dict(BUILD_DOC=False)
else:
sys.exit(1)
**ext_args
)
],
+ # use "3str" when Cython 3.0 is available
+ compiler_directives={'language_level': sys.version_info.major},
compile_time_env=cython_constants,
build_dir=os.environ.get("CYTHON_BUILD_DIR", None),
),
from cstat cimport stat
cimport libcpp
+# Platform-specific errno handling using C preprocessor
+cdef extern from *:
+ """
+ #include <errno.h>
+ #if defined(__FreeBSD__) || defined(__APPLE__)
+ // FreeBSD/Darwin use ENOATTR for "no data"
+ #define CEPH_ENODATA ENOATTR
+ #else
+ // Linux uses ENODATA
+ #define CEPH_ENODATA ENODATA
+ #endif
+ """
+ int CEPH_ENODATA
+
{{if BUILD_DOC}}
include "mock_rgw.pxi"
{{else}}
pass
-# Build errno mapping based on platform
-# FreeBSD uses ENOATTR while Linux uses ENODATA
-{{if UNAME_SYSNAME == "FreeBSD"}}
-cdef errno_to_exception = {
- errno.EPERM : PermissionError,
- errno.ENOENT : ObjectNotFound,
- errno.EIO : IOError,
- errno.ENOSPC : NoSpace,
- errno.EEXIST : ObjectExists,
- errno.ENOATTR : NoData,
- errno.EINVAL : InvalidValue,
- errno.EOPNOTSUPP : OperationNotSupported,
- errno.ERANGE : OutOfRange,
- errno.EWOULDBLOCK: WouldBlock,
-}
-{{else}}
+# Build errno mapping
+# Use CEPH_ENODATA which resolves to ENOATTR on FreeBSD or ENODATA on Linux
cdef errno_to_exception = {
errno.EPERM : PermissionError,
errno.ENOENT : ObjectNotFound,
errno.EIO : IOError,
errno.ENOSPC : NoSpace,
errno.EEXIST : ObjectExists,
- errno.ENODATA : NoData,
+ CEPH_ENODATA : NoData,
errno.EINVAL : InvalidValue,
errno.EOPNOTSUPP : OperationNotSupported,
errno.ERANGE : OutOfRange,
errno.EWOULDBLOCK: WouldBlock,
}
-{{endif}}
cdef class FileHandle(object):
shutil.rmtree(tmp_dir)
-import platform
if 'BUILD_DOC' in os.environ or 'READTHEDOCS' in os.environ:
ext_args = {}
- cython_constants = dict(BUILD_DOC=True, UNAME_SYSNAME=platform.system())
+ cython_constants = dict(BUILD_DOC=True)
cythonize_args = dict(compile_time_env=cython_constants)
elif check_sanity():
ext_args = get_python_flags(['rados', 'rgw'])
- cython_constants = dict(BUILD_DOC=False, UNAME_SYSNAME=platform.system())
+ cython_constants = dict(BUILD_DOC=False)
include_path = [os.path.join(os.path.dirname(__file__), "..", "rados")]
cythonize_args = dict(compile_time_env=cython_constants,
include_path=include_path)
**ext_args
)
],
+ compiler_directives={'language_level': sys.version_info.major},
build_dir=os.environ.get("CYTHON_BUILD_DIR", None),
**cythonize_args
),