Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cd6aab9

Browse files
committed
Fixed restore_files(); added reset_files(); made these more flexible.
1 parent 7d844a7 commit cd6aab9

1 file changed

Lines changed: 31 additions & 8 deletions

File tree

Lib/rexec.py

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ class FileBase:
3333

3434
class 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

Comments
 (0)