summaryrefslogtreecommitdiffstats
path: root/Modules/_winapi.c
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@python.org>2024-04-15 14:36:06 (GMT)
committerGitHub <noreply@github.com>2024-04-15 14:36:06 (GMT)
commit185999bb3ad3f1484da8fa4b84813980b976dc3c (patch)
treed288110bc9bac2e1459443a9a9d34ce12ac663b8 /Modules/_winapi.c
parent64cd6fc9a6a3c3c19091a1c81cbbe8994583017d (diff)
downloadcpython-185999bb3ad3f1484da8fa4b84813980b976dc3c.zip
cpython-185999bb3ad3f1484da8fa4b84813980b976dc3c.tar.gz
cpython-185999bb3ad3f1484da8fa4b84813980b976dc3c.tar.bz2
gh-90329: Add _winapi.GetLongPathName and GetShortPathName and use in venv to reduce warnings (GH-117817)
Diffstat (limited to 'Modules/_winapi.c')
-rw-r--r--Modules/_winapi.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/Modules/_winapi.c b/Modules/_winapi.c
index 8f9b852..57b8bdc 100644
--- a/Modules/_winapi.c
+++ b/Modules/_winapi.c
@@ -1517,6 +1517,49 @@ _winapi_GetLastError_impl(PyObject *module)
return GetLastError();
}
+
+/*[clinic input]
+_winapi.GetLongPathName
+
+ path: LPCWSTR
+
+Return the long version of the provided path.
+
+If the path is already in its long form, returns the same value.
+
+The path must already be a 'str'. If the type is not known, use
+os.fsdecode before calling this function.
+[clinic start generated code]*/
+
+static PyObject *
+_winapi_GetLongPathName_impl(PyObject *module, LPCWSTR path)
+/*[clinic end generated code: output=c4774b080275a2d0 input=9872e211e3a4a88f]*/
+{
+ DWORD cchBuffer;
+ PyObject *result = NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ cchBuffer = GetLongPathNameW(path, NULL, 0);
+ Py_END_ALLOW_THREADS
+ if (cchBuffer) {
+ WCHAR *buffer = (WCHAR *)PyMem_Malloc(cchBuffer * sizeof(WCHAR));
+ if (buffer) {
+ Py_BEGIN_ALLOW_THREADS
+ cchBuffer = GetLongPathNameW(path, buffer, cchBuffer);
+ Py_END_ALLOW_THREADS
+ if (cchBuffer) {
+ result = PyUnicode_FromWideChar(buffer, cchBuffer);
+ } else {
+ PyErr_SetFromWindowsErr(0);
+ }
+ PyMem_Free((void *)buffer);
+ }
+ } else {
+ PyErr_SetFromWindowsErr(0);
+ }
+ return result;
+}
+
/*[clinic input]
_winapi.GetModuleFileName
@@ -1552,6 +1595,48 @@ _winapi_GetModuleFileName_impl(PyObject *module, HMODULE module_handle)
}
/*[clinic input]
+_winapi.GetShortPathName
+
+ path: LPCWSTR
+
+Return the short version of the provided path.
+
+If the path is already in its short form, returns the same value.
+
+The path must already be a 'str'. If the type is not known, use
+os.fsdecode before calling this function.
+[clinic start generated code]*/
+
+static PyObject *
+_winapi_GetShortPathName_impl(PyObject *module, LPCWSTR path)
+/*[clinic end generated code: output=dab6ae494c621e81 input=43fa349aaf2ac718]*/
+{
+ DWORD cchBuffer;
+ PyObject *result = NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ cchBuffer = GetShortPathNameW(path, NULL, 0);
+ Py_END_ALLOW_THREADS
+ if (cchBuffer) {
+ WCHAR *buffer = (WCHAR *)PyMem_Malloc(cchBuffer * sizeof(WCHAR));
+ if (buffer) {
+ Py_BEGIN_ALLOW_THREADS
+ cchBuffer = GetShortPathNameW(path, buffer, cchBuffer);
+ Py_END_ALLOW_THREADS
+ if (cchBuffer) {
+ result = PyUnicode_FromWideChar(buffer, cchBuffer);
+ } else {
+ PyErr_SetFromWindowsErr(0);
+ }
+ PyMem_Free((void *)buffer);
+ }
+ } else {
+ PyErr_SetFromWindowsErr(0);
+ }
+ return result;
+}
+
+/*[clinic input]
_winapi.GetStdHandle -> HANDLE
std_handle: DWORD
@@ -2846,7 +2931,9 @@ static PyMethodDef winapi_functions[] = {
_WINAPI_GETCURRENTPROCESS_METHODDEF
_WINAPI_GETEXITCODEPROCESS_METHODDEF
_WINAPI_GETLASTERROR_METHODDEF
+ _WINAPI_GETLONGPATHNAME_METHODDEF
_WINAPI_GETMODULEFILENAME_METHODDEF
+ _WINAPI_GETSHORTPATHNAME_METHODDEF
_WINAPI_GETSTDHANDLE_METHODDEF
_WINAPI_GETVERSION_METHODDEF
_WINAPI_MAPVIEWOFFILE_METHODDEF