[Python-checkins] r84983 - in python/branches/py3k: Doc/library/os.rst Lib/test/test_os.py Misc/NEWS Modules/posixmodule.c

brian.curtin python-checkins at python.org
Thu Sep 23 22:04:14 CEST 2010


Author: brian.curtin
Date: Thu Sep 23 22:04:14 2010
New Revision: 84983
Log:
#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.
Modified:
 python/branches/py3k/Doc/library/os.rst
 python/branches/py3k/Lib/test/test_os.py
 python/branches/py3k/Misc/NEWS
 python/branches/py3k/Modules/posixmodule.c
Modified: python/branches/py3k/Doc/library/os.rst
==============================================================================
--- python/branches/py3k/Doc/library/os.rst	(original)
+++ python/branches/py3k/Doc/library/os.rst	Thu Sep 23 22:04:14 2010
@@ -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)
Modified: python/branches/py3k/Lib/test/test_os.py
==============================================================================
--- python/branches/py3k/Lib/test/test_os.py	(original)
+++ python/branches/py3k/Lib/test/test_os.py	Thu Sep 23 22:04:14 2010
@@ -1202,6 +1202,13 @@
 self.assertEqual(int(stdout), os.getpid())
 
 
+ at 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 @@
 Win32SymlinkTests,
 FSEncodingTests,
 PidTests,
+ LoginTests,
 )
 
 if __name__ == "__main__":
Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Thu Sep 23 22:04:14 2010
@@ -10,6 +10,8 @@
 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().
Modified: python/branches/py3k/Modules/posixmodule.c
==============================================================================
--- python/branches/py3k/Modules/posixmodule.c	(original)
+++ python/branches/py3k/Modules/posixmodule.c	Thu Sep 23 22:04:14 2010
@@ -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 <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 @@
 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 @@
 else
 result = PyUnicode_DecodeFSDefault(name);
 errno = old_errno;
-
+#endif
 return result;
 }
-#endif
+#endif /* HAVE_GETLOGIN */
 
 #ifdef HAVE_GETUID
 PyDoc_STRVAR(posix_getuid__doc__,


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /