#!/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 }