summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Python/pathconfig.c
diff options
context:
space:
mode:
authorAlexSm <[email protected]>2024-03-05 10:40:59 +0100
committerGitHub <[email protected]>2024-03-05 12:40:59 +0300
commit1ac13c847b5358faba44dbb638a828e24369467b (patch)
tree07672b4dd3604ad3dee540a02c6494cb7d10dc3d /contrib/tools/python3/src/Python/pathconfig.c
parentffcca3e7f7958ddc6487b91d3df8c01054bd0638 (diff)
Library import 16 (#2433)
Co-authored-by: robot-piglet <[email protected]> Co-authored-by: deshevoy <[email protected]> Co-authored-by: robot-contrib <[email protected]> Co-authored-by: thegeorg <[email protected]> Co-authored-by: robot-ya-builder <[email protected]> Co-authored-by: svidyuk <[email protected]> Co-authored-by: shadchin <[email protected]> Co-authored-by: robot-ratatosk <[email protected]> Co-authored-by: innokentii <[email protected]> Co-authored-by: arkady-e1ppa <[email protected]> Co-authored-by: snermolaev <[email protected]> Co-authored-by: dimdim11 <[email protected]> Co-authored-by: kickbutt <[email protected]> Co-authored-by: abdullinsaid <[email protected]> Co-authored-by: korsunandrei <[email protected]> Co-authored-by: petrk <[email protected]> Co-authored-by: miroslav2 <[email protected]> Co-authored-by: serjflint <[email protected]> Co-authored-by: akhropov <[email protected]> Co-authored-by: prettyboy <[email protected]> Co-authored-by: ilikepugs <[email protected]> Co-authored-by: hiddenpath <[email protected]> Co-authored-by: mikhnenko <[email protected]> Co-authored-by: spreis <[email protected]> Co-authored-by: andreyshspb <[email protected]> Co-authored-by: dimaandreev <[email protected]> Co-authored-by: rashid <[email protected]> Co-authored-by: robot-ydb-importer <[email protected]> Co-authored-by: r-vetrov <[email protected]> Co-authored-by: ypodlesov <[email protected]> Co-authored-by: zaverden <[email protected]> Co-authored-by: vpozdyayev <[email protected]> Co-authored-by: robot-cozmo <[email protected]> Co-authored-by: v-korovin <[email protected]> Co-authored-by: arikon <[email protected]> Co-authored-by: khoden <[email protected]> Co-authored-by: psydmm <[email protected]> Co-authored-by: robot-javacom <[email protected]> Co-authored-by: dtorilov <[email protected]> Co-authored-by: sennikovmv <[email protected]> Co-authored-by: hcpp <[email protected]>
Diffstat (limited to 'contrib/tools/python3/src/Python/pathconfig.c')
-rw-r--r--contrib/tools/python3/src/Python/pathconfig.c524
1 files changed, 0 insertions, 524 deletions
diff --git a/contrib/tools/python3/src/Python/pathconfig.c b/contrib/tools/python3/src/Python/pathconfig.c
deleted file mode 100644
index be0f97c4b20..00000000000
--- a/contrib/tools/python3/src/Python/pathconfig.c
+++ /dev/null
@@ -1,524 +0,0 @@
-/* Path configuration like module_search_path (sys.path) */
-
-#include "Python.h"
-#include "marshal.h" // PyMarshal_ReadObjectFromString
-#include "osdefs.h" // DELIM
-#include "pycore_initconfig.h"
-#include "pycore_fileutils.h"
-#include "pycore_pathconfig.h"
-#include "pycore_pymem.h" // _PyMem_SetDefaultAllocator()
-#include <wchar.h>
-#ifdef MS_WINDOWS
-# include <windows.h> // GetFullPathNameW(), MAX_PATH
-# include <pathcch.h>
-# include <shlwapi.h>
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/* External interface */
-
-/* Stored values set by C API functions */
-typedef struct _PyPathConfig {
- /* Full path to the Python program */
- wchar_t *program_full_path;
- wchar_t *prefix;
- wchar_t *exec_prefix;
- wchar_t *stdlib_dir;
- /* Set by Py_SetPath */
- wchar_t *module_search_path;
- /* Set by _PyPathConfig_UpdateGlobal */
- wchar_t *calculated_module_search_path;
- /* Python program name */
- wchar_t *program_name;
- /* Set by Py_SetPythonHome() or PYTHONHOME environment variable */
- wchar_t *home;
- int _is_python_build;
-} _PyPathConfig;
-
-# define _PyPathConfig_INIT \
- {.module_search_path = NULL, ._is_python_build = 0}
-
-
-_PyPathConfig _Py_path_config = _PyPathConfig_INIT;
-
-
-const wchar_t *
-_PyPathConfig_GetGlobalModuleSearchPath(void)
-{
- return _Py_path_config.module_search_path;
-}
-
-
-void
-_PyPathConfig_ClearGlobal(void)
-{
- PyMemAllocatorEx old_alloc;
- _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
-
-#define CLEAR(ATTR) \
- do { \
- PyMem_RawFree(_Py_path_config.ATTR); \
- _Py_path_config.ATTR = NULL; \
- } while (0)
-
- CLEAR(program_full_path);
- CLEAR(prefix);
- CLEAR(exec_prefix);
- CLEAR(stdlib_dir);
- CLEAR(module_search_path);
- CLEAR(calculated_module_search_path);
- CLEAR(program_name);
- CLEAR(home);
- _Py_path_config._is_python_build = 0;
-
-#undef CLEAR
-
- PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
-}
-
-PyStatus
-_PyPathConfig_ReadGlobal(PyConfig *config)
-{
- PyStatus status = _PyStatus_OK();
-
-#define COPY(ATTR) \
- do { \
- if (_Py_path_config.ATTR && !config->ATTR) { \
- status = PyConfig_SetString(config, &config->ATTR, _Py_path_config.ATTR); \
- if (_PyStatus_EXCEPTION(status)) goto done; \
- } \
- } while (0)
-
-#define COPY2(ATTR, SRCATTR) \
- do { \
- if (_Py_path_config.SRCATTR && !config->ATTR) { \
- status = PyConfig_SetString(config, &config->ATTR, _Py_path_config.SRCATTR); \
- if (_PyStatus_EXCEPTION(status)) goto done; \
- } \
- } while (0)
-
-#define COPY_INT(ATTR) \
- do { \
- assert(_Py_path_config.ATTR >= 0); \
- if ((_Py_path_config.ATTR >= 0) && (config->ATTR <= 0)) { \
- config->ATTR = _Py_path_config.ATTR; \
- } \
- } while (0)
-
- COPY(prefix);
- COPY(exec_prefix);
- COPY(stdlib_dir);
- COPY(program_name);
- COPY(home);
- COPY2(executable, program_full_path);
- COPY_INT(_is_python_build);
- // module_search_path must be initialised - not read
-#undef COPY
-#undef COPY2
-#undef COPY_INT
-
-done:
- return status;
-}
-
-PyStatus
-_PyPathConfig_UpdateGlobal(const PyConfig *config)
-{
- PyMemAllocatorEx old_alloc;
- _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
-
-#define COPY(ATTR) \
- do { \
- if (config->ATTR) { \
- PyMem_RawFree(_Py_path_config.ATTR); \
- _Py_path_config.ATTR = _PyMem_RawWcsdup(config->ATTR); \
- if (!_Py_path_config.ATTR) goto error; \
- } \
- } while (0)
-
-#define COPY2(ATTR, SRCATTR) \
- do { \
- if (config->SRCATTR) { \
- PyMem_RawFree(_Py_path_config.ATTR); \
- _Py_path_config.ATTR = _PyMem_RawWcsdup(config->SRCATTR); \
- if (!_Py_path_config.ATTR) goto error; \
- } \
- } while (0)
-
-#define COPY_INT(ATTR) \
- do { \
- if (config->ATTR > 0) { \
- _Py_path_config.ATTR = config->ATTR; \
- } \
- } while (0)
-
- COPY(prefix);
- COPY(exec_prefix);
- COPY(stdlib_dir);
- COPY(program_name);
- COPY(home);
- COPY2(program_full_path, executable);
- COPY_INT(_is_python_build);
-#undef COPY
-#undef COPY2
-#undef COPY_INT
-
- PyMem_RawFree(_Py_path_config.module_search_path);
- _Py_path_config.module_search_path = NULL;
- PyMem_RawFree(_Py_path_config.calculated_module_search_path);
- _Py_path_config.calculated_module_search_path = NULL;
-
- do {
- size_t cch = 1;
- for (Py_ssize_t i = 0; i < config->module_search_paths.length; ++i) {
- cch += 1 + wcslen(config->module_search_paths.items[i]);
- }
-
- wchar_t *path = (wchar_t*)PyMem_RawMalloc(sizeof(wchar_t) * cch);
- if (!path) {
- goto error;
- }
- wchar_t *p = path;
- for (Py_ssize_t i = 0; i < config->module_search_paths.length; ++i) {
- wcscpy(p, config->module_search_paths.items[i]);
- p = wcschr(p, L'\0');
- *p++ = DELIM;
- *p = L'\0';
- }
-
- do {
- *p = L'\0';
- } while (p != path && *--p == DELIM);
- _Py_path_config.calculated_module_search_path = path;
- } while (0);
-
- PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
- return _PyStatus_OK();
-
-error:
- PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
- return _PyStatus_NO_MEMORY();
-}
-
-
-static void _Py_NO_RETURN
-path_out_of_memory(const char *func)
-{
- _Py_FatalErrorFunc(func, "out of memory");
-}
-
-void
-Py_SetPath(const wchar_t *path)
-{
- if (path == NULL) {
- _PyPathConfig_ClearGlobal();
- return;
- }
-
- PyMemAllocatorEx old_alloc;
- _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
-
- PyMem_RawFree(_Py_path_config.prefix);
- PyMem_RawFree(_Py_path_config.exec_prefix);
- PyMem_RawFree(_Py_path_config.stdlib_dir);
- PyMem_RawFree(_Py_path_config.module_search_path);
- PyMem_RawFree(_Py_path_config.calculated_module_search_path);
-
- _Py_path_config.prefix = _PyMem_RawWcsdup(L"");
- _Py_path_config.exec_prefix = _PyMem_RawWcsdup(L"");
- // XXX Copy this from the new module_search_path?
- if (_Py_path_config.home != NULL) {
- _Py_path_config.stdlib_dir = _PyMem_RawWcsdup(_Py_path_config.home);
- }
- else {
- _Py_path_config.stdlib_dir = _PyMem_RawWcsdup(L"");
- }
- _Py_path_config.module_search_path = _PyMem_RawWcsdup(path);
- _Py_path_config.calculated_module_search_path = NULL;
-
- PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
-
- if (_Py_path_config.prefix == NULL
- || _Py_path_config.exec_prefix == NULL
- || _Py_path_config.stdlib_dir == NULL
- || _Py_path_config.module_search_path == NULL)
- {
- path_out_of_memory(__func__);
- }
-}
-
-
-void
-Py_SetPythonHome(const wchar_t *home)
-{
- int has_value = home && home[0];
-
- PyMemAllocatorEx old_alloc;
- _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
-
- PyMem_RawFree(_Py_path_config.home);
- _Py_path_config.home = NULL;
-
- if (has_value) {
- _Py_path_config.home = _PyMem_RawWcsdup(home);
- }
-
- PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
-
- if (has_value && _Py_path_config.home == NULL) {
- path_out_of_memory(__func__);
- }
-}
-
-
-void
-Py_SetProgramName(const wchar_t *program_name)
-{
- int has_value = program_name && program_name[0];
-
- PyMemAllocatorEx old_alloc;
- _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
-
- PyMem_RawFree(_Py_path_config.program_name);
- _Py_path_config.program_name = NULL;
-
- if (has_value) {
- _Py_path_config.program_name = _PyMem_RawWcsdup(program_name);
- }
-
- PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
-
- if (has_value && _Py_path_config.program_name == NULL) {
- path_out_of_memory(__func__);
- }
-}
-
-void
-_Py_SetProgramFullPath(const wchar_t *program_full_path)
-{
- int has_value = program_full_path && program_full_path[0];
-
- PyMemAllocatorEx old_alloc;
- _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
-
- PyMem_RawFree(_Py_path_config.program_full_path);
- _Py_path_config.program_full_path = NULL;
-
- if (has_value) {
- _Py_path_config.program_full_path = _PyMem_RawWcsdup(program_full_path);
- }
-
- PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
-
- if (has_value && _Py_path_config.program_full_path == NULL) {
- path_out_of_memory(__func__);
- }
-}
-
-
-wchar_t *
-Py_GetPath(void)
-{
- /* If the user has provided a path, return that */
- if (_Py_path_config.module_search_path) {
- return _Py_path_config.module_search_path;
- }
- /* If we have already done calculations, return the calculated path */
- return _Py_path_config.calculated_module_search_path;
-}
-
-
-wchar_t *
-_Py_GetStdlibDir(void)
-{
- wchar_t *stdlib_dir = _Py_path_config.stdlib_dir;
- if (stdlib_dir != NULL && stdlib_dir[0] != L'\0') {
- return stdlib_dir;
- }
- return NULL;
-}
-
-
-wchar_t *
-Py_GetPrefix(void)
-{
- return _Py_path_config.prefix;
-}
-
-
-wchar_t *
-Py_GetExecPrefix(void)
-{
- return _Py_path_config.exec_prefix;
-}
-
-
-wchar_t *
-Py_GetProgramFullPath(void)
-{
- return _Py_path_config.program_full_path;
-}
-
-
-wchar_t*
-Py_GetPythonHome(void)
-{
- return _Py_path_config.home;
-}
-
-
-wchar_t *
-Py_GetProgramName(void)
-{
- return _Py_path_config.program_name;
-}
-
-
-
-/* Compute module search path from argv[0] or the current working
- directory ("-m module" case) which will be prepended to sys.argv:
- sys.path[0].
-
- Return 1 if the path is correctly resolved and written into *path0_p.
-
- Return 0 if it fails to resolve the full path. For example, return 0 if the
- current working directory has been removed (bpo-36236) or if argv is empty.
-
- Raise an exception and return -1 on error.
- */
-int
-_PyPathConfig_ComputeSysPath0(const PyWideStringList *argv, PyObject **path0_p)
-{
- assert(_PyWideStringList_CheckConsistency(argv));
-
- if (argv->length == 0) {
- /* Leave sys.path unchanged if sys.argv is empty */
- return 0;
- }
-
- wchar_t *argv0 = argv->items[0];
- int have_module_arg = (wcscmp(argv0, L"-m") == 0);
- int have_script_arg = (!have_module_arg && (wcscmp(argv0, L"-c") != 0));
-
- wchar_t *path0 = argv0;
- Py_ssize_t n = 0;
-
-#ifdef HAVE_REALPATH
- wchar_t fullpath[MAXPATHLEN];
-#elif defined(MS_WINDOWS)
- wchar_t fullpath[MAX_PATH];
-#endif
-
- if (have_module_arg) {
-#if defined(HAVE_REALPATH) || defined(MS_WINDOWS)
- if (!_Py_wgetcwd(fullpath, Py_ARRAY_LENGTH(fullpath))) {
- return 0;
- }
- path0 = fullpath;
-#else
- path0 = L".";
-#endif
- n = wcslen(path0);
- }
-
-#ifdef HAVE_READLINK
- wchar_t link[MAXPATHLEN + 1];
- int nr = 0;
- wchar_t path0copy[2 * MAXPATHLEN + 1];
-
- if (have_script_arg) {
- nr = _Py_wreadlink(path0, link, Py_ARRAY_LENGTH(link));
- }
- if (nr > 0) {
- /* It's a symlink */
- link[nr] = '\0';
- if (link[0] == SEP) {
- path0 = link; /* Link to absolute path */
- }
- else if (wcschr(link, SEP) == NULL) {
- /* Link without path */
- }
- else {
- /* Must join(dirname(path0), link) */
- wchar_t *q = wcsrchr(path0, SEP);
- if (q == NULL) {
- /* path0 without path */
- path0 = link;
- }
- else {
- /* Must make a copy, path0copy has room for 2 * MAXPATHLEN */
- wcsncpy(path0copy, path0, MAXPATHLEN);
- q = wcsrchr(path0copy, SEP);
- wcsncpy(q+1, link, MAXPATHLEN);
- q[MAXPATHLEN + 1] = L'\0';
- path0 = path0copy;
- }
- }
- }
-#endif /* HAVE_READLINK */
-
- wchar_t *p = NULL;
-
-#if SEP == '\\'
- /* Special case for Microsoft filename syntax */
- if (have_script_arg) {
- wchar_t *q;
-#if defined(MS_WINDOWS)
- /* Replace the first element in argv with the full path. */
- wchar_t *ptemp;
- if (GetFullPathNameW(path0,
- Py_ARRAY_LENGTH(fullpath),
- fullpath,
- &ptemp)) {
- path0 = fullpath;
- }
-#endif
- p = wcsrchr(path0, SEP);
- /* Test for alternate separator */
- q = wcsrchr(p ? p : path0, '/');
- if (q != NULL)
- p = q;
- if (p != NULL) {
- n = p + 1 - path0;
- if (n > 1 && p[-1] != ':')
- n--; /* Drop trailing separator */
- }
- }
-#else
- /* All other filename syntaxes */
- if (have_script_arg) {
-#if defined(HAVE_REALPATH)
- if (_Py_wrealpath(path0, fullpath, Py_ARRAY_LENGTH(fullpath))) {
- path0 = fullpath;
- }
-#endif
- p = wcsrchr(path0, SEP);
- }
- if (p != NULL) {
- n = p + 1 - path0;
-#if SEP == '/' /* Special case for Unix filename syntax */
- if (n > 1) {
- /* Drop trailing separator */
- n--;
- }
-#endif /* Unix */
- }
-#endif /* All others */
-
- PyObject *path0_obj = PyUnicode_FromWideChar(path0, n);
- if (path0_obj == NULL) {
- return -1;
- }
-
- *path0_p = path0_obj;
- return 1;
-}
-
-
-#ifdef __cplusplus
-}
-#endif