#/**
#         ogr RestoreImage str_repo path_image int_ndisk int_nfilesys
#@brief   Restaura una imagen de sistema de archivos.
#@param   str_repo     repositorio de imágenes o caché local
#@param   path_image   camino de la imagen
#@param   int_ndisk    nº de orden del disco
#@param   int_filesys  nº de orden de la partición
#@return  (por determinar)
#@exception OG_ERR_FORMAT   formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados.
#@exception OG_ERR_LOCKED   partición bloqueada por otra operación.
#@exception OG_ERR_IMAGE    error al restaurar la imagen del sistema.
#@warning En pruebas iniciales
#@todo    Comprobar incongruencias partición-imagen, control de errores, definir parámetros, caché/repositorio, etc.
#@version 0.1 -  Integracion para Opengnsys  -  HIDRA:RestaurarImagen{EXT3, NTFS}.sh;  EAC: RestorePartitionFromImage() en Deploy.lib
#@author Ramon Gomez, ETSII Universidad de Sevilla 
#@Date    2008/05/13
#@author  Antonio J. Doblas Viso. Universidad de Malaga
#@date    2008/10/27
#@version 0.9 - Primera version muy en pruebas para OpenGNSys
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2009/09/10
#@version 1.0 - Usar sistemas de archivos en vez de particiones.
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2010/01/12
#*/ ##
# Variables locales
local PART PARTSIZE IMGFILE IMGSIZE

# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
    ogr Help "$FUNCNAME" "$FUNCNAME str_repo path_image int_ndisk int_nfilesys" \
           "$FUNCNAME REPO /aula1/winxp 1 1"
    return
fi
# Error si no se reciben 4 parámetros.
[ $# -lt 4 ] && ogr RaiseError $OG_ERR_FORMAT && return $?
# Procesar parámetros.
PART="$(ogr DiskToDev "$3" "$4")" || return $?
IMGFILE=$(ogr GetPath "$1" "$2.img") || return $?
[ -r "$IMGFILE" ] || ogr RaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $?
# Error si la imagen no cabe en la particion.
IMGSIZE=$(ogr GetImageSize "$1" "$2")
PARTSIZE=$(ogr GetPartitionSize $3 $4)
if [ $IMGSIZE -gt $PARTSIZE ]; then
    ogr RaiseError $OG_ERR_PARTITION "$IMGSIZE > $PARTSIZE"
    return $?
fi

# Comprobar el bloqueo de la partición, desmontarla y bloquearla.
if ogr IsLocked $3 $4; then
    ogr RaiseError $OG_ERR_LOCKED "$3,$4"
    return $?
fi
ogr Unmount $3 $4 2>/dev/null || return $?
ogr Lock $3 $4 || return $?
trap "ogr Unlock $3 $4" 1 2 3 6 9

# Restaurar según el tipo de sistema de archivos.
# Atención: no se comprueba incongruencia entre partición e imagen.
TYPE="$(ogr GetFsType $3 $4)"
case "$TYPE" in
    EXT[234]|REISERFS|XFS|JFS)
        partimage -M -f3 -o -d -V0 -B gui=no -c -z1 --volume=0 restore $PART "$IMGFILE"
        ;;
    NTFS)
        partimage -M -f3 -o -d -V0 -B gui=no -c -z1 --volume=0 restore $PART "$IMGFILE"
        ;;
    FAT32|FAT16)
        partimage -M -f3 -o -d -V0 -B gui=no -c -z1 --volume=0 restore $PART "$IMGFILE"
        ;;
    *)  ogr RaiseError $OG_ERR_FORMAT
        return $? ;;
esac
ERRCODE=$?
if [ $ERRCODE != 0 ]; then
    ogr RaiseError $OG_ERR_IMAGE "$IMGFILE, $3, $4"
fi
ogr Unlock $3 $4
return $ERRCODE
