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