#!/bin/sh -e

if test -z "$1" ; then
  echo "svctl-reload: usage: svctl-reload service..." 1>&2
  exit 100
fi

if ! test -L /run/s6-rc/compiled ; then
  echo "svctl-reload: fatal: s6-rc is not running" 1>&2
  exit 3
fi

list=$(s6-rc-db atomics "$@")
action=
signal=

# find unit
UNIT_DIRS=(/usr/lib/s6-rc/sources /usr/lib/s6-rc/policy/current)
unit_dir=
action_found=0
for d in ${UNIT_DIRS[@]}; do
  unit_dir=$d
  if [ -e $d/$1/actions.d/reload ]; then
    action_found=1
    if grep -q ^SIG $d/$1/actions.d/reload; then
      action=signal
    fi
    break
  elif [ -e $d/$1/actions.d/reloadcmd ]; then
    exec $d/$1/actions.d/reloadcmd
  fi
done
if [ $action_found -ne 1 ]; then
  echo "svctl-reload: error: reload action not implemented. Try restart instead" 1>&2
  exit 2
fi

if [ "$action" = signal ]; then
  signal=$(grep -o "SIG[^ ]*" $unit_dir/$1/actions.d/reload)
  option=
  case "$signal" in
    SIGALRM)  option='-a';;
    SIGABRT)  option='-b';;
    SIGQUIT)  option='-q';;
    SIGHUP)   option='-h';;
    SIGKILL)  option='-k';;
    SIGTERM)  option='-t';;
    SIGINT)   option='-i';;
    SIGUSR1)  option='-1';;
    SIGUSR2)  option='-2';;
    SIGSTOP)  option='-p';;
    SIGCONT)  option='-c';;
    SIGWINCH) option='-y';;
    *) echo "svctl-reload: error: signal '$signal' is not supported" 1>&2; exit 4;;
  esac

  for i in $list ; do
    t=$(s6-rc-db type "$i")
    if test x"$t" = x"longrun" ; then
      s6-svc $option "/run/s6-rc/scandir/$i"
    fi
  done
else
  echo "svctl-reload: error: just signals are supported, i.e. SIGHUP" 1>&2
  exit 5
fi
