[pypy-svn] r35225 - in pypy/dist/pypy/module/posix: . test

fijal at codespeak.net fijal at codespeak.net
Sun Dec 3 20:35:43 CET 2006


Author: fijal
Date: Sun Dec  3 20:35:39 2006
New Revision: 35225

Modified:
   pypy/dist/pypy/module/posix/__init__.py
   pypy/dist/pypy/module/posix/interp_posix.py
   pypy/dist/pypy/module/posix/test/test_posix2.py
Log:
Added execve (module level) and test for it.


Modified: pypy/dist/pypy/module/posix/__init__.py
==============================================================================
--- pypy/dist/pypy/module/posix/__init__.py	(original)
+++ pypy/dist/pypy/module/posix/__init__.py	Sun Dec  3 20:35:39 2006
@@ -72,6 +72,8 @@
         interpleveldefs['waitpid'] = 'interp_posix.waitpid'
     if hasattr(os, 'execv'):
         interpleveldefs['execv'] = 'interp_posix.execv'
+    if hasattr(os, 'execve'):
+        interpleveldefs['execve'] = 'interp_posix.execve'
     #if hasattr(ctypes_posix, 'uname'):
     #    interpleveldefs['uname'] = 'interp_posix.uname'
 

Modified: pypy/dist/pypy/module/posix/interp_posix.py
==============================================================================
--- pypy/dist/pypy/module/posix/interp_posix.py	(original)
+++ pypy/dist/pypy/module/posix/interp_posix.py	Sun Dec  3 20:35:39 2006
@@ -399,9 +399,27 @@
 geteuid.unwrap_spec = [ObjSpace]
 
 def execv(space, command, w_args):
-    os.execv(command, [space.str_w(i) for i in space.unpackiterable(w_args)])
+    try:
+        os.execv(command, [space.str_w(i) for i in space.unpackiterable(w_args)])
+    except OSError, e: 
+        raise wrap_oserror(space, e) 
 execv.unwrap_spec = [ObjSpace, str, W_Root]
 
+def execve(space, command, w_args, w_env):
+    try:
+        args = [space.str_w(i) for i in space.unpackiterable(w_args)]
+        env = {}
+        keys = space.call_function(space.getattr(w_env, space.wrap('keys')))
+        for key in space.unpackiterable(keys):
+            value = space.getitem(w_env, key)
+            env[space.str_w(key)] = space.str_w(value)
+        os.execve(command, args, env)
+    except ValueError, e:
+        raise OperationError(space.w_ValueError, space.wrap(str(e)))
+    except OSError, e:
+        raise wrap_oserror(space, e)
+execve.unwrap_spec = [ObjSpace, str, W_Root, W_Root]
+
 def uname(space):
     try:
         result = _c.uname()

Modified: pypy/dist/pypy/module/posix/test/test_posix2.py
==============================================================================
--- pypy/dist/pypy/module/posix/test/test_posix2.py	(original)
+++ pypy/dist/pypy/module/posix/test/test_posix2.py	Sun Dec  3 20:35:39 2006
@@ -110,6 +110,26 @@
             os.waitpid(pid, 0)
             assert open("onefile").read() == "1"
             os.unlink("onefile")
+        
+        def test_execv_raising(self):
+            os = self.posix
+            raises(OSError, 'os.execv("saddsadsadsadsa", ["saddsadsasaddsa"])')
+
+        def test_execve(self):
+            os = self.posix
+            pid = os.fork()
+            if pid == 0:
+                os.execve("/usr/bin/env", ["env", "python", "-c", "import os; open('onefile', 'w').write(os.environ['ddd'])"], {'ddd':'xxx'})
+            os.waitpid(pid, 0)
+            assert open("onefile").read() == "xxx"
+            os.unlink("onefile")
+
+    if hasattr(__import__(os.name), 'popen'):
+        def test_popen(self):
+            skip("Not implemented")
+            os = self.posix
+            stream = os.popen('echo 1')
+            assert stream.read() == '1\n'
 
 class AppTestEnvironment(object):
     def setup_class(cls): 



More information about the Pypy-commit mailing list