|
6 | 6 | import shlex |
7 | 7 | import socket |
8 | 8 | import struct |
| 9 | +import sys |
9 | 10 | import weakref |
10 | 11 |
|
11 | 12 | from util import find_library |
@@ -296,23 +297,28 @@ def save(self, name): |
296 | 297 | return self._save(name, self.rule.get_ip()) |
297 | 298 |
|
298 | 299 | def _save(self, name, ip): |
299 | | - if self._module and self._module.save: |
300 | | - # redirect C stdout to a pipe and read back the output of m->save |
301 | | - pipes = os.pipe() |
302 | | - saved_out = os.dup(1) |
303 | | - os.dup2(pipes[1], 1) |
304 | | - self._xt.save(self._module, ip, self._ptr) |
305 | | - buf = os.read(pipes[0], 1024) |
306 | | - os.dup2(saved_out, 1) |
307 | | - os.close(pipes[0]) |
308 | | - os.close(pipes[1]) |
309 | | - os.close(saved_out) |
310 | | - if name: |
311 | | - return self._get_value(buf, name) |
312 | | - else: |
313 | | - return self._get_all_values(buf) |
314 | | - else: |
| 300 | + if not self._module or not self._module.save: |
315 | 301 | return None |
| 302 | + # redirect C stdout to a pipe and read back the output of m->save |
| 303 | + fd = sys.stdout.fileno() |
| 304 | + with os.fdopen(os.dup(fd), 'w') as old_stdout: |
| 305 | + try: |
| 306 | + pipes = os.pipe() |
| 307 | + sys.stdout.close() |
| 308 | + os.dup2(pipes[1], fd) |
| 309 | + sys.stdout = os.fdopen(fd, 'w') |
| 310 | + self._xt.save(self._module, ip, self._ptr) |
| 311 | + buf = os.read(pipes[0], 1024) |
| 312 | + os.close(pipes[0]) |
| 313 | + os.close(pipes[1]) |
| 314 | + if name: |
| 315 | + return self._get_value(buf, name) |
| 316 | + else: |
| 317 | + return self._get_all_values(buf) |
| 318 | + finally: |
| 319 | + sys.stdout.close() |
| 320 | + os.dup2(old_stdout.fileno(), fd) |
| 321 | + sys.stdout = os.fdopen(fd, 'w') |
316 | 322 |
|
317 | 323 | def _get_all_values(self, buf): |
318 | 324 | table = {} # variable -> (value, inverted) |
|
0 commit comments