Index: Doc/library/os.rst =================================================================== --- Doc/library/os.rst (revision 84824) +++ Doc/library/os.rst (working copy) @@ -244,12 +244,12 @@ .. 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: Lib/test/test_os.py =================================================================== --- Lib/test/test_os.py (revision 84824) +++ Lib/test/test_os.py (working copy) @@ -1193,6 +1193,13 @@ 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, @@ -1211,6 +1218,7 @@ Win32SymlinkTests, FSEncodingTests, PidTests, + LoginTests, ) if __name__ == "__main__": Index: Modules/posixmodule.c =================================================================== --- Modules/posixmodule.c (revision 84824) +++ Modules/posixmodule.c (working copy) @@ -122,6 +122,7 @@ #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 @@ #include #include #include /* for ShellExecute() */ +#include /* for UNLEN */ #endif /* _MSC_VER */ #if defined(PYCC_VACPP) && defined(PYOS_OS2) @@ -4434,6 +4436,17 @@ posix_getlogin(PyObject *self, PyObject *noargs) { PyObject *result = NULL; +#ifdef MS_WINDOWS + wchar_t user_name[UNLEN + 1]; + DWORD num_chars = _countof(user_name); + + 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; @@ -4448,10 +4461,10 @@ else result = PyUnicode_DecodeFSDefault(name); errno = old_errno; - +#endif return result; } -#endif +#endif /* HAVE_GETLOGIN */ #ifdef HAVE_GETUID PyDoc_STRVAR(posix_getuid__doc__,