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