Author: Armin Rigo <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit