#/**
#         ogr FormatFs int_ndisk int_nfilesys [type_fstype] [str_label]
#@brief   Formatea o reformatea un sistema de ficheros.
#@param   int_ndisk     nº de orden del disco
#@param   int_nfilesys  nº de orden de la partición
#@param   type_fstype   mnemónico de sistema de ficheros a formatear
#@param   str_label     etiqueta de volumen (opcional)
#@return  (por determinar)
#@exception OG_ERR_FORMAT    Formato incorrecto.
#@exception OG_ERR_NOTFOUND  Dispositivo o fichero no encontrado.
#@exception OG_ERR_PARTITION Partición no accesible o desconocida.
#@exception OG_ERR_FILESYS   Sistema de archivos no accesible o desconocido.
#@note    Requisitos:	mkfs*
#@warning No formatea sistemas de archivos montados ni bloqueados.
#@todo    Definir salidas.
#@version 0.9 - Primera versión para OpenGNSys.
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2009-10-08
#*/ ##
# Variables locales
local PART FSTYPE PARTTYPE LABEL PROG PARAMS ERRCODE

# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
    ogr Help "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys [type_fstype] [str_label]" \
           "$FUNCNAME 1 1" \
           "$FUNCNAME 1 1 EXT4" \
           "$FUNCNAME 1 1 \"DATA\"" \
           "$FUNCNAME 1 1 EXT4 \"DATA\""
    return
fi
# Error si no se reciben entre 2 y 4 parámetros.
[ $# -ge 2 -a $# -le 4 ] || ogr RaiseError $OG_ERR_FORMAT || return $?
# Obtener dispositivo y tipo de sisitema de archivos.
PART=$(ogr DiskToDev "$1" "$2") || return $?
FSTYPE="$(ogr GetFsType $1 $2)"
PARTTYPE="$(ogr GetPartitionType $1 $2)"

# Elegir tipo de formato según el tipo de sistema de archivos.
case "$3" in
    EXT2)     PROG="mkfs.ext2";;
    EXT3)     PROG="mkfs.ext3";;
    EXT4)     PROG="mkfs.ext4";;
    REISERFS) PROG="mkfs.reiserfs"; PARAMS="-f" ;;
    REISER4)  PROG="mkfs.reiser4";;
    XFS)      PROG="mkfs.xfs"; PARAMS="-f" ;;
    JFS)      PROG="mkfs.jfs"; PARAMS="<<<\"y\"";;
    NTFS)     PROG="mkntfs";   PARAMS="-f" ;;
    FAT32)    PROG="mkdosfs";  PARAMS="-F 32" ;;
    FAT16)    PROG="mkdosfs";  PARAMS="-F 16" ;;
    FAT12)    PROG="mkdosfs";  PARAMS="-F 12" ;;
    SOLARIS)  ;;
    *)        LABEL="$3" ;;
esac
# Si no se indica explícitamente, detectar el tipo de sistema de archivos.
if [ -z "$PROG" ]; then
    if ogr IsFormated $1 $2; then
        # Detectar formato actual.
        case "$FSTYPE" in
            EXT2)      PROG="mkfs.ext2";;
            EXT3)      PROG="mkfs.ext3";;
            EXT4)      PROG="mkfs.ext4";;
            REISERFS)  PROG="mkfs.reiserfs"; PARAMS="-f" ;;
            REISER4)   PROG="mkfs.reiser4";;
            XFS)       PROG="mkfs.xfs"; PARAMS="-f" ;;
            JFS)       PROG="mkfs.jfs"; PARAMS="<<<\"y\"";;
            NTFS)      PROG="mkntfs";   PARAMS="-f" ;;
            FAT32)     PROG="mkdosfs";  PARAMS="-F 32" ;;
            FAT16)     PROG="mkdosfs";  PARAMS="-F 16" ;;
            FAT12)     PROG="mkdosfs";  PARAMS="-F 12" ;;
            SOLARIS)   ;;
            *)         ogr RaiseError $OG_ERR_FILESYS "$1 $2 $FSTYPE"
                       return $? ;;
        esac
    else
        # Detectar formato por defecto a partir del tipo de partición.
        case "$PARTTYPE" in
            LINUX)       PROG="mkfs.ext3";;    # Ext3 por defecto en Linux.
            NTFS|HNTFS)  PROG="mkntfs";  PARAMS="-f" ;;
            FAT32|FAT32) PROG="mkdosfs"; PARAMS="-F 32" ;;
            FAT16|FAT16) PROG="mkdosfs"; PARAMS="-F 16" ;;
            FAT12|FAT12) PROG="mkdosfs"; PARAMS="-F 12" ;;
            SOLARIS)     ;;
            *)           ogr RaiseError $OG_ERR_PARTITION "$1 $2 $PARTTYPE"
                         return $? ;;
        esac
    fi
else
    # Comprobar si el tipo de sist. de archivos es válido.
    if ! ogr IsValidType "$3" "$PARTTYPE"; then
       ogr RaiseError $OG_ERR_PARTITION "$3 != $PARTTYPE"
       return $?
    fi
fi
# Comprobar consistencia entre id. de partición y tipo de sistema de archivos.
[ -n "$PROG" ] || ogr RaiseError $OG_ERR_PARTITION "$3,$FSTYPE,$PARTTYPE" || return $?

# Etiquetas de particion.
if [ -z "$LABEL" ]; then
    [ "$4" != "CACHE" ] || ogr RaiseError $OG_ERR_FORMAT "$MSG_RESERVEDVALUE: CACHE" || return $?
    [ -n "$4" ] && PARAMS="$PARAMS -L $4"
else
    PARAMS="$PARAMS -L $LABEL"
fi

# Error si la particion esta montada o está bloqueada.
if ogr IsMounted $1 $2; then
    ogr RaiseError $OG_ERR_FILESYS "$1 $2"       # Indicar nuevo error
    return $?
fi
if ogr IsLocked $1 $2; then
    ogr RaiseError $OG_ERR_LOCKED "$1 $2"
    return $?
fi
# Formatear en modo uso exclusivo.
ogr Lock $1 $2
eval $PROG $PARAMS $PART 2>/dev/null
ERRCODE=$?
case $ERRCODE in
    0)    ;;
    127)  ogr RaiseError $OG_ERR_NOTEXEC "$PROG" ;;
    *)    ogr RaiseError $OG_ERR_FILESYS "$1 $2" ;;
esac
ogr Unlock $1 $2
return $ERRCODE
