[pypy-commit] pypy default: os.setgroups()
arigo
noreply at buildbot.pypy.org
Sat Nov 9 17:24:32 CET 2013
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r67893:6c6a6202227d
Date: 2013-11-09 15:17 +0100
http://bitbucket.org/pypy/pypy/changeset/6c6a6202227d/
Log: os.setgroups()
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
@@ -155,7 +155,8 @@
for name in ['setsid', 'getuid', 'geteuid', 'getgid', 'getegid', 'setuid',
'seteuid', 'setgid', 'setegid', 'getgroups', 'getpgrp',
'setpgrp', 'getppid', 'getpgid', 'setpgid', 'setreuid',
- 'setregid', 'getsid', 'setsid', 'fstatvfs', 'statvfs']:
+ 'setregid', 'getsid', 'setsid', 'fstatvfs', 'statvfs',
+ 'setgroups']:
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
@@ -987,7 +987,26 @@
Return list of supplemental group IDs for the process.
"""
- return space.newlist([space.wrap(e) for e in os.getgroups()])
+ try:
+ list = os.getgroups()
+ except OSError, e:
+ raise wrap_oserror(space, e)
+ return space.newlist([space.wrap(e) for e in list])
+
+def setgroups(space, w_list):
+ """ setgroups(list)
+
+ Set the groups of the current process to list.
+ """
+ list = []
+ for w_gid in space.unpackiterable(w_list):
+ gid = space.int_w(w_gid)
+ check_uid_range(space, gid)
+ list.append(gid)
+ try:
+ os.setgroups(list[:])
+ 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,13 @@
def test_os_getgroups(self):
os = self.posix
assert os.getgroups() == self.getgroups
+ def test_os_setgroups(self):
+ os = self.posix
+ raises(TypeError, os.setgroups, [2, 5, "hello"])
+ try:
+ os.setgroups(os.getgroups())
+ except OSError:
+ pass
if hasattr(os, 'getpgid'):
def test_os_getpgid(self):
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
@@ -712,6 +712,26 @@
return extdef([], [self.GID_T], llimpl=getgroups_llimpl,
export_name="ll_os.ll_getgroups")
+ @registering_if(os, 'setgroups')
+ def register_os_setgroups(self):
+ GP = rffi.CArrayPtr(self.GID_T)
+ c_setgroups = self.llexternal('setgroups', [rffi.SIZE_T, GP], rffi.INT)
+
+ def setgroups_llimpl(list):
+ n = len(list)
+ groups = lltype.malloc(GP.TO, n, flavor='raw')
+ try:
+ for i in range(n):
+ groups[i] = rffi.cast(self.GID_T, list[i])
+ n = c_setgroups(rffi.cast(rffi.SIZE_T, n), groups)
+ finally:
+ lltype.free(groups, flavor='raw')
+ if n != 0:
+ raise OSError(rposix.get_errno(), "os_setgroups failed")
+
+ return extdef([[self.GID_T]], None, llimpl=setgroups_llimpl,
+ export_name="ll_os.ll_setgroups")
+
@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
@@ -205,3 +205,11 @@
return os.getgroups()
ll_a = self.interpret(f, [])
assert self.ll_to_list(ll_a) == f()
+
+ def test_setgroups(self):
+ def f():
+ try:
+ os.setgroups(os.getgroups())
+ except OSError:
+ pass
+ self.interpret(f, [])
More information about the pypy-commit
mailing list