]> granicus.if.org Git - python/commitdiff
Issue #9377: Use Unicode API for gethostname on Windows.
authorMartin v. Löwis <martin@v.loewis.de>
Fri, 29 Oct 2010 18:20:08 +0000 (18:20 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Fri, 29 Oct 2010 18:20:08 +0000 (18:20 +0000)
Misc/NEWS
Modules/socketmodule.c

index 6b63779cbd12a97532804c01694579f2979f4959..dd18844edea6c702d37b8b21e6e3cf309ad12de4 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.
index fdbf7ee2476f13e78c86b2b466eedf3357ed5fee..e852287d646affddbf7a1946fa64312f4217c06e 100644 (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,