#!/bin/dash
# Filename:      scanpartitions
# Purpose:       scan for partitions and return table of the form useful for generation of /etc/fstab entries
# Authors:       (c) Klaus Knopper Nov 2002, (c) Michael Prokop <mika@grml.org>
# Bug-Reports:   see http://grml.org/bugs/
# License:       This file is licensed under the GPL v2.
# Latest change: Mon Dez 04 13:21:11 CET 2006 [mika]
################################################################################
# Original Knoppix notes:
# Reads /proc/partitions, returns table of the form
# basename(devicefile) mountpoint filesystemtype additional_info
# Useful for automatic generation of /etc/fstab entries (you still may have to add noauto 0 0).

[ ! -e /proc/partitions ] && { echo "$0: /proc not mounted, exiting" >&2; exit 1; }

TMP="$(mktemp)"
trap "rm -f $TMP" 2 3 11

if [ -z "$1" ]; then
  partitions=""
  disks=""
  disksize=0
  blocksum=0
  pold="none"
  while read major minor blocks partition relax; do
    partition="${partition#/dev/}"
    [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
    [ "$blocks" -lt 2 ] 2>/dev/null && continue

    case "$partition" in
      ?d?|ataraid/d?) disks="$disks $partition"; disksize="$blocks"; blocksum=0;;
      ram*|cloop*|loop*) ;; # Kernel 2.6 bug?
      *) blocksum="$(($blocksum + $blocks))"; [ "$blocksum" -gt "$disksize" ] >/dev/null 2>&1 || partitions="$partitions /dev/$partition";;
    esac
  done <<EOT
  $(mawk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
EOT

# Add disks without partition table (probably ZIP drives)
  for d in $disks; do
    case "$partitions" in */dev/$d*) continue;; esac
    partitions="$partitions /dev/$d"
  done
else
  partitions="$*"
fi

# Check for *duplicate* fs-label
if [ -z "$NOLABEL" ] ; then
   if [ -x /lib/udev/vol_id ] ; then
     for p in $partitions; do
      echo -n "$p: " >> $TMP
      echo "$(/lib/udev/vol_id $p 2>/dev/null | awk -F'=' '/ID_FS_LABEL=/ {print $2}' 2>/dev/null)" >> $TMP
     done
   fi
fi

for p in $partitions; do
  addinfo=''
  fs=''
  mountpoint=''
  if [ -z "$NOLABEL" ] ; then # unless $NOLABEL is set check for fs-labels
     # notice: vol_id -l retursn FS_LABEL_SAFE which does not work for mount:
     if [ -x /lib/udev/vol_id ] ; then
        PARTINFO="$(/lib/udev/vol_id $p 2>/dev/null)"
        label="$(/lib/udev/vol_id $p 2>/dev/null | awk -F'=' '/ID_FS_LABEL=/ {print $2}' 2>/dev/null)"
        case $PARTINFO in
          *ID_FS_TYPE=ntfs*)
            [ -n "$label" ] && addinfo=" # ntfs does not support mount by label ($label)" && label=''
            ;;
        esac
     else
        label=''
     fi
     if [ -n "$label" ] ; then
       part="LABEL=$label"
       addinfo=" # $p"
       # check for multiple devices with same label
       warn="$(awk -F" " '{s[$NF]++}END{for(i in s)if(s[i]>1)print s[i], "labels " i}' $TMP)"
       if expr "$(echo ${warn} | awk '{print $3}')" = "$label" 1>/dev/null 2>&1 ; then
         # use UUID if we have several devices with same label
         UUID="$(/lib/udev/vol_id -u $p 2>/dev/null)"
         if [ -n "$UUID" ] ; then
            part="UUID=$UUID"
            mountpoint="/mnt/${part##*UUID=}"
            SKIPUUIDPART=1 # make sure $part is correct
         else
            part="$p"
            addinfo=" # duplicate labels but no UUID found"
            mountpoint="/mnt/${part##*/}"
            SKIPLABELPART=1 # make sure $part is correct
         fi
       fi
       if [ -z "$SKIPLABELPART" -a -z "$SKIPUUIDPART" ] ; then
          labelpart=$(echo $part | sed 's,/,,g') # strip slashes from FS-Label
          mountpoint="/mnt/${labelpart##*=}"
       fi
     else
       part="$p"
       [ -n "$addinfo" ] || addinfo=''
       mountpoint="/mnt/${part##*/}"
     fi
  else
    part="$p"
    [ -n "$addinfo" ] || addinfo=''
    mountpoint="/mnt/${part##*/}"
  fi
  # fstype is an external script
  # send "unknown volume type" message to /dev/null
  fs="auto"
  scanfs="$(fstype $p 2>/dev/null | uniq)"
  [ -n "$scanfs" ] && fs="$scanfs"
  [ "$fs" = "swap" ] && mountpoint="none"
  [ "$fs" = "auto" ] && addinfo=" # no known filesystem detected"

  # finally print text for use in rebuildfstab
  echo "${part}" "${mountpoint}" "${fs}${addinfo}"
done

rm -f "$TMP"

exit 0

## END OF FILE #################################################################
