[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