summaryrefslogtreecommitdiffstats
path: root/web/server/h2o/libh2o/share/h2o/kill-on-close
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xweb/server/h2o/libh2o/share/h2o/kill-on-close63
1 files changed, 63 insertions, 0 deletions
diff --git a/web/server/h2o/libh2o/share/h2o/kill-on-close b/web/server/h2o/libh2o/share/h2o/kill-on-close
new file mode 100755
index 00000000..4890abdf
--- /dev/null
+++ b/web/server/h2o/libh2o/share/h2o/kill-on-close
@@ -0,0 +1,63 @@
+#! /bin/sh
+exec ${H2O_PERL:-perl} -x $0 "$@"
+#! perl
+
+use strict;
+use warnings;
+use Errno qw(EINTR);
+use POSIX qw(WNOHANG);
+
+my $rmpath;
+
+while (@ARGV) {
+ if ($ARGV[0] eq '--') {
+ shift @ARGV;
+ last;
+ } elsif ($ARGV[0] !~ /^--/) {
+ last;
+ } elsif ($ARGV[0] =~ /^--rm(?:=(.*)|)$/) {
+ shift @ARGV;
+ if (defined $1) {
+ $rmpath = $1;
+ } else {
+ die "option `--rm` requires an argument\n"
+ unless @ARGV;
+ $rmpath = shift @ARGV;
+ }
+ } else {
+ die "unknown argument: $ARGV[0]";
+ }
+}
+
+shift @ARGV
+ if @ARGV && $ARGV[0] eq '--';
+
+die "Usage: $0 [--rm=path] -- cmd args...\n"
+ unless @ARGV;
+
+open my $wait_fh, '<&', 5
+ or die "failed to open wait file descriptor (fd=5):$!";
+
+my $pid = fork;
+die "fork failed:$!"
+ if $pid == -1;
+if ($pid == 0) {
+ exec @ARGV;
+ die "failed to exec $ARGV[0]:$!";
+}
+
+$SIG{INT} = sub {};
+
+while (1) {
+ my $r = sysread $wait_fh, my $buf, 1;
+ last if !defined($r) || $r == 0 || ($r == -1 && $! != EINTR);
+}
+
+kill 'TERM', $pid;
+while (waitpid($pid, 0) != $pid) {
+}
+
+if (defined $rmpath) {
+ exec '/bin/rm', '-rf', $rmpath;
+ die "failed to exec /bin/rm:$!";
+}