summaryrefslogtreecommitdiffstats
path: root/Python/preconfig.c
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2019-05-17 20:44:16 (GMT)
committerGitHub <noreply@github.com>2019-05-17 20:44:16 (GMT)
commitbcfbbd704646622e919c1306a91fba61d603483d (patch)
tree51238f56ba837c49330424bd995b2de71b5a5a48 /Python/preconfig.c
parent98ff4d5fb6a9d01b0176b7786db61346952e5295 (diff)
downloadcpython-bcfbbd704646622e919c1306a91fba61d603483d.zip
cpython-bcfbbd704646622e919c1306a91fba61d603483d.tar.gz
cpython-bcfbbd704646622e919c1306a91fba61d603483d.tar.bz2
bpo-36945: Add _PyPreConfig.configure_locale (GH-13368)
_PyPreConfig_InitIsolatedConfig() sets configure_locale to 0 to prevent Python to modify the LC_CTYPE locale. In that case, coerce_c_locale an coerce_c_locale_warn are set to 0 as well.
Diffstat (limited to 'Python/preconfig.c')
-rw-r--r--Python/preconfig.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/Python/preconfig.c b/Python/preconfig.c
index 7814ee0..985af39 100644
--- a/Python/preconfig.c
+++ b/Python/preconfig.c
@@ -286,6 +286,7 @@ _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config)
{
_PyPreConfig_Init(config);
+ config->configure_locale = 0;
config->isolated = 1;
config->use_environment = 0;
#ifdef MS_WINDOWS
@@ -312,6 +313,7 @@ _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2)
COPY_ATTR(isolated);
COPY_ATTR(use_environment);
+ COPY_ATTR(configure_locale);
COPY_ATTR(dev_mode);
COPY_ATTR(coerce_c_locale);
COPY_ATTR(coerce_c_locale_warn);
@@ -360,6 +362,7 @@ _PyPreConfig_AsDict(const _PyPreConfig *config)
SET_ITEM_INT(isolated);
SET_ITEM_INT(use_environment);
+ SET_ITEM_INT(configure_locale);
SET_ITEM_INT(coerce_c_locale);
SET_ITEM_INT(coerce_c_locale_warn);
SET_ITEM_INT(utf8_mode);
@@ -603,6 +606,12 @@ preconfig_init_utf8_mode(_PyPreConfig *config, const _PyPreCmdline *cmdline)
static void
preconfig_init_coerce_c_locale(_PyPreConfig *config)
{
+ if (!config->configure_locale) {
+ config->coerce_c_locale = 0;
+ config->coerce_c_locale_warn = 0;
+ return;
+ }
+
const char *env = _Py_GetEnv(config->use_environment, "PYTHONCOERCECLOCALE");
if (env) {
if (strcmp(env, "0") == 0) {
@@ -746,7 +755,9 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args)
}
/* Set LC_CTYPE to the user preferred locale */
- _Py_SetLocaleFromEnv(LC_CTYPE);
+ if (config->configure_locale) {
+ _Py_SetLocaleFromEnv(LC_CTYPE);
+ }
_PyPreCmdline cmdline = _PyPreCmdline_INIT;
int init_utf8_mode = Py_UTF8Mode;
@@ -879,12 +890,14 @@ _PyPreConfig_Write(const _PyPreConfig *config)
_PyPreConfig_SetGlobalConfig(config);
- if (config->coerce_c_locale) {
- _Py_CoerceLegacyLocale(config->coerce_c_locale_warn);
- }
+ if (config->configure_locale) {
+ if (config->coerce_c_locale) {
+ _Py_CoerceLegacyLocale(config->coerce_c_locale_warn);
+ }
- /* Set LC_CTYPE to the user preferred locale */
- _Py_SetLocaleFromEnv(LC_CTYPE);
+ /* Set LC_CTYPE to the user preferred locale */
+ _Py_SetLocaleFromEnv(LC_CTYPE);
+ }
/* Write the new pre-configuration into _PyRuntime */
PyMemAllocatorEx old_alloc;