[pypy-commit] pypy default: os.initgroups()
arigo
noreply at buildbot.pypy.org
Sat Nov 9 17:24:34 CET 2013
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r67894:150c1dc68223
Date: 2013-11-09 15:27 +0100
http://bitbucket.org/pypy/pypy/changeset/150c1dc68223/
Log: os.initgroups()
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
@@ -156,7 +156,7 @@
'seteuid', 'setgid', 'setegid', 'getgroups', 'getpgrp',
'setpgrp', 'getppid', 'getpgid', 'setpgid', 'setreuid',
'setregid', 'getsid', 'setsid', 'fstatvfs', 'statvfs',
- 'setgroups']:
+ 'setgroups', 'initgroups']:
if hasattr(os, name):
interpleveldefs[name] = 'interp_posix.%s' % (name,)
# not visible via os, inconsistency in nt:
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
@@ -1008,6 +1008,19 @@
except OSError, e:
raise wrap_oserror(space, e)
+ at unwrap_spec(username=str, gid=c_gid_t)
+def initgroups(space, username, gid):
+ """ initgroups(username, gid) -> None
+
+ Call the system initgroups() to initialize the group access list with all of
+ the groups of which the specified username is a member, plus the specified
+ group id.
+ """
+ try:
+ os.initgroups(username, gid)
+ except OSError, e:
+ raise wrap_oserror(space, e)
+
def getpgrp(space):
""" getpgrp() -> pgrp
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
@@ -615,6 +615,8 @@
def test_os_getgroups(self):
os = self.posix
assert os.getgroups() == self.getgroups
+
+ if hasattr(os, 'setgroups'):
def test_os_setgroups(self):
os = self.posix
raises(TypeError, os.setgroups, [2, 5, "hello"])
@@ -623,6 +625,11 @@
except OSError:
pass
+ if hasattr(os, 'initgroups'):
+ def test_os_initgroups(self):
+ os = self.posix
+ raises(OSError, os.initgroups, "crW2hTQC", 100)
+
if hasattr(os, 'getpgid'):
def test_os_getpgid(self):
os = self.posix
diff --git a/rpython/rtyper/module/ll_os.py b/rpython/rtyper/module/ll_os.py
--- a/rpython/rtyper/module/ll_os.py
+++ b/rpython/rtyper/module/ll_os.py
@@ -702,14 +702,15 @@
groups = lltype.malloc(GP.TO, n, flavor='raw')
try:
n = c_getgroups(n, groups)
- result = [groups[i] for i in range(n)]
+ result = [rffi.cast(lltype.Signed, groups[i])
+ for i in range(n)]
finally:
lltype.free(groups, flavor='raw')
if n >= 0:
return result
raise OSError(rposix.get_errno(), "os_getgroups failed")
- return extdef([], [self.GID_T], llimpl=getgroups_llimpl,
+ return extdef([], [int], llimpl=getgroups_llimpl,
export_name="ll_os.ll_getgroups")
@registering_if(os, 'setgroups')
@@ -729,9 +730,22 @@
if n != 0:
raise OSError(rposix.get_errno(), "os_setgroups failed")
- return extdef([[self.GID_T]], None, llimpl=setgroups_llimpl,
+ return extdef([[int]], None, llimpl=setgroups_llimpl,
export_name="ll_os.ll_setgroups")
+ @registering_if(os, 'initgroups')
+ def register_os_initgroups(self):
+ c_initgroups = self.llexternal('initgroups',
+ [rffi.CCHARP, self.GID_T], rffi.INT)
+
+ def initgroups_llimpl(user, group):
+ n = c_initgroups(user, rffi.cast(self.GID_T, group))
+ if n != 0:
+ raise OSError(rposix.get_errno(), "os_initgroups failed")
+
+ return extdef([str, int], None, llimpl=initgroups_llimpl,
+ export_name="ll_os.ll_initgroups")
+
@registering_if(os, 'getpgrp')
def register_os_getpgrp(self):
name = 'getpgrp'
diff --git a/rpython/rtyper/module/test/test_posix.py b/rpython/rtyper/module/test/test_posix.py
--- a/rpython/rtyper/module/test/test_posix.py
+++ b/rpython/rtyper/module/test/test_posix.py
@@ -206,6 +206,7 @@
ll_a = self.interpret(f, [])
assert self.ll_to_list(ll_a) == f()
+ if hasattr(os, 'setgroups'):
def test_setgroups(self):
def f():
try:
@@ -213,3 +214,14 @@
except OSError:
pass
self.interpret(f, [])
+
+ if hasattr(os, 'initgroups'):
+ def test_initgroups(self):
+ def f():
+ try:
+ os.initgroups('sUJJeumz', 4321)
+ except OSError:
+ return 1
+ return 0
+ res = self.interpret(f, [])
+ assert res == 1
More information about the pypy-commit
mailing list