diff --git a/gunicorn/socketfromfd.py b/gunicorn/socketfromfd.py index 69299200..74f6503d 100644 --- a/gunicorn/socketfromfd.py +++ b/gunicorn/socketfromfd.py @@ -12,7 +12,7 @@ import socket import sys import platform -from ctypes.util import find_library +from .util import find_library __all__ = ('fromfd',) diff --git a/gunicorn/util.py b/gunicorn/util.py index 8ccaf9b3..402123da 100644 --- a/gunicorn/util.py +++ b/gunicorn/util.py @@ -3,6 +3,7 @@ # This file is part of gunicorn released under the MIT license. # See the NOTICE for more information. import ast +import ctypes.util import email.utils import errno import fcntl @@ -635,3 +636,34 @@ def bytes_to_str(b): def unquote_to_wsgi_str(string): return urllib.parse.unquote_to_bytes(string).decode('latin-1') + + +def _findWalk_ldpath(name): + def _is_elf(filepath): + try: + with open(filepath, 'rb') as fh: + return fh.read(4) == b'\x7fELF' + except: + return False + from glob import glob + if os.path.isabs(name): + return name + + # search LD_LIBRARY_PATH list + paths = ['/lib', '/usr/local/lib', '/usr/lib'] + if 'LD_LIBRARY_PATH' in os.environ: + paths = os.environ['LD_LIBRARY_PATH'].split(':') + paths + + for d in paths: + f = os.path.join(d, name) + if _is_elf(f): + return os.path.basename(f) + prefix = os.path.join(d, 'lib'+name) + for suffix in ['so', 'so.*']: + for f in glob('{0}.{1}'.format(prefix, suffix)): + if _is_elf(f): + return os.path.basename(f) + + +def find_library(name): + return ctypes.util.find_library(name) or _findWalk_ldpath(name)