@@ -293,10 +293,7 @@ def final_check(self):
293293 def _final_check (self ):
294294 raise NotImplementedError ()
295295
296- def save (self , name ):
297- return self ._save (name , self .rule .get_ip ())
298-
299- def _save (self , name , ip ):
296+ def _get_saved_buf (self , ip ):
300297 if not self ._module or not self ._module .save :
301298 return None
302299 # redirect C stdout to a pipe and read back the output of m->save
@@ -311,15 +308,26 @@ def _save(self, name, ip):
311308 buf = os .read (pipes [0 ], 1024 )
312309 os .close (pipes [0 ])
313310 os .close (pipes [1 ])
314- if name :
315- return self ._get_value (buf , name )
316- else :
317- return self ._get_all_values (buf )
311+ return buf
318312 finally :
319313 sys .stdout .close ()
320314 os .dup2 (old_stdout .fileno (), fd )
321315 sys .stdout = os .fdopen (fd , 'w' )
322316
317+ def save (self , name ):
318+ return self ._save (name , self .rule .get_ip ())
319+
320+ def _save (self , name , ip ):
321+ buf = self ._get_saved_buf (ip )
322+ if buf is None :
323+ return None
324+ if not self ._module or not self ._module .save :
325+ return None
326+ if name :
327+ return self ._get_value (buf , name )
328+ else :
329+ return self ._get_all_values (buf )
330+
323331 def _get_all_values (self , buf ):
324332 table = {} # variable -> (value, inverted)
325333 res = re .findall (IPTCModule .pattern , buf )
@@ -343,22 +351,11 @@ def _get_value(self, buf, name):
343351 def get_all_parameters (self ):
344352 params = {}
345353 ip = self .rule .get_ip ()
346- if self ._module and self ._module .save :
347- # redirect C stdout to a pipe and read back the output of m->save
348- pipes = os .pipe ()
349- saved_out = os .dup (1 )
350- os .dup2 (pipes [1 ], 1 )
351- self ._xt .save (self ._module , ip , self ._ptr )
352- buf = os .read (pipes [0 ], 1024 )
353- os .dup2 (saved_out , 1 )
354- os .close (pipes [0 ])
355- os .close (pipes [1 ])
356- os .close (saved_out )
357-
354+ buf = self ._get_saved_buf (ip )
355+ if buf is not None :
358356 res = re .findall (IPTCModule .pattern , buf )
359357 for x in res :
360358 params [x [1 ]] = "%s%s" % ((x [0 ] or x [2 ]) and "!" or "" , x [3 ])
361-
362359 return params
363360
364361 def _update_parameters (self ):
0 commit comments