Issue #9377: Use Unicode API for gethostname on Windows.

This commit is contained in:
Martin v. Löwis 2010-10-29 18:20:08 +00:00
parent 83432babfd
commit 72f48422e2
2 changed files with 24 additions and 0 deletions

View File

@ -160,6 +160,8 @@ Library
Extensions
----------
- Issue #9377: Use Unicode API for gethostname on Windows.
- Issue #10143: Update "os.pathconf" values.
- Issue #6518: Support context manager protcol for ossaudiodev types.

View File

@ -3093,6 +3093,27 @@ static PyTypeObject sock_type = {
static PyObject *
socket_gethostname(PyObject *self, PyObject *unused)
{
#ifdef MS_WINDOWS
/* Don't use winsock's gethostname, as this returns the ANSI
version of the hostname, whereas we need a Unicode string.
Otherwise, gethostname apparently also returns the DNS name. */
wchar_t buf[MAX_COMPUTERNAME_LENGTH];
DWORD size = sizeof(buf);
if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size)) {
if (GetLastError() == ERROR_MORE_DATA) {
/* MSDN says this may occur "because DNS allows longer names */
PyObject *result = PyUnicode_FromUnicode(NULL, size);
if (!result)
return NULL;
if (GetComputerName(ComputerNamePhysicalDnsHostname,
PyUnicode_AS_UNICODE(result),
size+1))
return result;
}
return PyErr_SetExcFromWindowsErr(PyExc_WindowsError, GetLastError());
}
return PyUnicode_FromUnicode(buf, size);
#else
char buf[1024];
int res;
Py_BEGIN_ALLOW_THREADS
@ -3102,6 +3123,7 @@ socket_gethostname(PyObject *self, PyObject *unused)
return set_error();
buf[sizeof buf - 1] = '\0';
return PyUnicode_FromString(buf);
#endif
}
PyDoc_STRVAR(gethostname_doc,