[pypy-svn] r48729 - in pypy/dist/pypy/rpython/module: . test

fijal at codespeak.net fijal at codespeak.net
Fri Nov 16 19:21:12 CET 2007


Author: fijal
Date: Fri Nov 16 19:21:11 2007
New Revision: 48729

Modified:
   pypy/dist/pypy/rpython/module/ll_os.py
   pypy/dist/pypy/rpython/module/test/test_posix.py
Log:
Add os.setuid/setgid


Modified: pypy/dist/pypy/rpython/module/ll_os.py
==============================================================================
--- pypy/dist/pypy/rpython/module/ll_os.py	(original)
+++ pypy/dist/pypy/rpython/module/ll_os.py	Fri Nov 16 19:21:11 2007
@@ -80,6 +80,18 @@
         return extdef([], int, llimpl=c_func_llimpl,
                       export_name='ll_os.ll_os_' + name)
 
+    def extdef_for_function_int_to_int(self, name, **kwds):
+        c_func = self.llexternal(name, [rffi.INT], rffi.INT, **kwds)
+        def c_func_llimpl(arg):
+            res = rffi.cast(rffi.LONG, c_func(arg))
+            if res == -1:
+                raise OSError(rffi.get_errno(), "%s failed" % name)
+        
+        c_func_llimpl.func_name = name + '_llimpl'
+
+        return extdef([int], None, llimpl=c_func_llimpl,
+                      export_name='ll_os.ll_os_' + name)
+
     @registering_if(os, 'execv')
     def register_os_execv(self):
         os_execv = self.llexternal('execv', [rffi.CCHARP, rffi.CCHARPP],
@@ -344,6 +356,14 @@
     def register_os_geteuid(self):
         return self.extdef_for_os_function_returning_int('geteuid')
 
+    @registering_if(os, 'setuid')
+    def register_os_setuid(self):
+        return self.extdef_for_function_int_to_int('setuid')
+
+    @registering_if(os, 'setgid')
+    def register_os_setgid(self):
+        return self.extdef_for_function_int_to_int('setgid')
+
     @registering_if(os, 'getpid')
     def register_os_getpid(self):
         return self.extdef_for_os_function_returning_int('getpid')

Modified: pypy/dist/pypy/rpython/module/test/test_posix.py
==============================================================================
--- pypy/dist/pypy/rpython/module/test/test_posix.py	(original)
+++ pypy/dist/pypy/rpython/module/test/test_posix.py	Fri Nov 16 19:21:11 2007
@@ -134,6 +134,13 @@
                 res = self.interpret(fun, [value])
                 assert res == fun(value)
 
+    if hasattr(os, 'setuid'):
+        def test_os_setuid(self):
+            def f():
+                os.setuid(os.getuid())
+                return os.getuid()
+            assert self.interpret(f, []) == f()
+
 class TestLLtype(BaseTestPosix, LLRtypeMixin):
     pass
 



More information about the Pypy-commit mailing list