#!/bin/dash
# Filename:      fstype
# Purpose:       fstype partition|disk - returns file system type to stdout
# Authors:       (c) Klaus Knopper (until April 2004), (c) Michael Prokop <mika@grml.org>
# Bug-Reports:   see http://grml.org/bugs/
# License:       This file is licensed under the GPL v2.
################################################################################

if [ -n "$1" ]; then
# Check if partition is already mounted
 while read device mountpoint filesystem relax; do
   case "$device" in *$1*)
     case "$filesystem" in *fuse*) break;; esac # never return "fuse", do the real check instead.
     echo "$filesystem"; exit 0 ;;
   esac
 done<<EOT
$(cat /proc/mounts)
EOT

 basedsk=${1%[0-9]}
 basedsk=${basedsk%[0-9]}

# Check if a device/medium is present at all
 dd if="$1" count=1 bs=1k >/dev/null 2>&1 || exit 2

# check fs-type
FSTYPE="$(LANG=C LC_ALL=C LC_MESSAGES=C file -Lkbs "$1")"
[ "$?" = "0" ] || exit 3

case "$FSTYPE" in
  *[Ss][Ww][Aa][Pp]*)
    # vol_id is broken for swap detection :-/
    ;;
  *)
   if [ -x /lib/udev/vol_id ] ; then
      FSTYPE=$(LANG=C LC_ALL=C LC_MESSAGES=C /lib/udev/vol_id $1 | grep ID_FS_TYPE)
   fi
   # fallback if vol_id fails...
   [ -n "$FSTYPE" ] || FSTYPE="$(LANG=C LC_ALL=C LC_MESSAGES=C file -Lkbs "$1")"
esac

# Check via file(1) it vol_id couldn't find anything

 case "$FSTYPE" in
  *ISO\ 9660*)                 echo "iso9660";;
  *[Mm][Ii][Nn][Ii][Xx]*)      echo "minix";;
  *[Xx][Ff][Ss]*)              echo "xfs";;
  *[Jj][Ff][Ss]*)              echo "jfs";;
  *[Ee][Xx][Tt]3*)             echo "ext3";;
  *[Ee][Xx][Tt]2*)             echo "ext2";;
  *[Ss][Ww][Aa][Pp]*)
          if [ "$ANYSWAP" = "yes" ]  || LANG=C LC_ALL=C LC_MESSAGES=C fdisk -l $basedsk 2>/dev/null | grep "^$1 "| grep -iqs 'linux swap'; then
                echo swap
          else
                if [ "$basedsk" = /dev/md ] ; then
                   FSTYPE=$(LANG=C LC_ALL=C LC_MESSAGES=C /lib/udev/vol_id $1 | grep ID_FS_TYPE)
                   [ -n "$FSTYPE" ] && echo ${FSTYPE#*=} || echo "auto"
                else
                   echo 1>&2 " *   Ignoring swap signature on ${1}, use bootoption 'anyswap' to enable"
                fi
          fi
    ;;
  *[Nn][Tt][Ff][Ss]*)          echo "ntfs";;
  *[Ff][Aa][Tt]*)              echo "vfat";;
  *)
          if [ -x /lib/udev/vol_id ] ; then
             FSTYPE=$(LANG=C LC_ALL=C LC_MESSAGES=C /lib/udev/vol_id $1 | grep ID_FS_TYPE)
             [ -n "$FSTYPE" ] && echo ${FSTYPE#*=} || echo "auto"
          else
             echo auto
          fi
 ;;
 esac

else
 echo 'Usage: fstype /dev/ice' >&2
 echo 'Info:  fstype returns filesystem type of given device to stdout.' >&2
 echo '' >&2
 echo 'Usage example: fstype /dev/hda1' >&2
 exit 1
fi

exit 0

## END OF FSTYPE #################################################################
