#!/bin/bash -p

. /usr/lib/vdr/config-loader.sh

PIDFILE=/var/run/${0##*/}.pid

VDR_ENV="LANG=$VDR_LANG LC_ALL=$VDR_LANG"
if [ -n "$VDR_CHARSET_OVERRIDE" ] ; then
   VDR_ENV="$VDR_ENV VDR_CHARSET_OVERRIDE=$VDR_CHARSET_OVERRIDE"
fi

VDRCMD="$VDR_ENV /usr/bin/vdr $*"

KVERS_2_6=`uname -r | grep -e '2.6'`

function get_modulenames()
{
    if [ "$KVERS_2_6" ]; then
        MODULES=`lsmod | awk '/^dvb_core/ {gsub(/,/,"\n", $4); print $4}' | tac`
        [ "$MODULES" ] && MODULES="$MODULES dvb_core"
    else
        MODULES=`lsmod | grep dvb-core | cut -d'[' -f2 | cut -d']' -f1`
        [ "$MODULES" ] && MODULES="$MODULES dvb-core"
    fi
}

# TODO: check if udev handles this on newer systems!?
function set_permissions()
{
    if [ "$USER" -o "$GROUP" ]; then
        for FILE in av7110_ir budget_ci_ir; do
            if [ -e "/proc/$FILE" ]; then
                chown $USER.$GROUP /proc/$FILE
            fi
        done
    fi
    chmod o+r /dev/input/event*
}

function load_dvb_modules()
{
    if modprobe dvb >/dev/null 2>&1 ; then
        get_modulenames
    else
        if [ "$MODULES" ]; then
            for MODULE in $MODULES; do
                modprobe $MODULE >/dev/null 2>&1
            done
        else
            modprobe dvb-ttpci >/dev/null 2>&1 #2.4
            modprobe dvb_ttpci >/dev/null 2>&1 #2.6
            get_modulenames
        fi
        if [ "$KVERS_2_6" ]; then
            wait `pidof udev`
        fi
    fi
    if [ "$KVERS_2_6" ]; then
        sleep 15
    fi
}

function unload_dvb_modules()
{
    for MODULE in $MODULES; do
        rmmod $MODULE >/dev/null 2>&1
        wait `pidof rmmod`
    done
}

if [ -r $PIDFILE ]; then
    read PID < $PIDFILE
    PROCESS=$(ps -p $PID -o comm=)
    if [ "$PROCESS" = "${0##*/}" ]; then
      exit
    fi
fi
echo $$ > $PIDFILE

VDR_ERR=`mktemp -p /tmp vdr-err.XXXXXX`

get_modulenames

[ -z "$MODULES" ] && load_dvb_modules

while (true) do

    set_permissions

    eval $VDRCMD >/dev/null 2>"$VDR_ERR"

    case $? in
        0)
            exit
        ;;
        2)
            ERROR=`cat "$VDR_ERR"`
            logger -t runvdr "stopping after fatal fail ($ERROR)"
            exit
        ;;
    esac

    logger -t runvdr "restarting VDR"
    killall -q -TERM /usr/bin/vdr
    wait `pidof vdr`
    unload_dvb_modules
    sleep 2
    load_dvb_modules

done
