From 24d340b068ded595224ca618085b9b2401cf443b Mon Sep 17 00:00:00 2001 From: thexai <58434170+thexai@users.noreply.github.com> Date: Mon, 29 Jun 2026 16:06:03 +0200 Subject: [PATCH] gh-152433: Windows: allow build socketmodule for UWP --- ...-06-29-16-05-23.gh-issue-152433.fr2ZGO.rst | 1 + Modules/clinic/socketmodule.c.h | 10 +++---- Modules/socketmodule.c | 30 ++++++++++++------- 3 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2026-06-29-16-05-23.gh-issue-152433.fr2ZGO.rst diff --git a/Misc/NEWS.d/next/Windows/2026-06-29-16-05-23.gh-issue-152433.fr2ZGO.rst b/Misc/NEWS.d/next/Windows/2026-06-29-16-05-23.gh-issue-152433.fr2ZGO.rst new file mode 100644 index 00000000000000..2d79c396c38219 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2026-06-29-16-05-23.gh-issue-152433.fr2ZGO.rst @@ -0,0 +1 @@ +socketmodule: improve compatibility for UWP. diff --git a/Modules/clinic/socketmodule.c.h b/Modules/clinic/socketmodule.c.h index b565e7516d50f3..1be032e5a42657 100644 --- a/Modules/clinic/socketmodule.c.h +++ b/Modules/clinic/socketmodule.c.h @@ -463,7 +463,7 @@ _socket_inet_ntoa(PyObject *module, PyObject *arg) #endif /* defined(HAVE_INET_NTOA) */ -#if (defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)) +#if (defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS_DESKTOP)) PyDoc_STRVAR(_socket_if_nametoindex__doc__, "if_nametoindex($module, oname, /)\n" @@ -495,9 +495,9 @@ _socket_if_nametoindex(PyObject *module, PyObject *arg) return return_value; } -#endif /* (defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)) */ +#endif /* (defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS_DESKTOP)) */ -#if (defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)) +#if (defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS_DESKTOP)) PyDoc_STRVAR(_socket_if_indextoname__doc__, "if_indextoname($module, if_index, /)\n" @@ -526,7 +526,7 @@ _socket_if_indextoname(PyObject *module, PyObject *arg) return return_value; } -#endif /* (defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)) */ +#endif /* (defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS_DESKTOP)) */ #ifndef _SOCKET_SOCKET_SENDMSG_METHODDEF #define _SOCKET_SOCKET_SENDMSG_METHODDEF @@ -543,4 +543,4 @@ _socket_if_indextoname(PyObject *module, PyObject *arg) #ifndef _SOCKET_IF_INDEXTONAME_METHODDEF #define _SOCKET_IF_INDEXTONAME_METHODDEF #endif /* !defined(_SOCKET_IF_INDEXTONAME_METHODDEF) */ -/*[clinic end generated code: output=0b1fa78ac6589353 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=914eb6392666f00a input=a9049054013a1b77]*/ diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index ada4fda6571049..7c321b8bac9f1f 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -327,6 +327,10 @@ shutdown(how) -- shut down traffic in one or both directions\n\ // For if_nametoindex() and if_indextoname() #include +#ifndef RPC_S_OK +#define RPC_S_OK 0L +#endif + /* remove some flags on older version Windows during run-time. https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */ typedef struct { @@ -631,14 +635,14 @@ _PyLong_##NAME##_Converter(PyObject *obj, void *ptr) \ return 1; \ } -#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS) +#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS_DESKTOP) # ifdef MS_WINDOWS UNSIGNED_INT_CONVERTER(NetIfindex, NET_IFINDEX) # else # define _PyLong_NetIfindex_Converter _PyLong_UnsignedInt_Converter # define NET_IFINDEX unsigned int # endif -#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS) +#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS_DESKTOP) /*[python input] class NET_IFINDEX_converter(CConverter): @@ -5885,10 +5889,12 @@ socket_gethostname(PyObject *self, PyObject *unused) Otherwise, gethostname apparently also returns the DNS name. */ wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1]; DWORD size = Py_ARRAY_LENGTH(buf); - wchar_t *name; - PyObject *result; +#ifdef MS_WINDOWS_DESKTOP if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size)) +#else + if (GetComputerNameW(buf, &size)) +#endif return PyUnicode_FromWideChar(buf, size); if (GetLastError() != ERROR_MORE_DATA) @@ -5897,9 +5903,12 @@ socket_gethostname(PyObject *self, PyObject *unused) if (size == 0) return Py_GetConstant(Py_CONSTANT_EMPTY_STR); +#ifndef MS_WINDOWS_DESKTOP + return NULL; +#else /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer names */ - name = PyMem_New(wchar_t, size); + wchar_t* name = PyMem_New(wchar_t, size); if (!name) { PyErr_NoMemory(); return NULL; @@ -5913,9 +5922,10 @@ socket_gethostname(PyObject *self, PyObject *unused) return NULL; } - result = PyUnicode_FromWideChar(name, size); + PyObject* result = PyUnicode_FromWideChar(name, size); PyMem_Free(name); return result; +#endif #else char buf[1024]; int res; @@ -7202,7 +7212,7 @@ Set the default timeout in seconds (real number) for new socket objects.\n\ A value of None indicates that new socket objects have no timeout.\n\ When the socket module is first imported, the default is None."); -#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS) +#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS_DESKTOP) /* Python API for getting interface indices and names */ static PyObject * @@ -7343,7 +7353,7 @@ _socket_if_indextoname_impl(PyObject *module, NET_IFINDEX index) return PyUnicode_DecodeFSDefault(name); } -#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS) +#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS_DESKTOP) #ifdef CMSG_LEN @@ -7479,7 +7489,7 @@ static PyMethodDef socket_methods[] = { METH_NOARGS, getdefaulttimeout_doc}, {"setdefaulttimeout", socket_setdefaulttimeout, METH_O, setdefaulttimeout_doc}, -#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS) +#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS_DESKTOP) {"if_nameindex", socket_if_nameindex, METH_NOARGS, if_nameindex_doc}, _SOCKET_IF_NAMETOINDEX_METHODDEF @@ -9301,7 +9311,7 @@ socket_exec(PyObject *m) } #endif -#ifdef MS_WINDOWS +#ifdef MS_WINDOWS_DESKTOP /* remove some flags on older version Windows during run-time */ if (remove_unusable_flags(m) < 0) { goto error;