[pypy-svn] pypy default: implemented posix.getgroups()

berdario commits-noreply at bitbucket.org
Mon Jan 24 14:38:02 CET 2011


Author: Dario Bertini <berdario at gmail.com>
Branch: 
Changeset: r41254:9e017d49f9ea
Date: 2011-01-23 23:05 +0100
http://bitbucket.org/pypy/pypy/changeset/9e017d49f9ea/

Log:	implemented posix.getgroups()

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
@@ -923,6 +923,14 @@
     return space.wrap(os.geteuid())
 geteuid.unwrap_spec = [ObjSpace]
 
+def getgroups(space):
+    """ getgroups() -> list of group IDs
+
+    Return list of supplemental group IDs for the process.
+    """
+    return space.newlist([space.wrap(e) for e in os.getgroups()])
+getgroups.unwrap_spec = [ObjSpace]
+
 def getpgrp(space):
     """ getpgrp() -> pgrp
 

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
@@ -170,6 +170,10 @@
                            ('tms_stime', rffi.INT),
                            ('tms_cutime', rffi.INT),
                            ('tms_cstime', rffi.INT)])
+        
+        GID_T = platform.SimpleType('gid_t',rffi.INT) 
+        #TODO right now is used only in getgroups, may need to update other functions like setgid
+                           
 
     SEEK_SET = platform.DefinedConstantInteger('SEEK_SET')
     SEEK_CUR = platform.DefinedConstantInteger('SEEK_CUR')
@@ -673,6 +677,24 @@
     @registering_if(os, 'getegid')
     def register_os_getegid(self):
         return self.extdef_for_os_function_returning_int('getegid')
+        
+    @registering_if(os, 'getgroups')
+    def register_os_getgroups(self):
+        GP = rffi.CArrayPtr(self.GID_T)
+        c_getgroups = self.llexternal('getgroups',[rffi.INT, GP],rffi.INT)
+
+        def getgroups_llimpl():
+            n = c_getgroups(0,s_None)
+            if n >= 0:
+                groups = lltype.malloc(GP.TO, n, flavor='raw')
+                n = c_getgroups(n,groups)
+                result = [g for g in groups]
+                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, export_name="ll_os.ll_getgroups")
 
     @registering_if(os, 'getpgrp')
     def register_os_getpgrp(self):

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
@@ -132,9 +132,9 @@
         interpleveldefs['nice'] = 'interp_posix.nice'
 
     for name in ['setsid', 'getuid', 'geteuid', 'getgid', 'getegid', 'setuid',
-                 'seteuid', 'setgid', 'setegid', 'getpgrp', 'setpgrp',
-                 'getppid', 'getpgid', 'setpgid', 'setreuid', 'setregid',
-                 'getsid', 'setsid']:
+                 'seteuid', 'setgid', 'setegid', 'getgroups', 'getpgrp', 
+                 'setpgrp', 'getppid', 'getpgid', 'setpgid', 'setreuid', 
+                 'setregid', 'getsid', 'setsid']:
         if hasattr(os, name):
             interpleveldefs[name] = 'interp_posix.%s' % (name,)
     # not visible via os, inconsistency in nt:


More information about the Pypy-commit mailing list