dvdrip-upload: Replace the signalling protocol with, err, signals.
authorMark Wooding <mdw@distorted.org.uk>
Fri, 15 Apr 2022 16:04:16 +0000 (17:04 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Fri, 15 Apr 2022 16:17:44 +0000 (17:17 +0100)
No longer needs lockfiles.

dvdrip-upload

index ce788fd..46289bd 100755 (executable)
@@ -27,31 +27,6 @@ esac
 case $bogus in t) usage >&2; exit 2 ;; esac
 case $verbose in t) set -x ;; esac
 
-case $kill in
-  t) echo quit >"$tmp/upload.wakeup"; exit 0 ;;
-esac
-
-case ${DVDRIP_UPLOAD_LOCKEDP+t} in
-  t) lockedp=t ;;
-  *) lockedp=nil; DVDRIP_UPLOAD_LOCKEDP=t; export DVDRIP_UPLOAD_LOCKEDP ;;
-esac
-case $lockedp,$listen in
-  t,*) ;;
-  nil,nil)
-    if [ -p "$tmp/upload.wakeup" ]; then
-      echo check >"$tmp/upload.wakeup"
-      exit 0
-    else
-      exec locking "$tmp/upload.lock" "$0" ${opts:+"-$opts"}
-    fi
-    exit 2
-    ;;
-  nil,t)
-    exec locking -f "$tmp/upload.lock" "$0" ${opts:+"-$opts"}
-    exit 2
-    ;;
-esac
-
 notify () {
   colour=$1 message=$2
   echo "$(tput bold; tput setaf $colour)$message$(tput sgr0; tput op)"
@@ -108,21 +83,49 @@ check () {
   done
 }
 
-case $listen in
-  nil)
-    check
+try_kick_daemon () {
+  sig=$1
+
+  if [ -f "$tmp/upload.pid" ]; then
+    daemon=$(cat "$tmp/upload.pid")
+    case $daemon in
+      "" | *[!0-9]*) ;;
+      *) if kill -$sig $daemon >/dev/null 2>&1; then return 0; fi ;;
+    esac
+  fi
+  return 1
+}
+
+try_kill () {
+  victim=$1
+
+  case $victim in
+    nil) ;;
+    *) kill $victim >/dev/null 2>&1 || : ;;
+  esac
+}
+
+case $kill,$listen in
+  t,t)
+    fail "inconsistent options \`-k' and \`-l'"
     ;;
-  t)
-    rm -f "$tmp/upload.newpipe"
-    mkfifo "$tmp/upload.newpipe"
-    mv "$tmp/upload.newpipe" "$tmp/upload.wakeup"
-    while read line <&3; do
-      case $line in
-       check) check ;;
-       quit) info "quitting on user request"; break ;;
-       *) warn "unknown command \`$line'" ;;
-      esac
-    done 3<>"$tmp/upload.wakeup"
-    rm -f "$tmp/upload.wakeup" "$tmp/upload.lock"
+  t,nil)
+    if ! try_kick_daemon TERM; then fail "failed to kill listener"; fi
+    ;;
+  nil,t)
+    if try_kick_daemon 0; then fail "daemon already running (pid $daemon)"; fi
+    trap 'try_kill $sleepy; rm -f "$tmp/upload.pid"' EXIT
+    trap 'info "quitting on user request"; exit 0' INT TERM
+    trap 'try_kill $sleepy' HUP
+    echo $$ >"$tmp/upload.pid.new"
+    mv "$tmp/upload.pid.new" "$tmp/upload.pid"
+    while :; do
+      sleep 3600& sleepy=$!
+      check
+      wait $sleepy || :; sleepy=nil
+    done
+    ;;
+  nil,nil)
+    if ! try_kick_daemon HUP; then check; fi
     ;;
 esac