[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