#!/bin/sh
# Copyright (C) 2006-2011  mariodebian at gmail
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
#


DEVICE=$1
FSTYPE="unknow"
NTFS_mode="ntfs"
[ -x /sbin/mount.ntfs-3g ] && NTFS_mode="ntfs-3g"

KLIBC_FSTYPE=/usr/lib/klibc/bin/fstype
[ -x /bin/fstype ] && KLIBC_FSTYPE=/bin/fstype
[ ! -x $KLIBC_FSTYPE ] && KLIBC_FSTYPE=/bin/not_found

UDEVINFO="/usr/bin/udevinfo"
[ -e /sbin/udevadm ] && UDEVINFO="/sbin/udevadm info"


ONLY_FS=0
if [ "$2" = "--only" ]; then
  ONLY_FS=1
fi

echo_fs() {
 if [ "$ONLY_FS" = "0" ]; then
   echo "$DEVICE $1"
 else
   echo "$1"
 fi
}


if [ "$DEVICE" = "" ]; then
  echo "error, need device"
  exit 1
fi

# 1.- Try with udev utils vol_id or blkid
if [ -x /lib/udev/vol_id ]; then
  FSTYPE=$(/lib/udev/vol_id -t $DEVICE 2>&1)

elif [ -x /usr/bin/blkid ]; then
  FSTYPE=$(/usr/bin/blkid -o udev $DEVICE 2>&1| awk -F"=" '/ID_FS_TYPE=/ {print $2}')

elif [ -x /sbin/blkid ]; then
  FSTYPE=$(/sbin/blkid -o udev $DEVICE 2>&1| awk -F"=" '/ID_FS_TYPE=/ {print $2}')

else
  FSTYPE=""
fi
 case $FSTYPE in
  *unknow*)
     FSTYPE="unknow"
     ;;
   *error*volume*)
     FSTYPE="error"
     ;;
   *ntfs*)
     FSTYPE=$NTFS_mode
     ;;
   *NTFS*)
     FSTYPE=$NTFS_mode
     ;;
 esac   

if [ "$FSTYPE" != "" ] && [ "$FSTYPE" != "unknow" ] && [ "$FSTYPE" != "error" ] ; then
   echo_fs "$FSTYPE"
   exit 0
fi

# 2.- Try with udevinfo
DPATH=$(find /sys/devices -name $(echo $DEVICE | awk -F"/" '{print $NF}')| awk -F"/block" '{print "/block"$2}')
if [ "$DPATH" != "" ]; then
  FSTYPE=$($UDEVINFO --query=env --path=$DPATH 2>/dev/null| awk -F'=' '/^ID_FS_TYPE/ {print $2}')
else
  FSTYPE=""
fi

 case $FSTYPE in
  *unknow*)
     FSTYPE="unknow"
     ;;
   *error*volume*)
     FSTYPE="error"
     ;;
   *ntfs*)
     FSTYPE=$NTFS_mode
     ;;
   *NTFS*)
     FSTYPE=$NTFS_mode
     ;;
 esac   

if [ "$FSTYPE" != "" ] && [ "$FSTYPE" != "unknow" ] && [ "$FSTYPE" != "error" ] ; then
   echo_fs "$FSTYPE"
   exit 0
fi



# 3.- Try with fstype
if [ -x $KLIBC_FSTYPE ]; then
FSTYPE=$($KLIBC_FSTYPE $DEVICE 2>&1 | awk -F "=" '/^FSTYPE/ {print $2}')
 case $FSTYPE in
  *unknow*)
     FSTYPE="unknow"
     ;;
   *ntfs*)
     FSTYPE=$NTFS_mode
     ;;
   *NTFS*)
     FSTYPE=$NTFS_mode
     ;;
 esac   

  if [ "$FSTYPE" != "" ] && [ "$FSTYPE" != "unknow" ] && [ "$FSTYPE" != "error" ] ; then
    echo_fs "$FSTYPE"
    exit 0
  fi

fi

# 4.- Try with disktype
#  type=$(disktype $DEVICE 2>/dev/null | grep "file system")
#  case "$type" in
#   *ReiserFS*)
#        FSTYPE="reiserfs"
#        ;;
#   *XFS*)
#        FSTYPE="xfs"
#        ;;
#   *Ext3*)
#        FSTYPE="ext3"
#        ;;
#   *Ext2*)
#        FSTYPE="ext2"
#        ;;
#   *HFS*)
#        FSTYPE="hfs"
#        ;;
#   *NTFS*)
#        FSTYPE=$NTFS_mode
#        ;;
#   *FAT16*)
#        FSTYPE="vfat"
#        ;;     
#   *FAT*)
#        FSTYPE="vfat"
#        ;;
#   *)
#        FSTYPE="unknow"
#        ;;
#esac

#if [ "$FSTYPE" != "" ] && [ "$FSTYPE" != "unknow" ] && [ "$FSTYPE" != "error" ] ; then
#   echo_fs "$FSTYPE"
#   exit 0
#fi

# 3.- Try with fdisk

line=$(/sbin/fdisk -l |grep $1 | sed s/*/XX/g)
if [ "$(echo ${line} | awk '{print $2}')" = "XX" ] ; then
 type=$(echo ${line}| awk '{print $6}')
else
 type=$(echo ${line}| awk '{print $5}')
fi

case "$type" in
  *83*)
        FSTYPE="ext3"
	;;
  82)
	FSTYPE="swap"
	;;
  b)
	FSTYPE="vfat"
	;;
  c)
	FSTYPE="vfat"
	;;
  e)
	FSTYPE="vfat"
	;;
  f)
	FSTYPE="extended"
	;;
  5)
	FSTYPE="extended"
	;;
  7)
        FSTYPE="$NTFS_mode"
	;;
  *)
	FSTYPE="auto"
	;;
esac


if [ "$FSTYPE" != "" ] && [ "$FSTYPE" != "unknow" ] && [ "$FSTYPE" != "error" ] ; then
   echo_fs "$FSTYPE"
   exit 0
fi

exit 1
