#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS

function display_help() {
    uecho "$scriptname: démonter un système de fichier récursivement

USAGE
    $scriptname mountpoint

Démonter tous les systèmes de fichiers qui sont montés en-dessous de mountpoint
puis démonter mountpoint. Démonter aussi tous les systèmes de fichiers
bind-montés à partir d'un sous-répertoire de mountpoint.

OPTION
    -c, --continuous
        Continuer même en cas d'erreur"
}

continuous=
args=(
    --help '$exit_with display_help'
    -c,--continuous continuous=1
)
parse_args "$@"; set -- "${args[@]}"

mountp="$1"
[ -n "$mountp" ] || die "Vous dévez spécifier le système de fichier à démonter"
[ -d "$mountp" ] || die "$mountp: répertoire introuvable"
setx mountp=abspath "$mountp"

run_as_root ${continuous:+-c} "$@"

setx -a mountps=findmnt -nlo TARGET
array_contains mountps "$mountp" || die "Vous devez spécifier un répertoire de montage valide"

function show_all() {
    findmnt -T "$mountp" -Rnlo TARGET
    findmnt -nlo TARGET | awkrun mountp="$mountp" '{ if (substr($0, 1, length(mountp) + 1) == (mountp "/")) print }'
}
function die_maybe() {
    [ -n "$continuous" ] && return
    die "$@"
}

setx -a mounts=evalp show_all // sort -u // \
     awk '{print length($0) "," $0}' // \
     sort -nr // \
     awk '{sub(/[0-9]+,/, ""); print}'

for mount in "${mounts[@]}"; do
    estep "$mount"
    umount "$mount" || die_maybe
done
