Author: Armin Rigo <[email protected]>
Branch:
Changeset: r46830:9337dc94fb03
Date: 2011-08-27 22:47 +0200
http://bitbucket.org/pypy/pypy/changeset/9337dc94fb03/
Log: (mitchellh, skip tests by arigo)
Patch to implement os.getlogin(). Thanks!
diff --git a/pypy/module/posix/__init__.py b/pypy/module/posix/__init__.py
--- a/pypy/module/posix/__init__.py
+++ b/pypy/module/posix/__init__.py
@@ -161,6 +161,8 @@
interpleveldefs['mknod'] = 'interp_posix.mknod'
if hasattr(os, 'nice'):
interpleveldefs['nice'] = 'interp_posix.nice'
+ if hasattr(os, 'getlogin'):
+ interpleveldefs['getlogin'] = 'interp_posix.getlogin'
for name in ['setsid', 'getuid', 'geteuid', 'getgid', 'getegid', 'setuid',
'seteuid', 'setgid', 'setegid', 'getgroups', 'getpgrp',
diff --git a/pypy/module/posix/interp_posix.py
b/pypy/module/posix/interp_posix.py
--- a/pypy/module/posix/interp_posix.py
+++ b/pypy/module/posix/interp_posix.py
@@ -464,6 +464,15 @@
space.wrap("strerror() argument out of range"))
return space.wrap(text)
+def getlogin(space):
+ """Return the currently logged in user."""
+ try:
+ cur = os.getlogin()
+ except OSError, e:
+ raise wrap_oserror(space, e)
+ else:
+ return space.wrap(cur)
+
# ____________________________________________________________
def getstatfields(space):
diff --git a/pypy/module/posix/test/test_posix2.py
b/pypy/module/posix/test/test_posix2.py
--- a/pypy/module/posix/test/test_posix2.py
+++ b/pypy/module/posix/test/test_posix2.py
@@ -805,6 +805,16 @@
data = f.read()
assert data == "who cares?"
+ try:
+ os.getlogin()
+ except (AttributeError, OSError):
+ pass
+ else:
+ def test_getlogin(self):
+ assert isinstance(self.posix.getlogin(), str)
+ # How else could we test that getlogin is properly
+ # working?
+
def test_tmpfile(self):
os = self.posix
f = os.tmpfile()
diff --git a/pypy/rpython/module/ll_os.py b/pypy/rpython/module/ll_os.py
--- a/pypy/rpython/module/ll_os.py
+++ b/pypy/rpython/module/ll_os.py
@@ -383,6 +383,20 @@
return extdef([int, int], s_None, llimpl=dup2_llimpl,
export_name="ll_os.ll_os_dup2")
+ @registering(os.getlogin, condition=not _WIN32)
+ def register_os_getlogin(self):
+ os_getlogin = self.llexternal('getlogin', [], rffi.CCHARP)
+
+ def getlogin_llimpl():
+ result = os_getlogin()
+ if not result:
+ raise OSError(rposix.get_errno(), "getlogin failed")
+
+ return rffi.charp2str(result)
+
+ return extdef([], str, llimpl=getlogin_llimpl,
+ export_name="ll_os.ll_os_getlogin")
+
@registering_str_unicode(os.utime)
def register_os_utime(self, traits):
UTIMBUFP = lltype.Ptr(self.UTIMBUF)
diff --git a/pypy/rpython/module/test/test_ll_os.py
b/pypy/rpython/module/test/test_ll_os.py
--- a/pypy/rpython/module/test/test_ll_os.py
+++ b/pypy/rpython/module/test/test_ll_os.py
@@ -35,6 +35,16 @@
for value in times:
assert isinstance(value, float)
+def test_getlogin():
+ if not hasattr(os, 'getlogin'):
+ py.test.skip('posix specific function')
+ try:
+ expected = os.getlogin()
+ except OSError, e:
+ py.test.skip("the underlying os.getlogin() failed: %s" % e)
+ data = getllimpl(os.getlogin)()
+ assert data == expected
+
def test_utimes():
if os.name != 'nt':
py.test.skip('Windows specific feature')
diff --git a/pypy/translator/c/test/test_extfunc.py
b/pypy/translator/c/test/test_extfunc.py
--- a/pypy/translator/c/test/test_extfunc.py
+++ b/pypy/translator/c/test/test_extfunc.py
@@ -595,6 +595,18 @@
f1 = compile(does_stuff, [])
f1()
+if hasattr(os, 'getlogin'):
+ def test_os_getlogin():
+ def does_stuff():
+ return os.getlogin()
+
+ try:
+ expected = os.getlogin()
+ except OSError, e:
+ py.test.skip("the underlying os.getlogin() failed: %s" % e)
+ f1 = compile(does_stuff, [])
+ assert f1() == expected
+
# ____________________________________________________________
def _real_getenv(var):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit