Add portage.util._ctypes module, for bug #439584.
authorZac Medico <zmedico@gentoo.org>
Thu, 25 Oct 2012 08:34:37 +0000 (01:34 -0700)
committerZac Medico <zmedico@gentoo.org>
Thu, 25 Oct 2012 08:34:37 +0000 (01:34 -0700)
pym/portage/util/_ctypes.py [new file with mode: 0644]

diff --git a/pym/portage/util/_ctypes.py b/pym/portage/util/_ctypes.py
new file mode 100644 (file)
index 0000000..4e5aa2a
--- /dev/null
@@ -0,0 +1,47 @@
+# Copyright 2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+try:
+       import ctypes
+       import ctypes.util
+except ImportError:
+       ctypes = None
+else:
+       try:
+               ctypes.cdll
+       except AttributeError:
+               ctypes = None
+
+_library_names = {}
+
+def find_library(name):
+       """
+       Calls ctype.util.find_library() if the ctypes module is available,
+       and otherwise returns None. Results are cached for future invocations.
+       """
+       filename = _library_names.get(name)
+       if filename is None:
+               if ctypes is not None:
+                       filename = ctypes.util.find_library(name)
+                       if filename is None:
+                               filename = False
+                       _library_names[name] = filename
+
+       if filename is False:
+               return None
+       return filename
+
+_library_handles = {}
+
+def LoadLibrary(name):
+       """
+       Calls ctypes.cdll.LoadLibrary(name) if the ctypes module is available,
+       and otherwise returns None. Results are cached for future invocations.
+       """
+       handle = _library_handles.get(name)
+
+       if handle is None and ctypes is not None:
+               handle = ctypes.cdll.LoadLibrary(name)
+               _library_handles[name] = handle
+
+       return handle