]> granicus.if.org Git - python/commitdiff
Move initialization of sys.std{in,out}.encoding to Py_Initialize.
authorMartin v. Löwis <martin@v.loewis.de>
Sat, 9 Aug 2003 09:47:11 +0000 (09:47 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Sat, 9 Aug 2003 09:47:11 +0000 (09:47 +0000)
Verify that the encoding actually exists. Fixes #775985.
Will backport to 2.3.

Python/pythonrun.c
Python/sysmodule.c

index de4a77fb6417a0bce99cf727dd4f17d029594b1d..f82de0adbe24bbc2f13ff3f35830bfe8cba4d00d 100644 (file)
@@ -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
 }
index 8c77a88cbb7d09e37ccd36918c767aba36b1e148..c98e9f1856fc24d4f8733152ee08570e7010ab5b 100644 (file)
@@ -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);