1 2from itertools import chain 3 4__all__ = ['constants', 'errors', 'functions', 'types'] 5 6 7def get_system_name(): 8 import platform 9 system = platform.system().lower() 10 if system.startswith('cygwin'): 11 system = 'cygwin' 12 return system 13 14 15def library_locations(abi_version): 16 import os 17 18 system = get_system_name() 19 if system == 'darwin': 20 library_names = ['libgnutls.%d.dylib' % abi_version] 21 dynamic_loader_env_vars = ['DYLD_LIBRARY_PATH', 'LD_LIBRARY_PATH'] 22 additional_paths = ['/usr/local/lib', '/opt/local/lib', '/sw/lib'] 23 elif system == 'windows': 24 library_names = ['libgnutls-%d.dll' % abi_version] 25 dynamic_loader_env_vars = ['PATH'] 26 additional_paths = ['.'] 27 elif system == 'cygwin': 28 library_names = ['cyggnutls-%d.dll' % abi_version] 29 dynamic_loader_env_vars = ['LD_LIBRARY_PATH'] 30 additional_paths = ['/usr/bin'] 31 else: 32 # Debian uses libgnutls-deb0.so.28, go figure 33 library_names = ['libgnutls.so.%d' % abi_version, 'libgnutls-deb0.so.%d' % abi_version] 34 dynamic_loader_env_vars = ['LD_LIBRARY_PATH'] 35 additional_paths = ['/usr/local/lib'] 36 for library_name in library_names: 37 for path in (path for env_var in dynamic_loader_env_vars for path in os.environ.get(env_var, '').split(':') if os.path.isdir(path)): 38 yield os.path.join(path, library_name) 39 yield library_name 40 for path in additional_paths: 41 yield os.path.join(path, library_name) 42 43 44def load_library(abi_versions): 45 from ctypes import CDLL 46 47 for library in chain.from_iterable(library_locations(abi_version) for abi_version in sorted(abi_versions, reverse=True)): 48 try: 49 return CDLL(library) 50 except OSError: 51 pass 52 else: 53 break 54 else: 55 raise RuntimeError('cannot find a supported version of libgnutls on this system') 56 57 58libgnutls = load_library(abi_versions=(28, 30)) # will use the highest of the available ABI versions 59 60 61from gnutls.library import constants 62from gnutls.library import errors 63from gnutls.library import functions 64from gnutls.library import types 65 66 67__need_version__ = '3.2.0' 68 69if functions.gnutls_check_version(__need_version__) is None: 70 version = functions.gnutls_check_version(None) 71 raise RuntimeError("Found GNUTLS library version %s, but at least version %s is required" % (version, __need_version__)) 72 73# calling gnutls_global_init is no longer required starting with gnutls 3.3 74if functions.gnutls_check_version('3.3') is None: 75 libgnutls.gnutls_global_init() 76 77 78del get_system_name, library_locations, load_library 79 80