#!/bin/bash

function detect_version() {
    version=""
    if has_label Share; then
        version="1.0"
    elif has_label MDVUSBROOT; then
        version="1.05"
    elif has_label Mdv_Flash; then
        version="2.0"
    elif has_label MDV_FLASH; then
        version="2.05"
    fi
    usbroot_device=$_device
    source_version_variables

    [ -n "$version" ]
}

function source_version_variables {
    local _version
    _version=$1
    [ -z "$_version" ] && _version=$version
    if [ "$_version" = "1.0" ]; then
        label=MDVUSBROOT
        boot_rel="/boot"
        loopbacks_rel="/loopbacks"
    elif [ "$_version" = "1.05" ]; then
        label=MDVUSBROOT
        boot_rel="/.boot"
        loopbacks_rel="/.loopbacks"
    elif [ "$_version" = "2.0" ]; then
        label=Mdv_Flash
        boot_rel="/.boot"
        loopbacks_rel="/.loopbacks"
    elif [ "$_version" = "2.05" ]; then
        label=MDV_FLASH
        boot_rel="/.boot"
        loopbacks_rel="/.loopbacks"
    fi
}

function has_label() {
    local _label _tmpdir
    _label=$1

    _tmpdir="/tmp/$$"

    mkdir -p $_tmpdir

    nash --force > /dev/null 2>&1 <<EOF
mount -t vfat LABEL=$_label $_tmpdir
EOF

    rc=$?

    _device=`perl -ne 'my @l = split; $l[1] eq "'$_tmpdir'" and print "$l[0]\n"' /proc/mounts`
    [ -z "$_device" ] && rc=1

    umount $_tmpdir 2> /dev/null
    rmdir $_tmpdir 2> /dev/null

    return $rc
}

function check_vendor() {

    # list of supported vendors/models

    # mandriva flash 1.0 (france)
    vendors[0]="13fe"
    models[0]="1a00"
    # mandriva flash 1.0 (brazil)
    vendors[1]="0930"
    models[1]="653e"
    # mandriva flash 4GB (france)
    vendors[2]="13fe"
    models[2]="1d00"

    rc=1

    mount -t usbfs none /proc/bus/usb 2> /dev/null

    i=0
    while [ ! -z "${vendors[$i]}" ]; do

        grep "P:" /proc/bus/usb/devices | grep -q \
                "Vendor=${vendors[$i]} ProdID=${models[$i]}"
        if [ $? -eq 0 ]; then
            rc=0
            break
        fi

        let i++
    done

    umount /proc/bus/usb 2> /dev/null

    return $rc
}

function insert_pendrive() {

    _tmpdir="/tmp/rescue-temp"
    mkdir -p $_tmpdir

    modprobe usb-storage > /dev/null 2>&1
    modprobe vfat > /dev/null 2>&1

    echo
    echo -n 'Please insert your Mandriva Flash pen drive and press ENTER when ready: '
    read READY
    echo
    echo -n 'Detecting pen drive: '

    for ((i=0; $i <= 15 ; i++)); do
        detect_version && nash --force > /dev/null 2>&1 <<EOF
mount -t vfat LABEL=$label $_tmpdir
EOF
        if [ $? -ne 0 ]; then
            echo -n '.'
            sleep 1
        else
            echo -n ' found!'

            if ! check_vendor; then
                echo
                echo "This is not an official Mandriva Flash key!"
                echo
            fi

            cat /proc/mounts | grep $_tmpdir | cut -d' ' -f1 | \
                sed 's/[0-9]*$//g' > /tmp/rescue-device
            umount $_tmpdir
            rmdir $_tmpdir 2> /dev/null

            return 0
        fi
    done

    rmdir $_tmpdir 2> /dev/null

    echo
    echo
    echo "Couldn't detect Mandriva Flash pen drive!"
    echo

    return 1
}

function mount_usbroot() {

    nash --force > /dev/null 2>&1 <<EOF
mount -t vfat LABEL=$label $1
EOF
    if [ $? -ne 0 ]; then
        echo "Error mounting device labeled $label"
        return 1
    fi

    return 0
}

function mount_sharedroot() {

    nash --force > /dev/null 2>&1 <<EOF
mount -t vfat LABEL=Share $1
EOF
    if [ $? -ne 0 ]; then
        echo "Error mounting device labeled Share"
        return 1
    fi

    return 0
}

function progress() {

    echo -ne '\b|'
    usleep 100000
    echo -ne '\b/'
    usleep 100000
    echo -ne '\b-'
    usleep 100000
    echo -ne '\b\\'
    usleep 100000
}

function lumount() {
    local dir=$1
    loop=$(perl -ne '@l = split; if ($l[1] eq "'$dir'") { print $l[0]; exit }' /proc/mounts)
    umount $dir
    losetup -d $loop
}

function set_sfs_loop() {
    local dir=$1
    sfs_loop_std="$dir$loopbacks_rel/distrib.sqfs"
    sfs_loop_lzma="$dir$loopbacks_rel/distrib-lzma.sqfs"
    if [ -e $sfs_loop_lzma ]; then
	sfs_loop=$sfs_loop_lzma
    else
	sfs_loop=$sfs_loop_std
    fi
}