/* search_for_prefix requires that argv0_path be no more than MAXPATHLEN bytes long. */ static int search_for_prefix(wchar_t *argv0_path, wchar_t *home, wchar_t *_prefix) { size_t n; wchar_t *vpath; /* If PYTHONHOME is set, we believe it unconditionally */ if (home) { wchar_t *delim; wcsncpy(prefix, home, MAXPATHLEN); delim = wcschr(prefix, DELIM); if (delim) *delim = L'\0'; joinpath(prefix, lib_python); joinpath(prefix, LANDMARK); return 1; } /* Check to see if argv[0] is in the build directory */ wcscpy(prefix, argv0_path); joinpath(prefix, L"Modules/Setup"); if (isfile(prefix)) { /* Check VPATH to see if argv0_path is in the build directory. */ vpath = _Py_char2wchar(VPATH, NULL); if (vpath != NULL) { wcscpy(prefix, argv0_path); joinpath(prefix, vpath); PyMem_Free(vpath); joinpath(prefix, L"Lib"); joinpath(prefix, LANDMARK); if (ismodule(prefix)) return -1; } } /* Search from argv0_path, until root is found */ copy_absolute(prefix, argv0_path, MAXPATHLEN+1); do { n = wcslen(prefix); joinpath(prefix, lib_python); joinpath(prefix, LANDMARK); if (ismodule(prefix)) return 1; prefix[n] = L'\0'; reduce(prefix); } while (prefix[0]); /* Look at configure's PREFIX */ wcsncpy(prefix, _prefix, MAXPATHLEN); joinpath(prefix, lib_python); joinpath(prefix, LANDMARK); if (ismodule(prefix)) return 1; /* Fail */ return 0; }
/** Modify path so that the result is an absolute path. absolutize() requires that path be allocated at least MAXPATHLEN+1 bytes. @param[in,out] path The path to be made absolute. */ static void absolutize(char *path) { char buffer[MAXPATHLEN + 1]; if (is_absolute(path) == 1) return; copy_absolute(buffer, path); strcpy(path, buffer); }
/* absolutize() requires that path be allocated at least MAXPATHLEN+1 bytes. */ static void absolutize(wchar_t *path) { wchar_t buffer[MAXPATHLEN+1]; if (path[0] == SEP) return; copy_absolute(buffer, path, MAXPATHLEN+1); wcscpy(path, buffer); }
/* search_for_prefix requires that argv0_path be no more than MAXPATHLEN bytes long. */ static int search_for_prefix(char *argv0_path, char *home) { size_t n; char *vpath; /* If PYTHONHOME is set, we believe it unconditionally */ if (home) { char *delim; strncpy(prefix, home, MAXPATHLEN); delim = strchr(prefix, DELIM); if (delim) *delim = '\0'; joinpath(prefix, lib_python); joinpath(prefix, LANDMARK); return 1; } /* Check to see if argv[0] is in the build directory */ strcpy(prefix, argv0_path); joinpath(prefix, "Modules/Setup"); if (isfile(prefix)) { /* Check VPATH to see if argv0_path is in the build directory. */ vpath = VPATH; strcpy(prefix, argv0_path); joinpath(prefix, vpath); joinpath(prefix, "Lib"); joinpath(prefix, LANDMARK); if (ismodule(prefix)) return -1; } /* Search from argv0_path, until root is found */ copy_absolute(prefix, argv0_path); do { n = strlen(prefix); joinpath(prefix, lib_python); joinpath(prefix, LANDMARK); if (ismodule(prefix)) return 1; prefix[n] = '\0'; reduce(prefix); } while (prefix[0]); /* Look at configure's PREFIX */ strncpy(prefix, PREFIX, MAXPATHLEN); joinpath(prefix, lib_python); joinpath(prefix, LANDMARK); if (ismodule(prefix)) return 1; /* Fail */ return 0; }
/* search_for_exec_prefix requires that argv0_path be no more than MAXPATHLEN bytes long. */ static int search_for_exec_prefix(char *argv0_path, char *home) { size_t n; /* If PYTHONHOME is set, we believe it unconditionally */ if (home) { char *delim; delim = strchr(home, DELIM); if (delim) strncpy(exec_prefix, delim+1, MAXPATHLEN); else strncpy(exec_prefix, home, MAXPATHLEN); joinpath(exec_prefix, lib_python); joinpath(exec_prefix, "lib-dynload"); return 1; } /* Check to see if argv[0] is in the build directory */ strcpy(exec_prefix, argv0_path); joinpath(exec_prefix, "Modules/Setup"); if (isfile(exec_prefix)) { reduce(exec_prefix); return -1; } /* Search from argv0_path, until root is found */ copy_absolute(exec_prefix, argv0_path); do { n = strlen(exec_prefix); joinpath(exec_prefix, lib_python); joinpath(exec_prefix, "lib-dynload"); if (isdir(exec_prefix)) return 1; exec_prefix[n] = '\0'; reduce(exec_prefix); } while (exec_prefix[0]); /* Look at configure's EXEC_PREFIX */ strncpy(exec_prefix, EXEC_PREFIX, MAXPATHLEN); joinpath(exec_prefix, lib_python); joinpath(exec_prefix, "lib-dynload"); if (isdir(exec_prefix)) return 1; /* Fail */ return 0; }
/* search_for_exec_prefix requires that argv0_path be no more than MAXPATHLEN bytes long. */ static int search_for_exec_prefix(wchar_t *argv0_path, wchar_t *home, wchar_t *_exec_prefix) { size_t n; /* If PYTHONHOME is set, we believe it unconditionally */ if (home) { wchar_t *delim; delim = wcschr(home, DELIM); if (delim) wcsncpy(exec_prefix, delim+1, MAXPATHLEN); else wcsncpy(exec_prefix, home, MAXPATHLEN); joinpath(exec_prefix, lib_python); joinpath(exec_prefix, L"lib-dynload"); return 1; } /* Check to see if argv[0] is in the build directory. "pybuilddir.txt" is written by setup.py and contains the relative path to the location of shared library modules. */ wcscpy(exec_prefix, argv0_path); joinpath(exec_prefix, L"pybuilddir.txt"); if (isfile(exec_prefix)) { FILE *f = _Py_wfopen(exec_prefix, L"rb"); if (f == NULL) errno = 0; else { char buf[MAXPATHLEN+1]; PyObject *decoded; wchar_t rel_builddir_path[MAXPATHLEN+1]; n = fread(buf, 1, MAXPATHLEN, f); buf[n] = '\0'; fclose(f); decoded = PyUnicode_DecodeUTF8(buf, n, "surrogateescape"); if (decoded != NULL) { Py_ssize_t k; k = PyUnicode_AsWideChar(decoded, rel_builddir_path, MAXPATHLEN); Py_DECREF(decoded); if (k >= 0) { rel_builddir_path[k] = L'\0'; wcscpy(exec_prefix, argv0_path); joinpath(exec_prefix, rel_builddir_path); return -1; } } } } /* Search from argv0_path, until root is found */ copy_absolute(exec_prefix, argv0_path, MAXPATHLEN+1); do { n = wcslen(exec_prefix); joinpath(exec_prefix, lib_python); joinpath(exec_prefix, L"lib-dynload"); if (isdir(exec_prefix)) return 1; exec_prefix[n] = L'\0'; reduce(exec_prefix); } while (exec_prefix[0]); /* Look at configure's EXEC_PREFIX */ wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN); joinpath(exec_prefix, lib_python); joinpath(exec_prefix, L"lib-dynload"); if (isdir(exec_prefix)) return 1; /* Fail */ return 0; }
/* search_for_exec_prefix requires that argv0_path be no more than MAXPATHLEN bytes long. */ static int search_for_exec_prefix(char *argv0_path, char *home) { size_t n; /* If PYTHONHOME is set, we believe it unconditionally */ if (home) { char *delim; delim = strchr(home, DELIM); if (delim) strncpy(exec_prefix, delim+1, MAXPATHLEN); else strncpy(exec_prefix, home, MAXPATHLEN); joinpath(exec_prefix, lib_python); joinpath(exec_prefix, "lib-dynload"); return 1; } /* Check to see if argv[0] is in the build directory. "pybuilddir.txt" is written by setup.py and contains the relative path to the location of shared library modules. */ strcpy(exec_prefix, argv0_path); joinpath(exec_prefix, "pybuilddir.txt"); if (isfile(exec_prefix)) { FILE *f = fopen(exec_prefix, "r"); if (f == NULL) errno = 0; else { char rel_builddir_path[MAXPATHLEN+1]; size_t n; n = fread(rel_builddir_path, 1, MAXPATHLEN, f); rel_builddir_path[n] = '\0'; fclose(f); if (n >= 0) { strcpy(exec_prefix, argv0_path); joinpath(exec_prefix, rel_builddir_path); return -1; } } } /* Search from argv0_path, until root is found */ copy_absolute(exec_prefix, argv0_path); do { n = strlen(exec_prefix); joinpath(exec_prefix, lib_python); joinpath(exec_prefix, "lib-dynload"); if (isdir(exec_prefix)) return 1; exec_prefix[n] = '\0'; reduce(exec_prefix); } while (exec_prefix[0]); /* Look at configure's EXEC_PREFIX */ strncpy(exec_prefix, EXEC_PREFIX, MAXPATHLEN); joinpath(exec_prefix, lib_python); joinpath(exec_prefix, "lib-dynload"); if (isdir(exec_prefix)) return 1; /* Fail */ return 0; }
/* search_for_exec_prefix requires that argv0_path be no more than MAXPATHLEN bytes long. */ static int search_for_exec_prefix(const _PyCoreConfig *core_config, PyCalculatePath *calculate, wchar_t *exec_prefix) { size_t n; /* If PYTHONHOME is set, we believe it unconditionally */ if (core_config->home) { wchar_t *delim = wcschr(core_config->home, DELIM); if (delim) { wcsncpy(exec_prefix, delim+1, MAXPATHLEN); } else { wcsncpy(exec_prefix, core_config->home, MAXPATHLEN); } exec_prefix[MAXPATHLEN] = L'\0'; joinpath(exec_prefix, calculate->lib_python); joinpath(exec_prefix, L"lib-dynload"); return 1; } /* Check to see if argv[0] is in the build directory. "pybuilddir.txt" is written by setup.py and contains the relative path to the location of shared library modules. */ wcsncpy(exec_prefix, calculate->argv0_path, MAXPATHLEN); exec_prefix[MAXPATHLEN] = L'\0'; joinpath(exec_prefix, L"pybuilddir.txt"); if (isfile(exec_prefix)) { FILE *f = _Py_wfopen(exec_prefix, L"rb"); if (f == NULL) { errno = 0; } else { char buf[MAXPATHLEN+1]; wchar_t *rel_builddir_path; n = fread(buf, 1, MAXPATHLEN, f); buf[n] = '\0'; fclose(f); rel_builddir_path = _Py_DecodeUTF8_surrogateescape(buf, n); if (rel_builddir_path) { wcsncpy(exec_prefix, calculate->argv0_path, MAXPATHLEN); exec_prefix[MAXPATHLEN] = L'\0'; joinpath(exec_prefix, rel_builddir_path); PyMem_RawFree(rel_builddir_path ); return -1; } } } /* Search from argv0_path, until root is found */ copy_absolute(exec_prefix, calculate->argv0_path, MAXPATHLEN+1); do { n = wcslen(exec_prefix); joinpath(exec_prefix, calculate->lib_python); joinpath(exec_prefix, L"lib-dynload"); if (isdir(exec_prefix)) { return 1; } exec_prefix[n] = L'\0'; reduce(exec_prefix); } while (exec_prefix[0]); /* Look at configure's EXEC_PREFIX */ wcsncpy(exec_prefix, calculate->exec_prefix, MAXPATHLEN); exec_prefix[MAXPATHLEN] = L'\0'; joinpath(exec_prefix, calculate->lib_python); joinpath(exec_prefix, L"lib-dynload"); if (isdir(exec_prefix)) { return 1; } /* Fail */ return 0; }
/* search_for_prefix requires that argv0_path be no more than MAXPATHLEN bytes long. */ static int search_for_prefix(const _PyCoreConfig *core_config, PyCalculatePath *calculate, wchar_t *prefix) { size_t n; wchar_t *vpath; /* If PYTHONHOME is set, we believe it unconditionally */ if (core_config->home) { wcsncpy(prefix, core_config->home, MAXPATHLEN); prefix[MAXPATHLEN] = L'\0'; wchar_t *delim = wcschr(prefix, DELIM); if (delim) { *delim = L'\0'; } joinpath(prefix, calculate->lib_python); joinpath(prefix, LANDMARK); return 1; } /* Check to see if argv[0] is in the build directory */ wcsncpy(prefix, calculate->argv0_path, MAXPATHLEN); prefix[MAXPATHLEN] = L'\0'; joinpath(prefix, L"Modules/Setup.local"); if (isfile(prefix)) { /* Check VPATH to see if argv0_path is in the build directory. */ vpath = Py_DecodeLocale(VPATH, NULL); if (vpath != NULL) { wcsncpy(prefix, calculate->argv0_path, MAXPATHLEN); prefix[MAXPATHLEN] = L'\0'; joinpath(prefix, vpath); PyMem_RawFree(vpath); joinpath(prefix, L"Lib"); joinpath(prefix, LANDMARK); if (ismodule(prefix)) { return -1; } } } /* Search from argv0_path, until root is found */ copy_absolute(prefix, calculate->argv0_path, MAXPATHLEN+1); do { n = wcslen(prefix); joinpath(prefix, calculate->lib_python); joinpath(prefix, LANDMARK); if (ismodule(prefix)) { return 1; } prefix[n] = L'\0'; reduce(prefix); } while (prefix[0]); /* Look at configure's PREFIX */ wcsncpy(prefix, calculate->prefix, MAXPATHLEN); prefix[MAXPATHLEN] = L'\0'; joinpath(prefix, calculate->lib_python); joinpath(prefix, LANDMARK); if (ismodule(prefix)) { return 1; } /* Fail */ return 0; }