Skip to content
Snippets Groups Projects
Commit 5b2f18bf authored by Jonas Wallden's avatar Jonas Wallden
Browse files

Support optional watchdog script for external filter binaries that

don't terminate in reasonable time.
parent 758963ea
Branches
Tags
No related merge requests found
...@@ -8,7 +8,9 @@ constant contenttypes = ({ }); ...@@ -8,7 +8,9 @@ constant contenttypes = ({ });
.Output filter(Standards.URI uri, string|Stdio.File data, .Output filter(Standards.URI uri, string|Stdio.File data,
string content_type, mixed ... more); 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. // A smarter version of Process.popen: No need to quote arguments.
{ {
Stdio.File pipe0 = Stdio.File(); Stdio.File pipe0 = Stdio.File();
...@@ -20,11 +22,25 @@ string my_popen(array(string) args, string|void cwd, int|void wait_for_exit) ...@@ -20,11 +22,25 @@ string my_popen(array(string) args, string|void cwd, int|void wait_for_exit)
setup["cwd"] = cwd; setup["cwd"] = cwd;
Process.create_process proc = Process.create_process(args, setup); Process.create_process proc = Process.create_process(args, setup);
pipe1->close(); 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(); string result = pipe0->read();
if(!result) if(!result)
error("my_popen failed with error "+pipe0->errno()+".\n"); error("my_popen failed with error "+pipe0->errno()+".\n");
pipe0->close(); pipe0->close();
if (wait_for_exit) if (wait_for_exit)
proc->wait(); proc->wait();
if (watchdog)
watchdog->kill(9);
return result; return result;
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment