aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'dev-lang/python/files/3.3/61_all_process_data.patch')
-rw-r--r--dev-lang/python/files/3.3/61_all_process_data.patch166
1 files changed, 166 insertions, 0 deletions
diff --git a/dev-lang/python/files/3.3/61_all_process_data.patch b/dev-lang/python/files/3.3/61_all_process_data.patch
new file mode 100644
index 0000000..b7738c7
--- /dev/null
+++ b/dev-lang/python/files/3.3/61_all_process_data.patch
@@ -0,0 +1,166 @@
+GENTOO_PYTHON_PROCESS_NAME environmental variable is set by python-wrapper and wrapper scripts generated by
+python_generate_wrapper_scripts() and specifies process name.
+GENTOO_PYTHON_WRAPPER_SCRIPT_PATH environmental variable is set by wrapper scripts generated by
+python_generate_wrapper_scripts() and specifies sys.argv[0] in target executables.
+GENTOO_PYTHON_TARGET_SCRIPT_PATH environmental variable is set by wrapper scripts generated by
+python_generate_wrapper_scripts() and specifies paths to actually executed scripts.
+GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION environmental variable is used by wrapper scripts generated by
+python_generate_wrapper_scripts() to check if Python supports GENTOO_PYTHON_TARGET_SCRIPT_PATH environmental variable.
+
+--- Modules/main.c
++++ Modules/main.c
+@@ -331,6 +331,7 @@
+ int version = 0;
+ int saw_unbuffered_flag = 0;
+ PyCompilerFlags cf;
++ char *target_script_name = getenv("GENTOO_PYTHON_TARGET_SCRIPT_PATH");
+
+ cf.cf_flags = 0;
+
+@@ -551,7 +552,17 @@
+ filename = argv[_PyOS_optind];
+
+ #else
+- filename = argv[_PyOS_optind];
++ if (target_script_name != NULL && *target_script_name != '\0') {
++ size_t length = strlen(target_script_name);
++ wchar_t *wcs_target_script_name = (wchar_t *) calloc(length + 1, sizeof(wchar_t));
++ char *old_locale = setlocale(LC_CTYPE, NULL);
++ setlocale(LC_CTYPE, "");
++ if (mbstowcs(wcs_target_script_name, target_script_name, length) >= 0)
++ filename = wcs_target_script_name;
++ setlocale(LC_CTYPE, old_locale);
++ }
++ if (filename == NULL)
++ filename = argv[_PyOS_optind];
+ #endif
+ }
+
+--- Modules/posixmodule.c
++++ Modules/posixmodule.c
+@@ -1157,6 +1157,10 @@
+ char *p = strchr(*e, '=');
+ if (p == NULL)
+ continue;
++ if ((strlen("GENTOO_PYTHON_PROCESS_NAME") == (int)(p-*e) && strncmp("GENTOO_PYTHON_PROCESS_NAME", *e, (int)(p-*e)) == 0) ||
++ (strlen("GENTOO_PYTHON_TARGET_SCRIPT_PATH") == (int)(p-*e) && strncmp("GENTOO_PYTHON_TARGET_SCRIPT_PATH", *e, (int)(p-*e)) == 0) ||
++ (strlen("GENTOO_PYTHON_WRAPPER_SCRIPT_PATH") == (int)(p-*e) && strncmp("GENTOO_PYTHON_WRAPPER_SCRIPT_PATH", *e, (int)(p-*e)) == 0))
++ continue;
+ k = PyBytes_FromStringAndSize(*e, (int)(p-*e));
+ if (k == NULL) {
+ PyErr_Clear();
+--- Modules/python.c
++++ Modules/python.c
+@@ -7,6 +7,14 @@
+ #include <floatingpoint.h>
+ #endif
+
++#ifdef __linux__
++#include <linux/prctl.h>
++#include <sys/prctl.h>
++#ifndef PR_SET_NAME
++#define PR_SET_NAME 15
++#endif
++#endif
++
+ #ifdef MS_WINDOWS
+ int
+ wmain(int argc, wchar_t **argv)
+@@ -18,6 +26,11 @@
+ int
+ main(int argc, char **argv)
+ {
++ if (getenv("GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION")) {
++ printf("GENTOO_PYTHON_TARGET_SCRIPT_PATH supported\n");
++ return 0;
++ }
++
+ wchar_t **argv_copy;
+ /* We need a second copy, as Python might modify the first one. */
+ wchar_t **argv_copy2;
+@@ -59,6 +72,16 @@
+
+ setlocale(LC_ALL, oldloc);
+ free(oldloc);
++
++#ifdef __linux__
++ char *process_name = getenv("GENTOO_PYTHON_PROCESS_NAME");
++#ifdef HAVE_UNSETENV
++ unsetenv("GENTOO_PYTHON_PROCESS_NAME");
++#endif
++ if (process_name != NULL && *process_name != '\0')
++ prctl(PR_SET_NAME, process_name);
++#endif
++
+ res = Py_Main(argc, argv_copy);
+ for (i = 0; i < argc; i++) {
+ PyMem_Free(argv_copy2[i]);
+--- Python/sysmodule.c
++++ Python/sysmodule.c
+@@ -1778,6 +1778,10 @@
+ makeargvobject(int argc, wchar_t **argv)
+ {
+ PyObject *av;
++ char *wrapper_script_name = getenv("GENTOO_PYTHON_WRAPPER_SCRIPT_PATH");
++#ifdef HAVE_UNSETENV
++ unsetenv("GENTOO_PYTHON_WRAPPER_SCRIPT_PATH");
++#endif
+ if (argc <= 0 || argv == NULL) {
+ /* Ensure at least one (empty) argument is seen */
+ static wchar_t *empty_argv[1] = {L""};
+@@ -1802,7 +1806,16 @@
+ } else
+ v = PyUnicode_FromString(argv[i]);
+ #else
+- PyObject *v = PyUnicode_FromWideChar(argv[i], -1);
++ PyObject *v = NULL;
++ if (i == 0 && wrapper_script_name != NULL && *wrapper_script_name != '\0') {
++ size_t length = strlen(wrapper_script_name);
++ wchar_t *wcs_wrapper_script_name = (wchar_t *) calloc(length + 1, sizeof(wchar_t));
++ if (mbstowcs(wcs_wrapper_script_name, wrapper_script_name, length) >= 0)
++ v = PyUnicode_FromWideChar(wcs_wrapper_script_name, -1);
++ free(wcs_wrapper_script_name);
++ }
++ if (v == NULL)
++ v = PyUnicode_FromWideChar(argv[i], -1);
+ #endif
+ if (v == NULL) {
+ Py_DECREF(av);
+@@ -1822,7 +1835,12 @@
+ static void
+ sys_update_path(int argc, wchar_t **argv)
+ {
+- wchar_t *argv0;
++ char *target_script_name = getenv("GENTOO_PYTHON_TARGET_SCRIPT_PATH");
++#ifdef HAVE_UNSETENV
++ unsetenv("GENTOO_PYTHON_TARGET_SCRIPT_PATH");
++#endif
++ wchar_t *wcs_target_script_name = NULL;
++ wchar_t *argv0 = NULL;
+ wchar_t *p = NULL;
+ Py_ssize_t n = 0;
+ PyObject *a;
+@@ -1842,7 +1860,14 @@
+ if (path == NULL)
+ return;
+
+- argv0 = argv[0];
++ if (target_script_name != NULL && *target_script_name != '\0') {
++ size_t length = strlen(target_script_name);
++ wcs_target_script_name = (wchar_t *) calloc(length + 1, sizeof(wchar_t));
++ if (mbstowcs(wcs_target_script_name, target_script_name, length) >= 0)
++ argv0 = wcs_target_script_name;
++ }
++ if (argv0 == NULL)
++ argv0 = argv[0];
+
+ #ifdef HAVE_READLINK
+ if (_HAVE_SCRIPT_ARGUMENT(argc, argv))
+@@ -1919,6 +1944,7 @@
+ if (PyList_Insert(path, 0, a) < 0)
+ Py_FatalError("sys.path.insert(0) failed");
+ Py_DECREF(a);
++ free(wcs_target_script_name);
+ }
+
+ void