[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