Source

pypy / lib_pypy / ctypes_support.py

Full commit
Daniel Roberts 0077cf5 











Amaury Forgeot d… 949f18d 

Armin Rigo 2907bd0 

Daniel Roberts 0077cf5 












Amaury Forgeot d… fe5a0f5 
Daniel Roberts 0077cf5 












""" This file provides some support for things like standard_c_lib and
errno access, as portable as possible
"""

import ctypes
import ctypes.util
import sys

# __________ the standard C library __________

if sys.platform == 'win32':
    import _ffi
    standard_c_lib = ctypes.CDLL('msvcrt', handle=_ffi.get_libc())
elif sys.platform == 'cygwin':
    standard_c_lib = ctypes.CDLL(ctypes.util.find_library('cygwin'))
else:
    standard_c_lib = ctypes.CDLL(ctypes.util.find_library('c'))

if sys.platform == 'win32':
    standard_c_lib._errno.restype = ctypes.POINTER(ctypes.c_int)
    def _where_is_errno():
        return standard_c_lib._errno()
    
elif sys.platform in ('linux2', 'freebsd6'):
    standard_c_lib.__errno_location.restype = ctypes.POINTER(ctypes.c_int)
    def _where_is_errno():
        return standard_c_lib.__errno_location()

elif sys.platform in ('darwin', 'freebsd7', 'freebsd8', 'freebsd9'):
    standard_c_lib.__error.restype = ctypes.POINTER(ctypes.c_int)
    def _where_is_errno():
        return standard_c_lib.__error()

def get_errno():
    errno_p = _where_is_errno()
    return errno_p.contents.value

def set_errno(value):
    errno_p = _where_is_errno()
    errno_p.contents.value = value