Author: Armin Rigo <ar...@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, []) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit