disorder-notify.in, disorder-ondemand.in: Make sure `$buffer' is defined.
[disorder-toys] / disorder-ondemand.in
index 86b9249..a517e7b 100755 (executable)
@@ -27,19 +27,23 @@ sub connection () {
 }
 
 my $PAUSETIME = 300;
+my $CRASHTIME = 10;
+my $RESTARTTIME = 0;
 my $PID = undef;
 my $STATE = "off"; # `off', `on', `killed'
 my $WANT = "off"; # `off', `on', `pause'
-my $STOPTIME = undef; # if $WANT eq "pause"
+my $WAKETIME = undef;
 my $NOW = time;
 
 $SIG{CHLD} = sub {
+  $NOW = time;
   KID: for (;;) {
     my $kid = waitpid -1, WNOHANG;
     last if $kid <= 0;
     if ($kid == $PID) {
       mumble "player exited (st = $?)";
       $PID = undef; $STATE = "off";
+      if ($WANT eq "on" && $RESTARTTIME > $NOW) { $WAKETIME = $RESTARTTIME; }
     }
   }
 };
@@ -49,26 +53,32 @@ $SIG{TERM} = $SIG{INT} = sub {
   exit 0;
 };
 
-sub start () { $WANT = "on"; $STOPTIME = undef; }
+sub start () {
+  if ($WANT ne "on") {
+    $WANT = "on";
+    $WAKETIME = $NOW < $RESTARTTIME ? $RESTARTTIME : undef;
+  }
+}
 
 sub pause () {
-  if ($WANT eq "on") { $WANT = "pause"; $STOPTIME = $NOW + $PAUSETIME; }
+  if ($WANT eq "on") { $WANT = "pause"; $WAKETIME = $NOW + $PAUSETIME; }
 }
 
 sub fix_state () {
 
   ##mumble "state = $STATE ($PID)";
-  ##mumble "want = $WANT ($STOPTIME <=> $NOW)";
+  ##mumble "want = $WANT ($WAKETIME <=> $NOW)";
 
-  if ($WANT eq "pause" && $NOW >= $STOPTIME) {
-    $WANT = "off"; $STOPTIME = undef;
+  if ($WANT eq "pause" && $NOW >= $WAKETIME) {
+    $WANT = "off"; $WAKETIME = undef;
     mumble "pause time up: stopping" if $STATE eq "on";
   }
 
-  if ($WANT eq "on" && $STATE eq "off") {
+  if ($WANT eq "on" && $STATE eq "off" &&
+      (!defined($WAKETIME) || $NOW >= $WAKETIME)) {
     my $kid = fork();
     if (!$kid) { exec @ARGV; }
-    $STATE = "on"; $PID = $kid;
+    $STATE = "on"; $PID = $kid; $RESTARTTIME = $NOW + $CRASHTIME;
     mumble "player wanted but not running: started pid $kid";
   } elsif ($WANT eq "off" && $STATE eq "on") {
     kill "TERM", $PID;
@@ -99,7 +109,7 @@ sub watch_status () {
     SEL: {
       eval {
        $nfd = select my $rdout = $rdin, undef, undef,
-         defined($STOPTIME) ? $STOPTIME - $NOW : 60;
+         defined($WAKETIME) ? $WAKETIME - $NOW : 60;
       };
       if ($@ && $@->errno == EINTR) { next SEL; }
       elsif ($@) { mumble "error from select: " . $@->errno; last WATCH; }
@@ -120,7 +130,7 @@ sub watch_status () {
       }
 
       @lines = split /\n/, $buffer, -1;
-      $buffer = pop @lines;
+      $buffer = pop(@lines) // "";
     }
 
     for my $line (@lines) {