#/**
#         ogr CreateImage int_ndisk int_nfilesys str_repo path_image
#@brief   Crea una imagen a partir de un sistema de archivos.
#@param   int_ndisk     nº de orden del disco
#@param   int_nfilesys  nº de orden del sistema de archivos
#@param   str_repo      repositorio de imágenes (remoto o caché local)
#@param   path_image    camino de la imagen (sin extensión)
#@return  (nada, por determinar)
#@note    repo = { REPO, CACHE }
#@exception OG_ERR_FORMAT    formato incorrecto.
#@exception OG_ERR_NOTFOUND  fichero o dispositivo no encontrado.
#@exception OG_ERR_FILESYS   sistema de archivos no accesible o no soportado.
#@exception OG_ERR_LOCKED    particion bloqueada por otra operación.
#@exception OG_ERR_IMAGE     error al crear la imagen del sistema.
#@warning En pruebas iniciales
#@todo    Comprobaciones, control de errores, definir parámetros, etc.
#@version 0.1 -  Integracion para Opengnsys  -  HIDRA:CrearImagen{EXT3, NTFS}.sh;  EAC: CreateImageFromPartition () 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 - Version en pruebas para OpenGNSys
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2009/10/07
#@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 IMGDIR IMGFILE ERRCODE

# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
    ogr Help "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys str_repo path_image" \
           "$FUNCNAME 1 1 REPO /aula1/winxp"
    return
fi
# Error si no se reciben 4 parámetros.
[ $# -lt 4 ] && ogr RaiseError $OG_ERR_FORMAT && return $?

PART=$(ogr DiskToDev "$1" "$2") || return $?
if ogr IsLocked $1 $2; then
    ogr RaiseError $OG_ERR_LOCKED "$1,$2"
    return $?
fi
IMGDIR=$(ogr GetParentPath "$3" "$4")
[ -n "$IMGDIR" ] || ogr RaiseError $OG_ERR_NOTFOUND "$3 $(dirname $4)" || return $?
IMGFILE="$IMGDIR/$(basename "$4").img"
ogr Unmount $1 $2 2>/dev/null

ogr Lock $1 $2 || return $?
trap "ogr Unlock $1 $2; rm -f $IMGFILE" 1 2 3 6 9

TYPE="$(ogr GetFsType $1 $2)"
case "$TYPE" in
    EXT[234]|REISERFS|XFS|JFS)
        partimage -M -f3 -o -d -V0 -B gui=no -c -z1 save $PART "$IMGFILE"
        ;;
    NTFS)
        partimage -M -f3 -o -d -V0 -B gui=no -c -z1 save $PART "$IMGFILE"
        ;;
    FAT32|FAT16)
        partimage -M -f3 -o -d -V0 -B gui=no -c -z1 save $PART "$IMGFILE"
        ;;
    *)  ogr RaiseError $OG_ERR_PARTITION "$1 $2 $TYPE"
        return $? ;;
esac

# Controlar salida de error y desbloquear partición.
ERRCODE=$?
if [ $ERRCODE != 0 ]; then
    ogr RaiseError $OG_ERR_IMAGE "$1 $2 $IMGFILE"
    rm -f "$IMGFILE"
fi
ogr Unlock $1 $2
return $ERRCODE
