#/bin/sh

# Copyright (C) 2007 OpenWrt.org

do_mount() {
	local node=$1
	grep -q /dev/${node} /proc/mounts
	if [ $? = 0 ]; then
		logger -t ${TAG} "${DEVICENAME} - /dev/${node} already mounted, skipping ..."
	else
		mnt=/mnt/usb_${node}
		logger -t ${TAG} "${DEVICENAME} - mounting /dev/${node} on ${mnt} ID $2"
		mkdir -p ${mnt}
		case "$2" in
		83)
			#mount /dev/${node} ${mnt} -t ext3 -o noatime,nodiratime || mount /dev/${node} ${mnt} -o noatime,nodiratime || logger -t ${TAG} "Mount Fail!!!"
			#chmod 777 ${mnt}
			echo "EXT3 not implement yet...." > /dev/console
			;;
		4|6|b|c|e|f)
			mount /dev/${node} ${mnt} -t vfat -o noatime,nodiratime,uid=65534,gid=65534,umask=0 || logger -t ${TAG} "Mount Fail!!!"
			link_disk
			;;
		7)
			if [ -e /usr/bin/ntfs-3g ]; then
				ntfs-3g /dev/${node} ${mnt}
				link_disk
			else
				logger -t ${TAG} "Unsupported partition id $2"
				return 1
			fi
			;;
		*)
			logger -t ${TAG} "Unsupported partition id $2"
			return 1
			;;
		esac
		id=${node}
		if [ -f ${USBSYS}/serial ]; then
			id=$(cat ${USBSYS}/serial | strings)
			id=`echo "${id}" | sed 's/ /_/g'`
			id=${id}_$(expr substr ${node} 4 1)
		fi
		share=${RUN}/share_${id}
		rm -f ${share}
		ln -s ${mnt} ${share}
		echo ${share} > ${RUN}/dev2share.${node}
		echo ${node} > ${RUN}/${DEVICENAME}.${node}
		echo ${DEVICENAME} > ${RUN}/usbdev.${node}
		[ -f ${USBSYS}/product ] && cp ${USBSYS}/product ${RUN}/info.${node}
	fi
}

link_disk(){
	#check the size of usb_disk1 and link up storage
	check=$(ls -l /mnt | grep "usb_disk1" | awk '{printf $11}')
	[ -n "$check" -a ! -e "$check" ] && rm /mnt/usb_disk1
	ds=$(cat /proc/partitions | grep ${node} | awk '{printf $3 }')
	logger -t ${TAG} -s "the size of ${mnt} = $ds"
	if expr $ds \> 100000 ; then  
		logger -t ${TAG} -s "$ds is greater than 100MB!"
		[ -e /mnt/usb_disk1 ] || {
			logger -t ${TAG} -s "/mnt/usb_disk1 link up ${mnt}"
			ln -s "${mnt}" "/mnt/usb_disk1"
			ln -s /mnt/usb_disk1/opkg-install/usr /usr/local
		}
	else
		check=$(ls -l /mnt | grep "usb_disk1" | awk '{printf $11}')
		[ "$check" = "${mnt}" ] && {
			logger -t ${TAG} -s "rm /mnt/usb_disk1"
			rm /mnt/usb_disk1
		} 
		logger -t ${TAG} -s "$ds is smaller than 100MB!"
	fi
}

TAG=`basename $0`
logger -t ${TAG} "${DEVICENAME}: usb device is mass storage"
i=0
m=0

USBID=$(echo ${DEVICENAME} | awk -F: '{print $1}')
USBSYS=/sys/bus/usb/devices/${USBID}
RUN=/var/run/usb

[ -d ${RUN} ] || mkdir -p ${RUN}

PID=$$

while [ $i -le 15 ]; do
	i=$(($i+1))
	cd /sys${DEVPATH}
	BLK=$(find /sys${DEVPATH}/host* -type d -name 'sda' -o -name 'sdb' 2>/dev/null)
	[ -n "${BLK}" ] && {
		logger -t ${TAG} "Have some block devices: ${BLK}"
		for blk in ${BLK}; do
			logger -t ${TAG} "Investigate ${blk}"
			cd ${blk}
			sleep 2
			#ls /dev/ > /tmp/d
			nodes=$(find sd* -type d 2>/dev/null| grep -v "/")
			[ -n "${nodes}" ] && logger -t ${TAG} "Found device nodes: ${nodes}"
			[ -n "${nodes}" ] ||{
				do_mount ${blk##*block:} c
				exit 0
			}
			for node in ${nodes}; do
				m=$(($m+1))
				#TODO busybox not include fdisk yet
				if [ -e /sbin/fdisk ]; then
					# The second parameter from fdisk (*) is optional - remove it with sed
					#fdisk -l > /tmp/fdisk-l-$node
					partition_id=$(/sbin/fdisk -l | grep $node | sed -e 's/*/ /g' | awk '{print $5}' | tr -c -d '0-9a-f')
					if [ -n "${partition_id}" ]; then
						logger -t ${TAG} "Partition ID is [${partition_id}]"
						do_mount $node $partition_id
					else
						logger -t ${TAG} "Unable to get partition ID"
						m=$(($m-1))
					fi
				else
					# defaults to FAT file system
					do_mount $node c
				fi
			done
		done
		if [ $m -gt 0 ]; then
			logger -t ${TAG} "Did $m mount attempt(s)"
			exit 0
		fi
	}
	logger -t ${TAG} "waiting on usb drive ${DEVICENAME}: $i ..."
	sleep 2
done
logger -t ${TAG} "No (new) block devices mounted"
