#!/bin/sh -e

openrc_live() {
    if [ ! -f /run/openrc/softlevel ]; then
        echo >&2 "  Skipped: Current root is not booted."
        exit 0
    fi
}

each_conf() {
    while read -r f; do
        "$@" "/$f"
    done
}

svc_help(){
    arg="${1:-}"
    str="${arg#--*}"
    if [ -n "$str" ]; then
        echo "	==> Start/stop/restart a $str service:"
    else
        echo "	==> Start/stop/restart a service:"
    fi
    echo "	rc-service <service> <start/stop/restart>" "$arg"
}

svc_add_help(){
    arg="${1:-}"
    str="${arg#--*}"
    if [ -n "$str" ]; then
        echo "	==> Add a $str service to runlevel:"
    else
        echo "	==> Add a service to runlevel:"
    fi
    echo "	rc-update add <service> <runlevel>" "$arg"
    svc_help "$arg"
}

svc_del_help(){
    arg="${1:-}"
    str="${arg#--*}"
    if [ -n "$str" ]; then
        echo "	==> Remove a $str service from runlevel:"
    else
        echo "	==> Remove a service from runlevel:"
    fi
    echo "	rc-update del <service> <runlevel>" "$arg"
    svc_help "$arg"
}

svc_user_ln() {
    umin=$(grep "^UID_MIN" /etc/login.defs)
    umax=$(grep "^UID_MAX" /etc/login.defs)
    users=$(awk -F':' -v "min=${umin##UID_MIN}" -v "max=${umax##UID_MAX}" \
        '{ if ( $3 >= min && $3 <= max ) print $0 }' /etc/passwd \
            | cut -d: -f1)

    for u in $users; do
        if [ ! -e /etc/init.d/user.$u ]; then
            ln -sv /etc/init.d/user /etc/init.d/user.$u
        fi
    done
}

op="$1"; shift

case $op in
    sysctl) openrc_live; each_conf /usr/bin/sysctl -q -p ;;
    binfmt) openrc_live; each_conf /usr/lib/openrc/sh/binfmt.sh ;;
    reexec) svc_user_ln; openrc_live; /usr/bin/openrc-shutdown -R ;;
    # For use by other packages
    reload) openrc_live; /usr/bin/rc-service "$@" reload ;;
    add) svc_add_help ;;
    del) svc_del_help ;;
    uadd) svc_add_help "--user" ;;
    udel) svc_del_help "--user" ;;
    *) echo >&2 "  Invalid operation '$op'"; exit 1 ;;
esac

exit 0
