From e8e4b3bfd65582564b5933dcb4d0cdb3157884dc Mon Sep 17 00:00:00 2001 From: Brian Curtin Date: Thu, 23 Sep 2010 20:04:14 +0000 Subject: #9808. Implement os.getlogin for Windows, completed by Jon Anglin. 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 | 6 +++--- Lib/test/test_os.py | 8 ++++++++ Misc/NEWS | 2 ++ Modules/posixmodule.c | 17 +++++++++++++++-- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 30529f1..0baed15 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -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) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 12e516e..5509f1f 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -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__": diff --git a/Misc/NEWS b/Misc/NEWS index 243bc6f..9480cf4 100644 --- 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(). diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index a3e106a..79faa18 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -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 #include #include /* for ShellExecute() */ +#include /* 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__, -- cgit v0.12