Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r67896:8913748cd7eb Date: 2013-11-09 15:56 +0100 http://bitbucket.org/pypy/pypy/changeset/8913748cd7eb/
Log: os.getresuid(), os.getresgid() 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,8 @@ 'seteuid', 'setgid', 'setegid', 'getgroups', 'getpgrp', 'setpgrp', 'getppid', 'getpgid', 'setpgid', 'setreuid', 'setregid', 'getsid', 'setsid', 'fstatvfs', 'statvfs', - 'setgroups', 'initgroups', 'tcgetpgrp', 'tcsetpgrp']: + 'setgroups', 'initgroups', 'tcgetpgrp', 'tcsetpgrp', + 'getresuid', 'getresgid']: 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 @@ -1144,6 +1144,32 @@ except OSError, e: raise wrap_oserror(space, e) +def getresuid(space): + """ getresuid() -> (ruid, euid, suid) + + Get tuple of the current process's real, effective, and saved user ids. + """ + try: + (ruid, euid, suid) = os.getresuid() + except OSError, e: + raise wrap_oserror(space, e) + return space.newtuple([space.wrap(ruid), + space.wrap(euid), + space.wrap(suid)]) + +def getresgid(space): + """ getresgid() -> (rgid, egid, sgid) + + Get tuple of the current process's real, effective, and saved group ids. + """ + try: + (rgid, egid, sgid) = os.getresgid() + except OSError, e: + raise wrap_oserror(space, e) + return space.newtuple([space.wrap(rgid), + space.wrap(egid), + space.wrap(sgid)]) + def declare_new_w_star(name): if name in RegisterOs.w_star_returning_int: @unwrap_spec(status=c_int) 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 @@ -658,6 +658,18 @@ assert os.getsid(0) == self.getsid0 raises(OSError, os.getsid, -100000) + if hasattr(os, 'getresuid'): + def test_os_getresuid(self): + os = self.posix + res = os.getresuid() + assert len(res) == 3 + + if hasattr(os, 'getresgid'): + def test_os_getresgid(self): + os = self.posix + res = os.getresgid() + assert len(res) == 3 + if hasattr(os, 'sysconf'): def test_os_sysconf(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 @@ -834,6 +834,50 @@ def register_os_setsid(self): return self.extdef_for_os_function_returning_int('setsid') + @registering_if(os, 'getresuid') + def register_os_getresuid(self): + c_getresuid = self.llexternal('getresuid', [rffi.INTP] * 3, rffi.INT) + + def c_getresuid_llimpl(): + out = lltype.malloc(rffi.INTP.TO, 3, flavor='raw') + try: + res = c_getresuid(rffi.ptradd(out, 0), + rffi.ptradd(out, 1), + rffi.ptradd(out, 2)) + res = rffi.cast(lltype.Signed, res) + if res == -1: + raise OSError(rposix.get_errno(), "getresuid failed") + return (rffi.cast(lltype.Signed, out[0]), + rffi.cast(lltype.Signed, out[1]), + rffi.cast(lltype.Signed, out[2])) + finally: + lltype.free(out, flavor='raw') + + return extdef([], (int, int, int), llimpl=c_getresuid_llimpl, + export_name='ll_os.ll_os_getresuid') + + @registering_if(os, 'getresgid') + def register_os_getresgid(self): + c_getresgid = self.llexternal('getresgid', [rffi.INTP] * 3, rffi.INT) + + def c_getresgid_llimpl(): + out = lltype.malloc(rffi.INTP.TO, 3, flavor='raw') + try: + res = c_getresgid(rffi.ptradd(out, 0), + rffi.ptradd(out, 1), + rffi.ptradd(out, 2)) + res = rffi.cast(lltype.Signed, res) + if res == -1: + raise OSError(rposix.get_errno(), "getresgid failed") + return (rffi.cast(lltype.Signed, out[0]), + rffi.cast(lltype.Signed, out[1]), + rffi.cast(lltype.Signed, out[2])) + finally: + lltype.free(out, flavor='raw') + + return extdef([], (int, int, int), llimpl=c_getresgid_llimpl, + export_name='ll_os.ll_os_getresgid') + @registering_str_unicode(os.open) def register_os_open(self, traits): os_open = self.llexternal(traits.posix_function_name('open'), 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 @@ -246,3 +246,21 @@ return 0 res = self.interpret(f, [9999, 1]) assert res == 1 + + if hasattr(os, 'getresuid'): + def test_getresuid(self): + def f(): + a, b, c = os.getresuid() + return a + b * 37 + c * 1291 + res = self.interpret(f, []) + a, b, c = os.getresuid() + assert res == a + b * 37 + c * 1291 + + if hasattr(os, 'getresgid'): + def test_getresgid(self): + def f(): + a, b, c = os.getresgid() + return a + b * 37 + c * 1291 + res = self.interpret(f, []) + a, b, c = os.getresgid() + assert res == a + b * 37 + c * 1291 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit