summaryrefslogtreecommitdiff
path: root/sysutils/py-scandir/files/patch-_scandir.c
blob: 88cbcb6e2210bfb4d3128d2ddefce68484254e43 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Obtained from:	https://github.com/benhoyt/scandir/commit/4b5354de65413b9c5c6672f5f30c532bfda4d40a
		https://github.com/benhoyt/scandir/commit/3396aa4155ffde8600a0e9ca50d5872569169b5d
		https://github.com/benhoyt/scandir/commit/7ee0915f68d05dd187bea94ca1869bbeb1ea1d70

--- _scandir.c.orig	2018-08-02 16:17:16 UTC
+++ _scandir.c
@@ -94,7 +94,7 @@ comment):
 
 // _Py_stat_struct is already defined in fileutils.h on Python 3.5+
 // But not in PyPy
-#if PY_MAJOR_VERSION < 3 || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 5) || defined(PYPY_VERSION_NUM)
+#if PY_MAJOR_VERSION < 3 || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 5) || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 11) || defined(PYPY_VERSION_NUM)
 #ifdef MS_WINDOWS
 struct _Py_stat_struct {
     unsigned long st_dev;
@@ -660,7 +660,7 @@ _pystat_fromstructstat(STRUCT_STAT *st)
     return v;
 }
 
-char *PyStructSequence_UnnamedField = "unnamed field";
+static char *scandir_unnamed_field = "unnamed field";
 
 PyDoc_STRVAR(stat_result__doc__,
 "stat_result: Result from stat, fstat, or lstat.\n\n\
@@ -681,7 +681,7 @@ static PyStructSequence_Field stat_result_fields[] = {
     {"st_uid",     "user ID of owner"},
     {"st_gid",     "group ID of owner"},
     {"st_size",    "total size, in bytes"},
-    /* The NULL is replaced with PyStructSequence_UnnamedField later. */
+    /* The NULL is replaced with scandir_unnamed_field later. */
     {NULL,         "integer time of last access"},
     {NULL,         "integer time of last modification"},
     {NULL,         "integer time of last change"},
@@ -986,10 +986,12 @@ DirEntry_fetch_stat(DirEntry *self, int follow_symlink
     if (!path)
         return NULL;
 
+    Py_BEGIN_ALLOW_THREADS
     if (follow_symlinks)
         result = win32_stat_w(path, &st);
     else
         result = win32_lstat_w(path, &st);
+    Py_END_ALLOW_THREADS
 
     if (result != 0) {
         return PyErr_SetExcFromWindowsErrWithFilenameObject(PyExc_OSError,
@@ -1014,10 +1016,12 @@ DirEntry_fetch_stat(DirEntry *self, int follow_symlink
 #endif
     path = PyBytes_AS_STRING(bytes);
 
+    Py_BEGIN_ALLOW_THREADS
     if (follow_symlinks)
         result = STAT(path, &st);
     else
         result = LSTAT(path, &st);
+    Py_END_ALLOW_THREADS
     Py_DECREF(bytes);
 
     if (result != 0)
@@ -1813,9 +1817,9 @@ init_scandir(void)
     if (!billion)
         INIT_ERROR;
 
-    stat_result_desc.fields[7].name = PyStructSequence_UnnamedField;
-    stat_result_desc.fields[8].name = PyStructSequence_UnnamedField;
-    stat_result_desc.fields[9].name = PyStructSequence_UnnamedField;
+    stat_result_desc.fields[7].name = scandir_unnamed_field;
+    stat_result_desc.fields[8].name = scandir_unnamed_field;
+    stat_result_desc.fields[9].name = scandir_unnamed_field;
     PyStructSequence_InitType(&StatResultType, &stat_result_desc);
     structseq_new = StatResultType.tp_new;
     StatResultType.tp_new = statresult_new;