aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/Python/dynload_shlib.c
diff options
context:
space:
mode:
authorthegeorg <thegeorg@yandex-team.com>2024-02-19 02:38:52 +0300
committerthegeorg <thegeorg@yandex-team.com>2024-02-19 02:50:43 +0300
commitd96fa07134c06472bfee6718b5cfd1679196fc99 (patch)
tree31ec344fa9d3ff8dc038692516b6438dfbdb8a2d /contrib/tools/python3/Python/dynload_shlib.c
parent452cf9e068aef7110e35e654c5d47eb80111ef89 (diff)
downloadydb-d96fa07134c06472bfee6718b5cfd1679196fc99.tar.gz
Sync contrib/tools/python3 layout with upstream
* Move src/ subdir contents to the top of the layout * Rename self-written lib -> lib2 to avoid CaseFolding warning from the VCS * Regenerate contrib/libs/python proxy-headers accordingly 4ccc62ac1511abcf0fed14ccade38e984e088f1e
Diffstat (limited to 'contrib/tools/python3/Python/dynload_shlib.c')
-rw-r--r--contrib/tools/python3/Python/dynload_shlib.c111
1 files changed, 111 insertions, 0 deletions
diff --git a/contrib/tools/python3/Python/dynload_shlib.c b/contrib/tools/python3/Python/dynload_shlib.c
new file mode 100644
index 0000000000..6761bba457
--- /dev/null
+++ b/contrib/tools/python3/Python/dynload_shlib.c
@@ -0,0 +1,111 @@
+
+/* Support for dynamic loading of extension modules */
+
+#include "Python.h"
+#include "pycore_interp.h" // _PyInterpreterState.dlopenflags
+#include "pycore_pystate.h" // _PyInterpreterState_GET()
+#include "importdl.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if defined(__NetBSD__)
+#include <sys/param.h>
+#if (NetBSD < 199712)
+#include <nlist.h>
+#include <link.h>
+#define dlerror() "error in dynamic linking"
+#endif
+#endif /* NetBSD */
+
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#if (defined(__OpenBSD__) || defined(__NetBSD__)) && !defined(__ELF__)
+#define LEAD_UNDERSCORE "_"
+#else
+#define LEAD_UNDERSCORE ""
+#endif
+
+/* The .so extension module ABI tag, supplied by the Makefile via
+ Makefile.pre.in and configure. This is used to discriminate between
+ incompatible .so files so that extensions for different Python builds can
+ live in the same directory. E.g. foomodule.cpython-32.so
+*/
+
+const char *_PyImport_DynLoadFiletab[] = {
+#ifdef __CYGWIN__
+ ".dll",
+#else /* !__CYGWIN__ */
+ "." SOABI ".so",
+#ifdef ALT_SOABI
+ "." ALT_SOABI ".so",
+#endif
+ ".abi" PYTHON_ABI_STRING ".so",
+ ".so",
+#endif /* __CYGWIN__ */
+ NULL,
+};
+
+
+dl_funcptr
+_PyImport_FindSharedFuncptr(const char *prefix,
+ const char *shortname,
+ const char *pathname, FILE *fp)
+{
+ dl_funcptr p;
+ void *handle;
+ char funcname[258];
+ char pathbuf[260];
+ int dlopenflags=0;
+
+ if (strchr(pathname, '/') == NULL) {
+ /* Prefix bare filename with "./" */
+ PyOS_snprintf(pathbuf, sizeof(pathbuf), "./%-.255s", pathname);
+ pathname = pathbuf;
+ }
+
+ PyOS_snprintf(funcname, sizeof(funcname),
+ LEAD_UNDERSCORE "%.20s_%.200s", prefix, shortname);
+
+ if (fp != NULL) {
+ struct _Py_stat_struct status;
+ if (_Py_fstat(fileno(fp), &status) == -1)
+ return NULL;
+ }
+
+ dlopenflags = _PyImport_GetDLOpenFlags(_PyInterpreterState_GET());
+
+ handle = dlopen(pathname, dlopenflags);
+
+ if (handle == NULL) {
+ PyObject *mod_name;
+ PyObject *path;
+ PyObject *error_ob;
+ const char *error = dlerror();
+ if (error == NULL)
+ error = "unknown dlopen() error";
+ error_ob = PyUnicode_DecodeLocale(error, "surrogateescape");
+ if (error_ob == NULL)
+ return NULL;
+ mod_name = PyUnicode_FromString(shortname);
+ if (mod_name == NULL) {
+ Py_DECREF(error_ob);
+ return NULL;
+ }
+ path = PyUnicode_DecodeFSDefault(pathname);
+ if (path == NULL) {
+ Py_DECREF(error_ob);
+ Py_DECREF(mod_name);
+ return NULL;
+ }
+ PyErr_SetImportError(error_ob, mod_name, path);
+ Py_DECREF(error_ob);
+ Py_DECREF(mod_name);
+ Py_DECREF(path);
+ return NULL;
+ }
+ p = (dl_funcptr) dlsym(handle, funcname);
+ return p;
+}