#!/bin/sh

[ -f /target/etc/fstab ] || exit 0

MEDIA=/media # or MEDIA='' to make directories in /

# dev, mountpoint, type, options, dump, pass
addfstab () {
    printf "%-15s %-15s %-7s %-15s %-7s %s\n" "$1" "$2" "$3" "$4" "$5" "$6" >> /target/etc/fstab
}

rm_dir_or_link () {
    if [ -L "$1" ]; then
	rm "$1"
    elif [ -d "$1" ]; then
	rmdir "$1"
    fi
}

# category, file system, options, main device, other devices ...
populate_media () {
    local category fs options number mount_point
    category=$1
    fs=$2
    options=$3
    shift; shift; shift
    mkdir -p /target$MEDIA
    if [ "$1" ]; then
        rm_dir_or_link /target${MEDIA}/${category}
        ln -s ${category}0 /target${MEDIA}/${category}
    fi
    number=0
    while [ "$1" ]; do
	mount_point="${MEDIA}/${category}$number"
	addfstab $1 $mount_point $fs $options 0 0
	rm_dir_or_link /target$mount_point
	mkdir -p /target$mount_point
	number=$(($number + 1))
	shift
    done
}

CDDEV=$(grep /cdrom /proc/mounts | cut -d ' ' -f 1 | grep -v ^/dev/loop)
if [ -n "$CDDEV" ]; then
    MAPCDDEV=$(mapdevfs $CDDEV)
else
    MAPCDDEV=''
fi

CDDEVICES=''
for dev in /dev/cdroms/*; do
    [ -b "$dev" ] || continue
    mapdev=$(mapdevfs $dev)
    if [ -n "$mapdev" -a "$mapdev" != "$MAPCDDEV" ]; then
	CDDEVICES="$CDDEVICES $mapdev"
    fi
done
if [ -n "$MAPCDDEV" ]; then
    CDDEVICES="$MAPCDDEV $CDDEVICES" # first the mounted cdrom
fi

populate_media cdrom iso9660 ro,user,noauto $CDDEVICES
# Compatability link to keep things working; sarge is not migrated away
# entirely from /cdrom.
if [ -n "$CDDEVICES" ]; then
    rm_dir_or_link /target/cdrom
    ln -s media/cdrom /target/cdrom
fi

FDDEVICES=''
for dev in /dev/floppy/?; do
    [ -b "$dev" ] || continue
    mapdev=$(mapdevfs $dev)
    if [ "$mapdev" ]; then
	FDDEVICES="$FDDEVICES $mapdev"
    fi
done

populate_media floppy auto rw,user,noauto $FDDEVICES

# See if a usb storage device is plugged in right now. If so, assume it is
# removable media unless the disk is already listed in the fstab. 
USBDEVICES=''
HD_MEDIA=$(grep /hd-media /proc/mounts | cut -d ' ' -f 1)
if [ -n "$HD_MEDIA" ]; then
    HD_MEDIA="$(mapdevfs $HD_MEDIA)"
fi
for dir in /proc/scsi/usb-storage-* /proc/scsi/usb-storage; do
    if [ -d "$dir" ]; then
        for ent in $dir/*; do
	    if [ -f "$ent" ]; then
	        host=$(grep "Host scsi" $ent | sed 's/.*scsi\([0-9]\).*/\1/')
	        infstab=""
	        for dev in $(find /dev/scsi/host$host/ -type b); do
	            if [ -b "$dev" ]; then
	 	        if grep -q "^$(mapdevfs $dev) " /target/etc/fstab; then
			    infstab=1
			fi
	 	    fi
	        done
		if [ ! "$infstab" ]; then
		    dev=$(mapdevfs $(find /dev/scsi/host$host/ -type b | grep /disc))
		    if [ -z "$USBDEVICES" ]; then
		        USBDEVICES="$dev"
		    else
		        if [ "$dev" != "$HD_MEDIA" ]; then
		            USBDEVICES="$USBDEVICES $dev"
                        else
			    # If installing from usb, list that device first.
			    USBDEVICES="$dev $USBDEVICES"
			fi
		    fi
		fi
	    fi
        done
    fi
done

populate_media usb auto rw,user,noauto $USBDEVICES
