# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8

function __lf_get_age() {
    y=$(date "+%Y")
    dy=$(date "+%j"); while [ ${dy#0} != $dy ]; do dy=${dy#0}; done
    h=$(date "+%H"); while [ ${h#0} != $h ]; do h=${h#0}; done
    echo $((($y * 365 + $dy) * 24 + $h))
}

function lockfile_set() {
    # USAGE
    #     lockfile_set [-h max_hours] /path/to/lockfile
    # OPTIONS
    #     lockfile
    #         fichier qui doit contenir le verrou
    #     -h max_hours
    #         Nombre d'heures (par défaut 4) au bout duquel on retourne 2
    #         Sinon, on retourne 1.
    # Retourne 0 si le verrou a été placé correctement. Le fichier sera supprimé
    # automatiquement en fin de script.
    # Retourne 1 si le verrou n'a pas pu être placé
    # Retourne 2 si le verrou n'a pas pu être placé au bout de max_hours heures
    local OENC="$UTF8"
    local end_of_options lockfile max_hours=4
    while [ -n "$1" ]; do
        case "$1" in
        -h)
            shift
            max_hours="$1"
            ;;
        --)
            shift
            end_of_options=1
            ;;

        -*)
            if ! set_verbosity "$1" -v; then
                ewarn "option non reconnue: $1"
            fi
            ;;

        *)
            end_of_options=1
            ;;
        esac
        [ -n "$end_of_options" ] && break
        shift
    done

    lockfile="$1"
    [ -n "$lockfile" ] || return 1

    local now="$(__lf_get_age)"
    if [ -f "$lockfile" ]; then
        local prev=$(<"$lockfile") diff="$(($now - $prev))"
        [ "$diff" -gt "$max_hours" ] && return 2 || return 1
    fi
    touch "$lockfile" || return 1
    autoclean "$lockfile"
    echo "$now" >"$lockfile"
}

function pidfile_set() {
    # USAGE
    #     pidfile_set [-p pid] /path/to/pidfile
    # OPTIONS
    #     pidfile
    #         fichier qui doit contenir le pid du script
    #     -p pid
    #         spécifier le pid. par défaut, utiliser $$
    #     -r
    #         si pidfile existe mais que le processus ne tourne plus, faire
    #         comme si le fichier n'existe pas.
    # Retourner 0 si le pid a été correctement écrit dans le fichier. Ce fichier
    # sera supprimmé automatiquement en fin de script
    # Retourner 1 si le fichier existe déjà et que le processus est en train de
    # tourner.
    # Retourner 2 si le fichier existe déjà mais que le processus ne tourne
    # plus.
    # Retourner 10 si autre erreur grave s'est produite (par exemple, s'il manque
    # le chemin vers pidfile, ou si le fichier n'est pas accessible en
    # écriture.)
    local OENC="$UTF8"
    local end_of_options pidfile pid=$$ replace=
    while [ -n "$1" ]; do
        case "$1" in
        -p)
            shift
            pid="$1"
            ;;
        -r)
            replace=1
            ;;
        --)
            shift
            end_of_options=1
            ;;

        -*)
            if ! set_verbosity "$1" -v; then
                ewarn "option non reconnue: $1"
            fi
            ;;

        *)
            end_of_options=1
            ;;
        esac
        [ -n "$end_of_options" ] && break
        shift
    done

    pidfile="$1"
    [ -n "$pidfile" ] || return 10

    if [ -f "$pidfile" ]; then
        local curpid="$(<"$pidfile")"
        if is_running "$curpid"; then
            return 1
        elif [ -n "$replace" ]; then
            /bin/rm -f "$pidfile" || return 10
        else
            return 2
        fi
    fi

    echo_ "$pid" >"$pidfile" || return 10
    autoclean "$pidfile"
    return 0
}

function read_mainClasses() {
    # USAGE
    #     read_mainClasses scriptName /path/to/mainClasses
    # Lire le fichier mainClasses et initialiser les variables correspondant à
    # scriptName.
    # Retourner 1 si une erreur quelconque se produit: l'entrée correspondant à
    # scriptName n'a pas été trouvée, il manque des arguments, ou le fichier
    # mainClasses n'existe pas.
    # Les lignes dans le fichier mainClasses doivent être de la forme
    #     scriptName:mainClass[;var0=value0;...]
    local OENC="$UTF8"
    local scriptname_="$1" mainClasses_="$2"
    [ -n "$scriptname_" -a -n "$mainClasses_" ] || return 1

    local line_="$(grep "^$scriptname_:" "$mainClasses_")" || return 1
    [ -n "$line_" ] || return 1

    #scriptname="${line_%%:*}"
    line_="${line_#*:}"
    mainClass="${line_%%;*}"
    line_="${line_#*;}"
    if [ "$line_" != "$mainClass" ]; then
        # Evaluer les variables
        eval "$line_"
    fi
}