From a2c17c58206cb3fc75bb5331a805663d635c62e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Sat, 9 Aug 2003 09:47:11 +0000 Subject: Move initialization of sys.std{in,out}.encoding to Py_Initialize. Verify that the encoding actually exists. Fixes #775985. Will backport to 2.3. --- Python/pythonrun.c | 66 +++++++++++++++++++++++++++++++++++++++++------------- Python/sysmodule.c | 18 --------------- 2 files changed, 51 insertions(+), 33 deletions(-) diff --git a/Python/pythonrun.c b/Python/pythonrun.c index de4a77f..f82de0a 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -77,7 +77,7 @@ static PyObject *warnings_module = NULL; If the module is returned, it is guaranteed to have been obtained without acquiring the import lock */ -PyObject *PyModule_GetWarningsModule() +PyObject *PyModule_GetWarningsModule(void) { PyObject *typ, *val, *tb; PyObject *all_modules; @@ -142,6 +142,11 @@ Py_Initialize(void) PyThreadState *tstate; PyObject *bimod, *sysmod; char *p; +#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET) + char *codeset; + char *saved_locale; + PyObject *sys_stream, *sys_isatty; +#endif extern void _Py_ReadyTypes(void); if (initialized) @@ -227,21 +232,52 @@ Py_Initialize(void) /* On Unix, set the file system encoding according to the user's preference, if the CODESET names a well-known Python codec, and Py_FileSystemDefaultEncoding isn't - initialized by other means. */ - if (!Py_FileSystemDefaultEncoding) { - char *saved_locale = setlocale(LC_CTYPE, NULL); - char *codeset; - setlocale(LC_CTYPE, ""); - codeset = nl_langinfo(CODESET); - if (*codeset) { - PyObject *enc = PyCodec_Encoder(codeset); - if (enc) { - Py_FileSystemDefaultEncoding = strdup(codeset); - Py_DECREF(enc); - } else - PyErr_Clear(); + initialized by other means. Also set the encoding of + stdin and stdout if these are terminals. */ + + saved_locale = setlocale(LC_CTYPE, NULL); + setlocale(LC_CTYPE, ""); + codeset = nl_langinfo(CODESET); + if (codeset && *codeset) { + PyObject *enc = PyCodec_Encoder(codeset); + if (enc) { + codeset = strdup(codeset); + Py_DECREF(enc); + } else { + codeset = NULL; + PyErr_Clear(); + } + } else + codeset = NULL; + setlocale(LC_CTYPE, saved_locale); + + if (codeset) { + sys_stream = PySys_GetObject("stdout"); + sys_isatty = PyObject_CallMethod(sys_stream, "isatty", ""); + if (!sys_isatty) + PyErr_Clear(); + if(sys_isatty && PyObject_IsTrue(sys_isatty)) { + if (!PyFile_SetEncoding(sys_stream, codeset)) + Py_FatalError("Cannot set codeset of stdin"); } - setlocale(LC_CTYPE, saved_locale); + Py_XDECREF(sys_stream); + Py_XDECREF(sys_isatty); + + sys_stream = PySys_GetObject("stdout"); + sys_isatty = PyObject_CallMethod(sys_stream, "isatty", ""); + if (!sys_isatty) + PyErr_Clear(); + if(sys_isatty && PyObject_IsTrue(sys_isatty)) { + if (!PyFile_SetEncoding(sys_stream, codeset)) + Py_FatalError("Cannot set codeset of stdout"); + } + Py_XDECREF(sys_stream); + Py_XDECREF(sys_isatty); + + if (!Py_FileSystemDefaultEncoding) + Py_FileSystemDefaultEncoding = codeset; + else + free(codeset); } #endif } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 8c77a88..c98e9f1 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -905,9 +905,6 @@ _PySys_Init(void) #ifdef MS_WINDOWS char buf[10]; #endif -#if defined(HAVE_LANGINFO_H) && defined(CODESET) - char *oldloc, *codeset; -#endif m = Py_InitModule3("sys", sys_methods, sys_doc); sysdict = PyModule_GetDict(m); @@ -930,21 +927,6 @@ _PySys_Init(void) } #endif -#if defined(HAVE_LANGINFO_H) && defined(CODESET) - oldloc = setlocale(LC_CTYPE, 0); - setlocale(LC_CTYPE, ""); - codeset = nl_langinfo(CODESET); - setlocale(LC_CTYPE, oldloc); - if(codeset && isatty(fileno(stdin))){ - if (!PyFile_SetEncoding(sysin, codeset)) - return NULL; - } - if(codeset && isatty(fileno(stdout))) { - if (!PyFile_SetEncoding(sysout, codeset)) - return NULL; - } -#endif - PyDict_SetItemString(sysdict, "stdin", sysin); PyDict_SetItemString(sysdict, "stdout", sysout); PyDict_SetItemString(sysdict, "stderr", syserr); -- cgit v0.12