#!/bin/sh
set -e
#exit 0 immediately on non-linux ports
[  "$(uname -s)" = 'Linux' ] || exit 0
USAGE='runsv-cg create|control|remove|destroy|setup'
usage() { echo usage: $USAGE >&2; exit 100; }
fail() { echo $1 >&2; exit 111; }
cg=/sys/fs/cgroup
sv=$(pwd); sv=${sv##*/}
setup() {
  mount -t cgroup2 cgroup2 "$cg"
  for i in $(cat "$cg"/cgroup.controllers ); do
    echo +$i >"$cg"/cgroup.subtree_control
  done
  mkdir "$cg"/runit
  for i in $(cat "$cg"/runit/cgroup.controllers ); do
    echo +$i >"$cg"/runit/cgroup.subtree_control
  done
}
add() { echo $PPID >"$cg"/runit/"$sv"/cgroup.procs; }
control() { cp cgroup/* "$cg"/runit/"$sv"/ || :; }
create() { mkdir "$cg"/runit/"$sv" || :; control; add; }
remove() { rmdir "$cg"/runit/"$sv"; }
destroy() { echo 1 >"$cg"/runit/"$sv"/cgroup.kill; remove; }
test -n "$1" || usage
case "$1" in
  setup) setup ;;
  create|control|remove|destroy)
    test -d "$cg"/runit || fail "$cg/runit: not a directory"
    test -d supervise || fail "must run in service directory"
    test -x run || fail "must run in service directory"
    test -d cgroup || fail "./cgroup: not a directory"
    test -n "$sv" || fail "unable to get service name"
    "$1"
    ;;
  *) usage ;;
esac
exit 0
