@@ -33,6 +33,8 @@ class FileBase:
3333
3434class FileWrapper (FileBase ):
3535
36+ # XXX This is just like a Bastion -- should use that!
37+
3638 def __init__ (self , f ):
3739 self .f = f
3840 for m in self .ok_file_methods :
@@ -278,22 +280,43 @@ def r_unload(self, m):
278280
279281 # The s_* methods are similar but also swap std{in,out,err}
280282
283+ def make_delegate_files (self ):
284+ s = self .modules ['sys' ]
285+ self .delegate_stdin = FileDelegate (s , 'stdin' )
286+ self .delegate_stdout = FileDelegate (s , 'stdout' )
287+ self .delegate_stderr = FileDelegate (s , 'stderr' )
288+ self .restricted_stdin = FileWrapper (sys .stdin )
289+ self .restricted_stdout = FileWrapper (sys .stdout )
290+ self .restricted_stderr = FileWrapper (sys .stderr )
291+
281292 def set_files (self ):
293+ if not hasattr (self , 'save_stdin' ):
294+ self .save_files ()
295+ if not hasattr (self , 'delegate_stdin' ):
296+ self .make_delegate_files ()
282297 s = self .modules ['sys' ]
283- s .stdin = FileWrapper (sys .stdin )
284- s .stdout = FileWrapper (sys .stdout )
285- s .stderr = FileWrapper (sys .stderr )
286- sys .stdin = FileDelegate (s , 'stdin' )
287- sys .stdout = FileDelegate (s , 'stdout' )
288- sys .stderr = FileDelegate (s , 'stderr' )
298+ s .stdin = self .restricted_stdin
299+ s .stdout = self .restricted_stdout
300+ s .stderr = self .restricted_stdout
301+ sys .stdin = self .delegate_stdin
302+ sys .stdout = self .delegate_stdout
303+ sys .stderr = self .delegate_stderr
304+
305+ def reset_files (self ):
306+ self .restore_files ()
307+ s = self .modules ['sys' ]
308+ self .restricted_stdin = s .stdin
309+ self .restricted_stdout = s .stdout
310+ self .restricted_stdout = s .stderr
311+
289312
290313 def save_files (self ):
291314 self .save_stdin = sys .stdin
292315 self .save_stdout = sys .stdout
293316 self .save_stderr = sys .stderr
294317
295- def restore_files (files ):
296- sys .stdin = self .save_sydin
318+ def restore_files (self ):
319+ sys .stdin = self .save_stdin
297320 sys .stdout = self .save_stdout
298321 sys .stderr = self .save_stderr
299322
0 commit comments