summarylogtreecommitdiffstats
path: root/0060-cygpty-isatty.patch
diff options
context:
space:
mode:
authoratomlong2021-10-23 17:55:22 +0800
committeratomlong2021-10-23 18:06:15 +0800
commit80096c8de4b34ec1ed8f30bb428918cd592b2424 (patch)
treeb48dd1e73de9ea35a4709fb6b93deb16331ec514 /0060-cygpty-isatty.patch
parent89a67c05174951d172252b1db96ff93cc4ec4bcd (diff)
downloadaur-mingw-w64-python.tar.gz
update to 3.9.7
Diffstat (limited to '0060-cygpty-isatty.patch')
-rw-r--r--0060-cygpty-isatty.patch461
1 files changed, 461 insertions, 0 deletions
diff --git a/0060-cygpty-isatty.patch b/0060-cygpty-isatty.patch
new file mode 100644
index 000000000000..e639c91f2e1c
--- /dev/null
+++ b/0060-cygpty-isatty.patch
@@ -0,0 +1,461 @@
+From 0255306a4066705227cd3d903290d9550593e295 Mon Sep 17 00:00:00 2001
+From: Christoph Reiter <reiter.christoph@gmail.com>
+Date: Thu, 17 Jun 2021 18:52:14 +0530
+Subject: [PATCH 060/N] cygpty isatty
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Co-authored-by: Алексей <alexey.pawlow@gmail.com>
+---
+ Include/iscygpty.h | 41 ++++++++++
+ Makefile.pre.in | 2 +
+ Modules/_io/fileio.c | 3 +-
+ Modules/main.c | 3 +-
+ Modules/posixmodule.c | 3 +-
+ Objects/fileobject.c | 3 +-
+ Python/bltinmodule.c | 5 +-
+ Python/fileutils.c | 3 +-
+ Python/frozenmain.c | 3 +-
+ Python/iscygpty.c | 185 ++++++++++++++++++++++++++++++++++++++++++
+ Python/pylifecycle.c | 3 +-
+ 11 files changed, 245 insertions(+), 9 deletions(-)
+ create mode 100644 Include/iscygpty.h
+ create mode 100644 Python/iscygpty.c
+
+diff --git a/Include/iscygpty.h b/Include/iscygpty.h
+new file mode 100644
+index 0000000..82fd0af
+--- /dev/null
++++ b/Include/iscygpty.h
+@@ -0,0 +1,41 @@
++/*
++ * iscygpty.h -- part of ptycheck
++ * https://github.com/k-takata/ptycheck
++ *
++ * Copyright (c) 2015-2017 K.Takata
++ *
++ * You can redistribute it and/or modify it under the terms of either
++ * the MIT license (as described below) or the Vim license.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining
++ * a copy of this software and associated documentation files (the
++ * "Software"), to deal in the Software without restriction, including
++ * without limitation the rights to use, copy, modify, merge, publish,
++ * distribute, sublicense, and/or sell copies of the Software, and to
++ * permit persons to whom the Software is furnished to do so, subject to
++ * the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be
++ * included in all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
++ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
++ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
++ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++ */
++
++#ifndef _ISCYGPTY_H
++#define _ISCYGPTY_H
++
++#ifdef _WIN32
++int is_cygpty(int fd);
++int is_cygpty_used(void);
++#else
++#define is_cygpty(fd) 0
++#define is_cygpty_used() 0
++#endif
++
++#endif /* _ISCYGPTY_H */
+diff --git a/Makefile.pre.in b/Makefile.pre.in
+index 87e95ec..e351cae 100644
+--- a/Makefile.pre.in
++++ b/Makefile.pre.in
+@@ -372,6 +372,7 @@ PYTHON_OBJS= \
+ Python/import.o \
+ Python/importdl.o \
+ Python/initconfig.o \
++ Python/iscygpty.o \
+ Python/marshal.o \
+ Python/modsupport.o \
+ Python/mysnprintf.o \
+@@ -1070,6 +1071,7 @@ PYTHON_HEADERS= \
+ $(srcdir)/Include/import.h \
+ $(srcdir)/Include/interpreteridobject.h \
+ $(srcdir)/Include/intrcheck.h \
++ $(srcdir)/Include/iscygpty.h \
+ $(srcdir)/Include/iterobject.h \
+ $(srcdir)/Include/listobject.h \
+ $(srcdir)/Include/longintrepr.h \
+diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c
+index 048484b..0b56118 100644
+--- a/Modules/_io/fileio.c
++++ b/Modules/_io/fileio.c
+@@ -19,6 +19,7 @@
+ #endif
+ #include <stddef.h> /* For offsetof */
+ #include "_iomodule.h"
++#include "iscygpty.h"
+
+ /*
+ * Known likely problems:
+@@ -1128,7 +1129,7 @@ _io_FileIO_isatty_impl(fileio *self)
+ return err_closed();
+ Py_BEGIN_ALLOW_THREADS
+ _Py_BEGIN_SUPPRESS_IPH
+- res = isatty(self->fd);
++ res = isatty(self->fd) || is_cygpty(self->fd);
+ _Py_END_SUPPRESS_IPH
+ Py_END_ALLOW_THREADS
+ return PyBool_FromLong(res);
+diff --git a/Modules/main.c b/Modules/main.c
+index 2cc891f..17469e3 100644
+--- a/Modules/main.c
++++ b/Modules/main.c
+@@ -6,6 +6,7 @@
+ #include "pycore_pathconfig.h" // _PyPathConfig_ComputeSysPath0()
+ #include "pycore_pylifecycle.h" // _Py_PreInitializeFromPyArgv()
+ #include "pycore_pystate.h" // _PyInterpreterState_GET()
++#include "iscygpty.h"
+
+ /* Includes for exit_sigint() */
+ #include <stdio.h> // perror()
+@@ -91,7 +92,7 @@ static inline int config_run_code(const PyConfig *config)
+ static int
+ stdin_is_interactive(const PyConfig *config)
+ {
+- return (isatty(fileno(stdin)) || config->interactive);
++ return (isatty(fileno(stdin)) || config->interactive || is_cygpty(fileno(stdin)));
+ }
+
+
+diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
+index 40fc270..bb1b81d 100644
+--- a/Modules/posixmodule.c
++++ b/Modules/posixmodule.c
+@@ -36,6 +36,7 @@
+ #ifdef __ANDROID__
+ # undef HAVE_FACCESSAT
+ #endif
++#include "iscygpty.h"
+
+ #include <stdio.h> /* needed for ctermid() */
+
+@@ -10082,7 +10083,7 @@ os_isatty_impl(PyObject *module, int fd)
+ {
+ int return_value;
+ _Py_BEGIN_SUPPRESS_IPH
+- return_value = isatty(fd);
++ return_value = isatty(fd) || is_cygpty(fd);
+ _Py_END_SUPPRESS_IPH
+ return return_value;
+ }
+diff --git a/Objects/fileobject.c b/Objects/fileobject.c
+index 1c6ecaf..afddc4f 100644
+--- a/Objects/fileobject.c
++++ b/Objects/fileobject.c
+@@ -2,6 +2,7 @@
+
+ #define PY_SSIZE_T_CLEAN
+ #include "Python.h"
++#include "iscygpty.h"
+ #include "pycore_runtime.h" // _PyRuntime
+
+ #if defined(HAVE_GETC_UNLOCKED) && !defined(_Py_MEMORY_SANITIZER)
+@@ -435,7 +436,7 @@ stdprinter_isatty(PyStdPrinter_Object *self, PyObject *Py_UNUSED(ignored))
+ }
+
+ Py_BEGIN_ALLOW_THREADS
+- res = isatty(self->fd);
++ res = isatty(self->fd) || is_cygpty(self->fd);
+ Py_END_ALLOW_THREADS
+
+ return PyBool_FromLong(res);
+diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
+index 21c70f9..58d7512 100644
+--- a/Python/bltinmodule.c
++++ b/Python/bltinmodule.c
+@@ -1,6 +1,7 @@
+ /* Built-in functions */
+
+ #include "Python.h"
++#include "iscygpty.h"
+ #include <ctype.h>
+ #include "ast.h"
+ #undef Yield /* undefine macro conflicting with <winbase.h> */
+@@ -1971,7 +1972,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
+ Py_DECREF(tmp);
+ if (fd < 0 && PyErr_Occurred())
+ return NULL;
+- tty = fd == fileno(stdin) && isatty(fd);
++ tty = fd == fileno(stdin) && (isatty(fd) || is_cygpty(fd));
+ }
+ if (tty) {
+ tmp = _PyObject_CallMethodIdNoArgs(fout, &PyId_fileno);
+@@ -1984,7 +1985,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
+ Py_DECREF(tmp);
+ if (fd < 0 && PyErr_Occurred())
+ return NULL;
+- tty = fd == fileno(stdout) && isatty(fd);
++ tty = fd == fileno(stdout) && (isatty(fd) || is_cygpty(fd));
+ }
+ }
+
+diff --git a/Python/fileutils.c b/Python/fileutils.c
+index 4b299b2..573a5c2 100644
+--- a/Python/fileutils.c
++++ b/Python/fileutils.c
+@@ -1,4 +1,5 @@
+ #include "Python.h"
++#include "iscygpty.h"
+ #include "pycore_fileutils.h"
+ #include "osdefs.h" // SEP
+ #include <locale.h>
+@@ -70,7 +71,7 @@ _Py_device_encoding(int fd)
+ #endif
+ int valid;
+ _Py_BEGIN_SUPPRESS_IPH
+- valid = isatty(fd);
++ valid = isatty(fd) || is_cygpty(fd);
+ _Py_END_SUPPRESS_IPH
+ if (!valid)
+ Py_RETURN_NONE;
+diff --git a/Python/frozenmain.c b/Python/frozenmain.c
+index dd04d60..6607762 100644
+--- a/Python/frozenmain.c
++++ b/Python/frozenmain.c
+@@ -4,6 +4,7 @@
+ #include "Python.h"
+ #include "pycore_runtime.h" // _PyRuntime_Initialize()
+ #include <locale.h>
++#include "iscygpty.h"
+
+ #ifdef MS_WINDOWS
+ extern void PyWinFreeze_ExeInit(void);
+@@ -107,7 +108,7 @@ Py_FrozenMain(int argc, char **argv)
+ else
+ sts = 0;
+
+- if (inspect && isatty((int)fileno(stdin)))
++ if (inspect && (isatty((int)fileno(stdin)) || is_cygpty((int)fileno(stdin))))
+ sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
+
+ #ifdef MS_WINDOWS
+diff --git a/Python/iscygpty.c b/Python/iscygpty.c
+new file mode 100644
+index 0000000..722f88f
+--- /dev/null
++++ b/Python/iscygpty.c
+@@ -0,0 +1,185 @@
++/*
++ * iscygpty.c -- part of ptycheck
++ * https://github.com/k-takata/ptycheck
++ *
++ * Copyright (c) 2015-2017 K.Takata
++ *
++ * You can redistribute it and/or modify it under the terms of either
++ * the MIT license (as described below) or the Vim license.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining
++ * a copy of this software and associated documentation files (the
++ * "Software"), to deal in the Software without restriction, including
++ * without limitation the rights to use, copy, modify, merge, publish,
++ * distribute, sublicense, and/or sell copies of the Software, and to
++ * permit persons to whom the Software is furnished to do so, subject to
++ * the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be
++ * included in all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
++ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
++ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
++ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++ */
++
++#ifdef _WIN32
++
++#include <ctype.h>
++#include <io.h>
++#include <wchar.h>
++#include <windows.h>
++
++#ifdef USE_FILEEXTD
++/* VC 7.1 or earlier doesn't support SAL. */
++# if !defined(_MSC_VER) || (_MSC_VER < 1400)
++# define __out
++# define __in
++# define __in_opt
++# endif
++/* Win32 FileID API Library:
++ * http://www.microsoft.com/en-us/download/details.aspx?id=22599
++ * Needed for WinXP. */
++# include <fileextd.h>
++#else /* USE_FILEEXTD */
++/* VC 8 or earlier. */
++# if defined(_MSC_VER) && (_MSC_VER < 1500)
++# ifdef ENABLE_STUB_IMPL
++# define STUB_IMPL
++# else
++# error "Win32 FileID API Library is required for VC2005 or earlier."
++# endif
++# endif
++#endif /* USE_FILEEXTD */
++
++
++#include "iscygpty.h"
++
++//#define USE_DYNFILEID
++#ifdef USE_DYNFILEID
++typedef BOOL (WINAPI *pfnGetFileInformationByHandleEx)(
++ HANDLE hFile,
++ FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
++ LPVOID lpFileInformation,
++ DWORD dwBufferSize
++);
++static pfnGetFileInformationByHandleEx pGetFileInformationByHandleEx = NULL;
++
++# ifndef USE_FILEEXTD
++static BOOL WINAPI stub_GetFileInformationByHandleEx(
++ HANDLE hFile,
++ FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
++ LPVOID lpFileInformation,
++ DWORD dwBufferSize
++ )
++{
++ return FALSE;
++}
++# endif
++
++static void setup_fileid_api(void)
++{
++ if (pGetFileInformationByHandleEx != NULL) {
++ return;
++ }
++ pGetFileInformationByHandleEx = (pfnGetFileInformationByHandleEx)
++ GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
++ "GetFileInformationByHandleEx");
++ if (pGetFileInformationByHandleEx == NULL) {
++# ifdef USE_FILEEXTD
++ pGetFileInformationByHandleEx = GetFileInformationByHandleEx;
++# else
++ pGetFileInformationByHandleEx = stub_GetFileInformationByHandleEx;
++# endif
++ }
++}
++#else
++# define pGetFileInformationByHandleEx GetFileInformationByHandleEx
++# define setup_fileid_api()
++#endif
++
++
++#define is_wprefix(s, prefix) \
++ (wcsncmp((s), (prefix), sizeof(prefix) / sizeof(WCHAR) - 1) == 0)
++
++/* Check if the fd is a cygwin/msys's pty. */
++int is_cygpty(int fd)
++{
++#ifdef STUB_IMPL
++ return 0;
++#else
++ HANDLE h;
++ int size = sizeof(FILE_NAME_INFO) + sizeof(WCHAR) * (MAX_PATH - 1);
++ FILE_NAME_INFO *nameinfo;
++ WCHAR *p = NULL;
++
++ setup_fileid_api();
++
++ h = (HANDLE) _get_osfhandle(fd);
++ if (h == INVALID_HANDLE_VALUE) {
++ return 0;
++ }
++ /* Cygwin/msys's pty is a pipe. */
++ if (GetFileType(h) != FILE_TYPE_PIPE) {
++ return 0;
++ }
++ nameinfo = malloc(size + sizeof(WCHAR));
++ if (nameinfo == NULL) {
++ return 0;
++ }
++ /* Check the name of the pipe:
++ * '\{cygwin,msys}-XXXXXXXXXXXXXXXX-ptyN-{from,to}-master' */
++ if (pGetFileInformationByHandleEx(h, FileNameInfo, nameinfo, size)) {
++ nameinfo->FileName[nameinfo->FileNameLength / sizeof(WCHAR)] = L'\0';
++ p = nameinfo->FileName;
++ if (is_wprefix(p, L"\\cygwin-")) { /* Cygwin */
++ p += 8;
++ } else if (is_wprefix(p, L"\\msys-")) { /* MSYS and MSYS2 */
++ p += 6;
++ } else {
++ p = NULL;
++ }
++ if (p != NULL) {
++ while (*p && isxdigit(*p)) /* Skip 16-digit hexadecimal. */
++ ++p;
++ if (is_wprefix(p, L"-pty")) {
++ p += 4;
++ } else {
++ p = NULL;
++ }
++ }
++ if (p != NULL) {
++ while (*p && isdigit(*p)) /* Skip pty number. */
++ ++p;
++ if (is_wprefix(p, L"-from-master")) {
++ //p += 12;
++ } else if (is_wprefix(p, L"-to-master")) {
++ //p += 10;
++ } else {
++ p = NULL;
++ }
++ }
++ }
++ free(nameinfo);
++ return (p != NULL);
++#endif /* STUB_IMPL */
++}
++
++/* Check if at least one cygwin/msys pty is used. */
++int is_cygpty_used(void)
++{
++ int fd, ret = 0;
++
++ for (fd = 0; fd < 3; fd++) {
++ ret |= is_cygpty(fd);
++ }
++ return ret;
++}
++
++#endif /* _WIN32 */
++
++/* vim: set ts=4 sw=4: */
+diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
+index 60f091c..734084c 100644
+--- a/Python/pylifecycle.c
++++ b/Python/pylifecycle.c
+@@ -19,6 +19,7 @@
+ #include "pycore_traceback.h" // _Py_DumpTracebackThreads()
+
+ #include "grammar.h" // PyGrammar_RemoveAccelerators()
++#include "iscygpty.h"
+ #include <locale.h> // setlocale()
+
+ #ifdef HAVE_SIGNAL_H
+@@ -2470,7 +2471,7 @@ _Py_RestoreSignals(void)
+ int
+ Py_FdIsInteractive(FILE *fp, const char *filename)
+ {
+- if (isatty((int)fileno(fp)))
++ if (isatty((int)fileno(fp)) || is_cygpty((int)fileno(fp)))
+ return 1;
+ if (!Py_InteractiveFlag)
+ return 0;
+--
+2.33.0
+