]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
#9808. Implement os.getlogin for Windows, completed by Jon Anglin.
authorBrian Curtin <brian.curtin@gmail.com>
Thu, 23 Sep 2010 20:04:14 +0000 (20:04 +0000)
committerBrian Curtin <brian.curtin@gmail.com>
Thu, 23 Sep 2010 20:04:14 +0000 (20:04 +0000)
The test is semi-dumb, it just makes sure something comes back since we
don't have a solid source to validate the returned login. We can't be 100%
sure that the USERNAME env var will always match what os.getlogin() returns,
so we don't make any specific assertion there.

Doc/library/os.rst
Lib/test/test_os.py
Misc/NEWS
Modules/posixmodule.c

index 30529f10c4a940255d9b337f55c89c2f3ebc67fd..0baed15fbe699376c5c5166a11e78c4abbfc17bd 100644 (file)
@@ -244,12 +244,12 @@ process and user.
 .. function:: getlogin()
 
    Return the name of the user logged in on the controlling terminal of the
-   process.  For most purposes, it is more useful to use the environment variable
-   :envvar:`LOGNAME` to find out who the user is, or
+   process.  For most purposes, it is more useful to use the environment variables
+   :envvar:`LOGNAME` or :envvar:`USERNAME` to find out who the user is, or
    ``pwd.getpwuid(os.getuid())[0]`` to get the login name of the currently
    effective user id.
 
-   Availability: Unix.
+   Availability: Unix, Windows.
 
 
 .. function:: getpgid(pid)
index 12e516efdad19f1adedba6eadd5941a9fc76dab3..5509f1fd0f40599fe4ee1ffadbdcd2c422372950 100644 (file)
@@ -1202,6 +1202,13 @@ class PidTests(unittest.TestCase):
         self.assertEqual(int(stdout), os.getpid())
 
 
+@unittest.skipUnless(hasattr(os, 'getlogin'), "test needs os.getlogin")
+class LoginTests(unittest.TestCase):
+    def test_getlogin(self):
+        user_name = os.getlogin()
+        self.assertNotEqual(len(user_name), 0)
+
+
 def test_main():
     support.run_unittest(
         FileTests,
@@ -1220,6 +1227,7 @@ def test_main():
         Win32SymlinkTests,
         FSEncodingTests,
         PidTests,
+        LoginTests,
     )
 
 if __name__ == "__main__":
index 243bc6fda6a0dae99e58c05e33a2c8adc055d3a9..9480cf447bc6cb9b89d45b2b54722ba982c319bb 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,8 @@ What's New in Python 3.2 Alpha 3?
 Core and Builtins
 -----------------
 
+- Issue #9808: Implement os.getlogin for Windows. Patch by Jon Anglin.
+
 - Issue #9901: Destroying the GIL in Py_Finalize() can fail if some other
   threads are still running.  Instead, reinitialize the GIL on a second call to
   Py_Initialize().
index a3e106a0c95fa4c2955a8396c1cb61e52103232e..79faa18c176b8397ed23bd5bc7a30a560a54292a 100644 (file)
@@ -122,6 +122,7 @@ corresponding Unix manual entries for more information on calls.");
 #ifdef _MSC_VER         /* Microsoft compiler */
 #define HAVE_GETCWD     1
 #define HAVE_GETPPID    1
+#define HAVE_GETLOGIN   1 
 #define HAVE_SPAWNV     1
 #define HAVE_EXECV      1
 #define HAVE_PIPE       1
@@ -276,6 +277,7 @@ extern int lstat(const char *, struct stat *);
 #include <malloc.h>
 #include <windows.h>
 #include <shellapi.h>   /* for ShellExecute() */
+#include <lmcons.h>     /* for UNLEN */
 #endif /* _MSC_VER */
 
 #if defined(PYCC_VACPP) && defined(PYOS_OS2)
@@ -4380,6 +4382,17 @@ static PyObject *
 posix_getlogin(PyObject *self, PyObject *noargs)
 {
     PyObject *result = NULL;
+#ifdef MS_WINDOWS    
+    wchar_t user_name[UNLEN + 1];
+    DWORD num_chars = sizeof(user_name)/sizeof(user_name[0]);
+
+    if (GetUserNameW(user_name, &num_chars)) {
+        /* num_chars is the number of unicode chars plus null terminator */
+        result = PyUnicode_FromWideChar(user_name, num_chars - 1);
+    } 
+    else 
+        result = PyErr_SetFromWindowsErr(GetLastError());
+#else
     char *name;
     int old_errno = errno;
 
@@ -4394,10 +4407,10 @@ posix_getlogin(PyObject *self, PyObject *noargs)
     else
         result = PyUnicode_DecodeFSDefault(name);
     errno = old_errno;
-
+#endif
     return result;
 }
-#endif
+#endif /* HAVE_GETLOGIN */
 
 #ifdef HAVE_GETUID
 PyDoc_STRVAR(posix_getuid__doc__,