diff --git a/lib/modules/Search.pmod/Filter.pmod/Base.pike b/lib/modules/Search.pmod/Filter.pmod/Base.pike index 70da1cdb2d7dc46ee790120ec1d6870325e4b564..fb255b379c3ae63ab5d0adba036d53b342b12391 100644 --- a/lib/modules/Search.pmod/Filter.pmod/Base.pike +++ b/lib/modules/Search.pmod/Filter.pmod/Base.pike @@ -8,7 +8,9 @@ constant contenttypes = ({ }); .Output filter(Standards.URI uri, string|Stdio.File data, string content_type, mixed ... more); -string my_popen(array(string) args, string|void cwd, int|void wait_for_exit) + +string my_popen(array(string) args, string|void cwd, int|void wait_for_exit, + array(string)|void watchdog_args) // A smarter version of Process.popen: No need to quote arguments. { Stdio.File pipe0 = Stdio.File(); @@ -20,11 +22,25 @@ string my_popen(array(string) args, string|void cwd, int|void wait_for_exit) setup["cwd"] = cwd; Process.create_process proc = Process.create_process(args, setup); pipe1->close(); + + // Launch watchdog if provided (requires wait_for_exit) + Process.Process watchdog; + if (wait_for_exit && watchdog_args) { + // Insert pid of running process where caller used "%p" + array(string) wd_args = + replace(watchdog_args + ({ }), "%p", (string) proc->pid()); + watchdog = Process.spawn_pike(wd_args); + } + string result = pipe0->read(); if(!result) error("my_popen failed with error "+pipe0->errno()+".\n"); pipe0->close(); if (wait_for_exit) proc->wait(); + + if (watchdog) + watchdog->kill(9); + return result; }