#! /bin/sh
# Autodetection script for scanning /sys for hardware
# for Archlinux by Tobias Powalowski <tpowa@archlinux.org>
usage () {
	echo "$0 [options]"
	echo ""
	echo " This is a tool that detects/lists modules that are exported by /sys"
	echo ""
	echo "  Options:"
	echo "    --kernel_version=      use kernel version (no autodetect)"
	echo "    --ide-legacy           use old ide modules instead of pata"
	echo "    --load-modules         load all detected modules"
	echo "    --unload-modules       unload all detected modules"
	echo "    --show-modules         show all detected modules"
	echo "    --show-modules-order   shows load order of detected modules"
	echo "    --show-agp             show AGP modules"
	echo "    --show-acpi            show ACPI modules"	
	echo "    --show-ide             show IDE modules"
	echo "    --show-pata            show PATA modules"
	echo "    --show-scsi            show SCSI modules"
	echo "    --show-sata            show SATA modules"
	echo "    --show-usb             show USB modules"
	echo "    --show-fw              show FIREWIRE modules"
	echo "    --show-net             show NETWORK modules"
	echo "    --show-input           show INPUT modules"
	echo "    --show-irda            show IRDA modules"
	echo "    --show-isdn            show ISDN modules"
	echo "    --show-pcmcia          show PCMCIA modules"
	echo "    --show-sound           show SOUND modules"
	echo "    --show-staging         show STAGING modules"
	echo "    --show-video           show VIDEO modules"
	echo "    --show-other           show OTHER modules"
	echo ""
	echo "  For /etc/mkinitcpio.conf use:"
	echo "    --filesystem           add filesystems to MODULES="
	echo "    --hostcontroller       show MODULES= for all hostcontrollers"
	echo "    --vmware               add BusLogic to MODULES for vmware"
	echo "    --ati-kms              add ati kernel mode setting" 
	echo "    --intel-kms            add intel kernel mode setting"
	echo "    --nvidia-kms           add nvidia kernel mode setting"
        echo "" 
	echo "    --rootdevice=          autodetected advanced features of rootdevice"
	echo "    --hooks-dir=           use this directory for HOOKS check"
	echo "    --advanced             show autodetected advanced HOOKS"
	echo "    --hooks                show HOOKS="
	echo "    --dmraid               add dmraid to HOOKS="
	echo "    --keymap               add keymap to HOOKS="
	echo "    --usb                  add usb to HOOKS="
	echo "    --usbinput             add usbinput to HOOKS="
	echo "    --fw                   add fw to HOOKS="
	echo "    --pcmcia               add pcmcia to HOOKS="
	echo "    --nfs                  add net to HOOKS="
	echo "    --btrfs                add btrfs to HOOKS="
	echo ""
	echo "  For /etc/rc.conf use:"
	echo "    --net                  show network MODULES"
	echo "    --sound                show sound MODULES"
	echo "    --usbhost              show usb hostcontroller MODULES"
	echo "    --modules              show all detected MODULES"
	echo ""
	exit 1
}

[ "$1" = "" ]       && usage
[ "$1" = "--help" ] && usage
[ "$1" = "-h" ]     && usage

# setting kernel version
case $1 in
	--kernel_version=*)
	KERNEL_VERSION="$(echo $1 | awk -F= '{print $2;}')"
	;;
	--rootdevice=*)
	ROOTDEVICE="$(echo $1 | awk -F= '{print $2;}')"
	;;
esac

if [ "$KERNEL_VERSION" = "" ]; then
	KERNEL_VERSION="$(uname -r)"
fi

# IDE/PATA switch
[ "$(echo $* | grep '\-ide-legacy')" ] && IDE_LEGACY=1

# uvesafb switch
[ "$(echo $* | grep '\-uvesafb')" ] && UVESAFB=1

# dmraid switch
[ "$(echo $* | grep '\-dmraid')" ] && DMRAID=1

# keymap switch
[ "$(echo $* | grep '\-keymap')" ] && KEYMAP=1

# usb switch
[ "$(echo $* | grep '\-usb ')" ] && USB=1

# usbinput switch
[ "$(echo $* | grep '\-usbinput')" ] && USBINPUT=1

# fw switch
[ "$(echo $* | grep '\-fw')" ] && FW=1

# pcmcia switch
[ "$(echo $* | grep '\-pcmcia')" ] && PCMCIA=1

# nfs switch
[ "$(echo $* | grep '\-nfs')" ] && NFS=1

# nfs switch
[ "$(echo $* | grep '\-btrfs')" ] && BTRFS=1

# vmware switch
[ "$(echo $* | grep '\-vmware')" ] && VMWARE=1

# vmware switch
[ "$(echo $* | grep '\-hooks')" ] && HOOKS=1

ADVANCED=""
# root device check
if ! [ "$ROOTDEVICE" = "" ]; then
        # check device mapper devices
	if [ "$(echo "$ROOTDEVICE" | grep "/dev/mapper")" ]; then
		# check if encryption is used
		if [ "$(cryptsetup status $ROOTDEVICE 2>/dev/null)" ]; then
			ADVANCED="encrypt"
			# check on lvm
			realdevice="$(cryptsetup status $ROOTDEVICE 2>/dev/null | grep "device:.*/dev/mapper/" | sed -e 's#.*\ ##g')"
			if [ "$(lvs $realdevice 2>/dev/null)" ]; then
				ADVANCED="lvm2 encrypt"
				vg="$(echo $(lvs -o vg_name --noheading $realdevice))"
				# check on raid
				[ "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/md")" ] && ADVANCED="mdadm lvm2 encrypt"
			fi
			# check on raid
			if [ "$(cryptsetup status $ROOTDEVICE 2>/dev/null | grep "device:.*/dev/md" | sed -e 's#.*\ ##g')" ]; then
				ADVANCED="mdadm encrypt"
				realdevice="$(cryptsetup status $ROOTDEVICE 2>/dev/null | grep "device:.*/dev/md" | sed -e 's#.*\ ##g')"
				# check on lvm
				[ "$(mdadm --detail $realdevice | grep "/dev/dm-")" ] && ADVANCED="lvm2 mdadm encrypt"
			fi
		fi
		# check if lvm is used
		if [ "$(lvs $ROOTDEVICE 2>/dev/null)" ]; then
			ADVANCED="lvm2"
			vg="$(echo $(lvs -o vg_name --noheading $ROOTDEVICE))"
			# check on encrypt
			if [ "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/dm-")" ]; then 
				ADVANCED="encrypt lvm2"
				# check on raid
				[ "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/md")" ] && ADVANCED="mdadm encrypt lvm2"
				for i in "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/dm-")"; do
					realdevice="$(echo $i | cut -d ' ' -f1)"
					#getsymlink="$(readlink $realdevice)"
					#correctdevice="$(echo $getsymlink | sed -e 's#\.\.#/dev#g')"
					[ "$(cryptsetup status $realdevice 2>/dev/null | grep "device:.*/dev/md")" ] && ADVANCED="mdadm encrypt lvm2"
				done
			fi
			# check on raid
			if [ "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/md")" ]; then
				ADVANCED="mdadm lvm2"
				#check on encrypt
				[ "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/dm-")" ] && ADVANCED="encrypt mdadm lvm2"
				for i in "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/md")"; do
					realdevice="$(echo $i | cut -d ' ' -f1)"
					[ "$(mdadm --detail $realdevice | grep "/dev/dm-")" ] && ADVANCED="encrypt mdadm lvm2"
				done
			fi
		fi
	fi
	# check md device
	if [ "$(echo "$ROOTDEVICE" | grep "/dev/md")" ]; then
		ADVANCED="mdadm"
		# raid partitions or raid?
		if [ "$(echo "$ROOTDEVICE" | grep "/dev/md*p")" ]; then
			realdevice="$(echo $ROOTDEVICE | sed -e 's#p.*##g' -e 's#/dev/##g')"
			if ! [ "$(find /sys/block/$realdevice/slaves/ -name 'dm*' 2>/dev/null)" = "" ]; then
				SET_LVM=""
				SET_ENCRYPT=""
				for k in $(find /sys/block/$realdevice/slaves/ -name 'dm*' 2>/dev/null); do
					[ "$(lvs /dev/mapper/$(cat $k/dm/name) 2>/dev/null)" ] && SET_LVM="1"
					[ "$(cryptsetup status $(cat $k/dm/name) 2>/dev/null)" ] && SET_ENCRYPT="1"
					# check on lvm
					[ "$(lvs /dev/mapper/$(cat $k/dm/name) 2>/dev/null)" ] && ADVANCED="lvm2 mdadm"
					# check on encrypt
					[ "$(cryptsetup status $(cat $k/dm/name) 2>/dev/null)" ] && ADVANCED="encrypt mdadm"
					# check encrypted volume device
					realdevice="$(cryptsetup status $(cat $k/dm/name) 2>/dev/null | grep "device:.*/dev/mapper/" | sed -e 's#.*\ ##g')"
					[ "$(lvs $realdevice 2>/dev/null)" ] && ADVANCED="lvm2 encrypt mdadm"
					vg="$(echo $(lvs -o vg_name --noheading /dev/mapper/$(cat $k/dm/name) 2>/dev/null))"
					[ "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/dm-")" ] && ADVANCED="encrypt lvm2 mdadm"
				done
				[ "$SET_LVM" = "1" -a "$SET_ENCRYPT" = "1" ] && ADVANCED="lvm2 encrypt mdadm"
			fi
		else
			realdevice="$(echo $ROOTDEVICE | sed -e 's#/dev/##g')"
			if ! [ "$(find /sys/block/$realdevice/slaves/ -name 'dm*' 2>/dev/null)" = "" ]; then
				SET_LVM=""
				SET_ENCRYPT=""
				for k in $(find /sys/block/$realdevice/slaves/ -name 'dm*' 2>/dev/null); do
					[ "$(lvs /dev/mapper/$(cat $k/dm/name) 2>/dev/null)" ] && SET_LVM="1"
					[ "$(cryptsetup status $(cat $k/dm/name) 2>/dev/null)" ] && SET_ENCRYPT="1"
					# check on lvm
					[ "$(lvs /dev/mapper/$(cat $k/dm/name) 2>/dev/null)" ] && ADVANCED="lvm2 mdadm"
					# check on encrypt
					[ "$(cryptsetup status $(cat $k/dm/name) 2>/dev/null)" ] && ADVANCED="encrypt mdadm"
					# check encrypted volume device
					realdevice="$(cryptsetup status $(cat $k/dm/name) 2>/dev/null | grep "device:.*/dev/mapper/" | sed -e 's#.*\ ##g')"
					[ "$(lvs $realdevice 2>/dev/null)" ] && ADVANCED="lvm2 encrypt mdadm"
					vg="$(echo $(lvs -o vg_name --noheading /dev/mapper/$(cat $k/dm/name) 2>/dev/null))"
					[ "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/dm-")" ] && ADVANCED="encrypt lvm2 mdadm"
				done
				[ "$SET_LVM" = "1" -a "$SET_ENCRYPT" = "1" ] && ADVANCED="lvm2 encrypt mdadm"
			fi
		fi
	fi
fi

# checking /sys
if ! [ -d /sys/ ]; then
	echo "/sys/ is not present -- mount /sys first" >&2
	exit 1
fi

: >/tmp/modules-plain
: >/tmp/modules-stripped
: >/tmp/modules-sorted
: >/tmp/moduleslist
: >/tmp/.blkid

# generate blkid
/sbin/blkid -c /dev/null -s TYPE > /tmp/.blkid

# find pci aliases
aliases=$(find /sys/ -noleaf -name modalias  -exec cat {} +)

# check for empty aliases
if [ "$aliases" = "" ]; then
	echo "hwdetect aborted -- you need a kernel >= 2.6.12" >&2
	exit 1
fi

# generate files for the different actions
modprobe -i -a --set-version=$KERNEL_VERSION --show-depends $aliases >> /tmp/modules-plain 2>/dev/null

# fix ide cdrom detection on proliant 1600
if [ "$(echo $aliases | grep 'pci:v00000E11d00000001sv00000000sd00000000bc06sc02i00')" ]; then
	modprobe -i --set-version=$KERNEL_VERSION --show-depends ide-generic >> /tmp/modules-plain 2>/dev/null
fi

# find PNP devices like parports, soundcards etc.
#   (workaround for rtc, pcspkr, irtty-sir and analog are included)
if [ "$(find /sys/devices -noleaf -name 'id' | grep /pnp)" ]; then
	for i in $(find /sys/devices -noleaf -name "id" | grep /pnp); do
		devid=$(cat $i | grep PNP)
		[ "$devid" ] || continue
	
		modprobe -i --set-version=$KERNEL_VERSION --show-depends pnp:d${devid} >> /tmp/modules-plain 2>/dev/null
	
		[ "$devid" = "PNP0800" ] && modprobe -i --set-version=$KERNEL_VERSION --show-depends pcspkr >> /tmp/modules-plain  2>/dev/null
		[ "$devid" = "PNP0b00" ] && modprobe -i --set-version=$KERNEL_VERSION --show-depends rtc_proc >> /tmp/modules-plain  2>/dev/null
		[ "$devid" = "PNP0b00" ] && modprobe -i --set-version=$KERNEL_VERSION --show-depends rtc_sysfs >> /tmp/modules-plain 2>/dev/null
		[ "$devid" = "PNP0b00" ] && modprobe -i --set-version=$KERNEL_VERSION --show-depends rtc_dev >> /tmp/modules-plain 2>/dev/null
		[ "$devid" = "PNP0510" ] && modprobe -i --set-version=$KERNEL_VERSION --show-depends irtty-sir >> /tmp/modules-plain 2>/dev/null
		[ "$devid" = "PNP0511" ] && modprobe -i --set-version=$KERNEL_VERSION --show-depends irtty-sir >> /tmp/modules-plain 2>/dev/null
		[ "$devid" = "PNPb02f" ] && modprobe -i --set-version=$KERNEL_VERSION --show-depends analog >> /tmp/modules-plain 2>/dev/null

		# load ppp-generic if serial ports are detected for modems
		[ "$devid" = "PNP0501" ] && modprobe -i --set-version=$KERNEL_VERSION --show-depends ppp-generic >> /tmp/modules-plain 2>/dev/null
	done
fi

# SCSI disks/cdroms/tapes/generic devices
if [ "$(find /sys/devices -noleaf -name 'type')" ]; then
	for i in $(cat $(find /sys/devices -noleaf -name "type")); do
		case $i in (4|5)       modprobe -i --set-version=$KERNEL_VERSION --show-depends sr_mod >> /tmp/modules-plain 2>/dev/null ;; esac
		case $i in (2|3|6|8|9) modprobe -i --set-version=$KERNEL_VERSION --show-depends sg >> /tmp/modules-plain 2>/dev/null ;; esac
		case $i in (0|7|14)    modprobe -i --set-version=$KERNEL_VERSION --show-depends sd_mod >> /tmp/modules-plain 2>/dev/null ;; esac
		case $i in (1)         modprobe -i --set-version=$KERNEL_VERSION --show-depends st >> /tmp/modules-plain 2>/dev/null ;; esac
	done
fi

# add Buslogic for vmware
if [ "$VMWARE" = "1" ]; then
	 modprobe -i --set-version=$KERNEL_VERSION --show-depends BusLogic >> /tmp/modules-plain 2>/dev/null
fi

# Parport modules
if [ "$(grep 'parport' /tmp/modules-plain)" ]; then
	modprobe -i --set-version=$KERNEL_VERSION --show-depends lp >> /tmp/modules-plain 2>/dev/null
	modprobe -i --set-version=$KERNEL_VERSION --show-depends ppdev >> /tmp/modules-plain 2>/dev/null
fi

# Sound OSS compat modules
if [ "$(grep 'snd-pcm' /tmp/modules-plain)" ]; then
	modprobe -i --set-version=$KERNEL_VERSION --show-depends snd-pcm-oss >> /tmp/modules-plain 2>/dev/null
fi
if [ "$(grep 'snd-seq' /tmp/modules-plain)" ]; then
	modprobe -i --set-version=$KERNEL_VERSION --show-depends snd-seq-oss >> /tmp/modules-plain 2>/dev/null
fi

sort -u /tmp/modules-plain >> /tmp/modules-stripped

# OTHER modules loading first for speed up!
grep -v "ide/" /tmp/modules-stripped | grep -v "scsi/" | grep -v "fusion/" | grep -v "block/sx8" | grep -v "message/fusion" | \
	grep -v  "block/cciss" | grep -v "block/cpqarray" | grep -v "block/DAC960" | grep -v "block/virtio" | grep -v "ata/" | \
	grep -v "net/" | grep -v "pcmcia/" | grep -v "usb/" | \
	grep -v "firewire" | grep -v "ieee1394/" | grep -v "usbhid/" | grep -v "staging/" | grep -v "wireless/" | grep -v "virtio_pci" >> /tmp/modules-sorted
# load virtio first!
grep "virtio_pci" /tmp/modules-stripped  >> /tmp/modules-sorted
# make a correct order for the modules, internal devices have priority!
# only use old ide modules if boot parameter 'ide-legacy' is given
if [ "$IDE_LEGACY" = "1" ]; then
	grep "ide/" /tmp/modules-stripped  | grep -v "ide-pci-generic" >> /tmp/modules-sorted
else
	grep "ata/pata" /tmp/modules-stripped | grep -v "pata_acpi" >> /tmp/modules-sorted
fi
grep "scsi/" /tmp/modules-stripped  | grep -v "sd_mod" | grep -v "sr_mod" | grep -v "/sg.ko" | grep -v "/st.ko" >> /tmp/modules-sorted
grep "block/" /tmp/modules-stripped | grep -v "virtio_blk" | grep -v "sx8" | grep -v "nbd" | grep -v "pktcdvd" | grep -v "floppy" >> /tmp/modules-sorted
grep "fusion/" /tmp/modules-stripped >> /tmp/modules-sorted
grep "ata/"  /tmp/modules-stripped| grep -v "pata" | grep -v "ata_generic" | grep -v "libata" >> /tmp/modules-sorted
grep "block/" /tmp/modules-stripped | grep "sx8" >> /tmp/modules-sorted
grep "net/" /tmp/modules-stripped | grep -v "wireless/" | grep -v "usb/" >> /tmp/modules-sorted
grep "wireless/" /tmp/modules-stripped >> /tmp/modules-sorted
grep "staging/" /tmp/modules-stripped >> /tmp/modules-sorted
grep "pcmcia/" /tmp/modules-stripped >> /tmp/modules-sorted

# speed up usb module loading
grep "usb-storage" /tmp/modules-stripped >> /tmp/modules-sorted
grep "usblp" /tmp/modules-stripped >> /tmp/modules-sorted
grep "usbhid" /tmp/modules-stripped >> /tmp/modules-sorted
grep "usb/" /tmp/modules-stripped | grep -v "usb-storage" | grep -v "usbhid" | grep -v "usblp" >> /tmp/modules-sorted
grep "firewire/" /tmp/modules-stripped >> /tmp/modules-sorted
grep "ieee1394/" /tmp/modules-stripped >> /tmp/modules-sorted

# add scsi and virtio device modules at the end
grep "virtio_blk" /tmp/modules-stripped >> /tmp/modules-sorted
grep "sd_mod" /tmp/modules-stripped >> /tmp/modules-sorted
grep "sr_mod" /tmp/modules-stripped >> /tmp/modules-sorted
grep "/st.ko" /tmp/modules-stripped >> /tmp/modules-sorted
grep "/sg.ko" /tmp/modules-stripped >> /tmp/modules-sorted


sed -ne "s#^insmod.*/\(.*\)\.ko.*#\1#p" /tmp/modules-sorted >> /tmp/moduleslist

listmods() {
	key=$1 ; shift
	ex=
	while [ "$1" ]; do
		[ "$ex" ] && ex="$ex|$1" || ex="$1"
		shift
	done
	for ln in $(grep "$key" /tmp/modules-sorted | sed 's|^insmod ||g'); do
		if [ "$ex" ]; then
			echo $ln | egrep -v "$ex" | sed -ne "s#^/.*/\(.*\)\.ko.*#\1#p"
		else
			echo $ln | sed -ne "s#^/.*/\(.*\)\.ko.*#\1#p"
		fi
	done
}
showlist() {
	cat=$1 ; shift
	[ $# -gt 0 ] || return
	echo -n "$cat: "
	for i in $*; do echo -n "$i "; done
	echo ""
}

showlist2() {
	cat=$1 ; shift
	[ $# -gt 0 ] || return
	echo -n "$cat="
	for i in $*; do echo -n "$i "; done
	echo ""
}

showlist3() {
	cat=$1 ; shift
	[ $# -gt 0 ] || return
	for i in $*; do echo -n "$i "; done
	echo ""
}

# starting different actions
while [ $# -gt 0 ]; do
	case $1 in
		-hooks-dir=*|--hooks-dir=*)
			HOOKS_DIR="$(echo $1 | awk -F= '{print $2;}')"
			 ;;
		--load-modules)
			# load all detected pci modules
			for i in $(cat /tmp/moduleslist); do
				if [ -e /lib/udev/load-modules.sh ]; then 
					/lib/udev/load-modules.sh $i > /dev/null 2>&1
				else
					modprobe $i > /dev/null 2>&1
				fi
			done
			;;

		--unload-modules)
			# load all detected pci modules
			for i in $(cat /tmp/moduleslist); do
				modprobe -r $i > /dev/null 2>&1
			done
			;;

		--show-modules)
			showlist "AGP    " $(listmods agp/)
			showlist "ACPI   " $(listmods acpi/)
			showlist "IDE    " $(listmods ide/ ide-)
			showlist "PATA   " $(listmods ata/pata pata_acpi) $(listmods ata/ata_piix)
			showlist "SCSI   " $(listmods virtio/virtio_pci) $(listmods scsi/) $(listmods message/fusion/) $(listmods drivers/block/ nbd pktcdvd sx8 floppy)
			showlist "SATA   " $(listmods ata/ pata ata_generic) $(listmods drivers/block/sx8)
			showlist "USB    " $(listmods usb/ usb/input)
			showlist "FW     " $(listmods firewire/) $(listmods ieee1394/)
			showlist "NET    " $(listmods net/ irda/)
			showlist "INPUT  " $(listmods input/ pcspkr) $(listmods hid/)
			showlist "IRDA   " $(listmods irda/)
			showlist "ISDN   " $(listmods isdn/)
			showlist "PCMCIA " $(listmods pcmcia/)
			showlist "SOUND  " $(listmods pcspkr) $(listmods sound/)
			showlist "STAGING" $(listmods staging/)
			showlist "VIDEO  " $(listmods video/)
			showlist "OTHER  " $(listmods modules/ agp/ acpi/ ide/ scsi/ message/fusion block/sx8 block/cciss block/cpqarray block/DAC960 block/virtio virtio/virtio_pci ata/ usb/ ieee1394 net/ isdn/ input/ irda/ pcmcia/ sound/ video/ firewire/ hid/ staging/)
			;;

		--show-modules-order)
			showlist "MODULES ORDER" $(listmods modules/)
			;;

		--show-agp)    showlist "AGP    " $(listmods agp/) ;;
		--show-acpi)   showlist "ACPI   " $(listmods acpi/) ;;
		--show-ide)    showlist "IDE    " $(listmods ide/ ide-) ;;
		--show-pata)   showlist "PATA   " $(listmods ata/pata pata_acpi) $(listmods ata/ata_piix) ;;
		--show-scsi)   showlist "SCSI   " $(listmods virtio/virtio_pci) $(listmods scsi/) $(listmods message/fusion/) $(listmods drivers/block/ nbd pktcdvd sx8 floppy) ;;
		--show-sata)   showlist "SATA   " $(listmods ata/ pata ata_generic) $(listmods drivers/block/sx8) ;;
		--show-usb)    showlist "USB    " $(listmods usb/ usb/input) ;;
		--show-fw)     showlist "FW     " $(listmods firewire/) $(listmods ieee1394/) ;;
		--show-net)    showlist "NET    " $(listmods net/ irda/) ;;
		--show-input)  showlist "INPUT  " $(listmods input/ pcspkr) $(listmods hid/) ;;
		--show-irda)   showlist "IRDA   " $(listmods irda/) ;;
		--show-isdn)   showlist "ISDN   " $(listmods isdn/) ;;
		--show-pcmcia) showlist "PCMCIA " $(listmods pcmcia/) ;;
		--show-sound)  showlist "SOUND  " $(listmods pcspkr) $(listmods sound/) ;;
		--show-staging) showlist "STAGING" $(listmods staging/) ;;
		--show-video)  showlist "VIDEO  " $(listmods video/) ;;
		--show-other)  showlist "OTHER  " $(listmods .ko agp/ acpi/ ide/ scsi/ message/fusion block/sx8 block/cciss block/cpqarray block/DAC960 block/virtio virtio/virtio_pci ata/ usb/ ieee1394 net/ isdn/ input/ irda/ pcmcia/ sound/ video/ firewire/ hid/ staging/) ;;
		--filesystem)   FILESYSTEM="ext2 ext3 ext4 nilfs2 btrfs reiserfs xfs jfs vfat"
				for i in $FILESYSTEM; do
					 [ "$(grep $i /tmp/.blkid)" ] && FS="$FS $i"
				done
				[ "$(echo $FS | grep btrfs)" ] && FS="$FS crc32c"
				MODULES_INITRAMFS="$MODULES_INITRAMFS $FS"
				showlist2 "MODULES" \"$MODULES_INITRAMFS\" | sed -e 's/(\  /(/g' -e 's/"\ /"/g' -e 's/\ "/"/g' -e 's/\ \ /\ /g'
				;;
		--hostcontroller)HOSTCONTROLLER="$(listmods virtio/virtio_pci) $(listmods ide/ ide-) $(listmods ata/pata pata_acpi) $(listmods scsi/ /sg.ko /st.ko scsi_mod sr_mod sd_mod) $(listmods message/fusion/) $(listmods drivers/block/ virtio_blk nbd pktcdvd sx8 floppy) $(listmods ata/ pata ata_generic) $(listmods drivers/block/sx8) $(listmods ehci-hcd) $(listmods uhci-hcd) $(listmods ohci-hcd) $(listmods virtio_blk)"
				 MODULES_INITRAMFS="$MODULES_INITRAMFS $HOSTCONTROLLER"
				 showlist2 "MODULES" \"$MODULES_INITRAMFS\" | sed -e 's/(\  /(/g' -e 's/"\ /"/g' -e 's/\ "/"/g' -e 's/\ \ /\ /g'
				 ;;
		--ati-kms) 	KMS="radeon"
				MODULES_INITRAMFS="$KMS $MODULES_INITRAMFS"
				showlist2 "MODULES" \"$MODULES_INITRAMFS\" | sed -e 's/(\  /(/g' -e 's/"\ /"/g' -e 's/\ "/"/g' -e 's/\ \ /\ /g'
				;;
		--intel-kms) 	KMS="i915"
				MODULES_INITRAMFS="$KMS $MODULES_INITRAMFS"
				showlist2 "MODULES" \"$MODULES_INITRAMFS\" | sed -e 's/(\  /(/g' -e 's/"\ /"/g' -e 's/\ "/"/g' -e 's/\ \ /\ /g'
				;;
		--nvidia-kms) 	KMS="nouveau"
				MODULES_INITRAMFS="$KMS $MODULES_INITRAMFS"
				showlist2 "MODULES" \"$MODULES_INITRAMFS\" | sed -e 's/(\  /(/g' -e 's/"\ /"/g' -e 's/\ "/"/g' -e 's/\ \ /\ /g'
				;;
		--uvesafb) 	FB="uvesafb"
				MODULES_INITRAMFS="$FB $MODULES_INITRAMFS"
				! [ "$HOOKS" = "1" ] && showlist2 "MODULES" \"$MODULES_INITRAMFS\" | sed -e 's/(\  /(/g' -e 's/"\ /"/g' -e 's/\ "/"/g' -e 's/\ \ /\ /g'
				;;
		--fbmodule) 	FB=""
				for i in $(cat /etc/modprobe.d/framebuffer_blacklist.conf); do
				    i=$(echo $i | sed -e 's/blacklist //g')
				    # check if already in FB array, to avoid double entries
				    if [ "$(cat /proc/modules | grep ^$i)" ]; then
					! [ "$(grep -w $FB)" ] && FB="$i"
				    fi
                                done
				MODULES_INITRAMFS="$FB $MODULES_INITRAMFS "
				! [ "$HOOKS" = "1" ] && showlist2 "MODULES" \"$MODULES_INITRAMFS\" | sed -e 's/(\  /(/g' -e 's/"\ /"/g' -e 's/\ "/"/g' -e 's/\ \ /\ /g'
				;;
		--net)  if [ "$(showlist2 "MODULES"  \($(listmods drivers/net/ irda ppp_generic slhc) $(listmods drivers/usb/net/) $(listmods drivers/staging/) \) | sed -e 's/(\ /(/g' -e 's/\ )/)/g' -e 's/\ \ /\ /g' | grep '8139cp')" ] ; then
				if [ "$(dmesg | grep 'use 8139too')" ]; then
					MODULES_EXPORTED="$MODULES_EXPORTED $(listmods drivers/net/ irda ppp_generic slhc) $(listmods drivers/usb/net/) $(listmods drivers/staging/)"
					MODULES_EXPORTED="$(echo $MODULES_EXPORTED | sed -e 's/8139cp//g')"
					BLACKLIST_UDEV="!8139cp"
					for i in $MODULES_EXPORTED; do
						BLACKLIST_UDEV="$BLACKLIST_UDEV !$i"
					done
					showlist2 "MODULES"  \($BLACKLIST_UDEV $MODULES_EXPORTED\) | sed -e 's/(\  /(/g' -e 's/(\ /(/g' -e 's/\ )/)/g' -e 's/\ \ /\ /g'
				else
					MODULES_EXPORTED="$MODULES_EXPORTED $(listmods drivers/net/ irda ppp_generic slhc) $(listmods drivers/usb/net/) $(listmods drivers/staging/)"
					MODULES_EXPORTED="$(echo $MODULES_EXPORTED | sed -e 's/8139too//g')"
					BLACKLIST_UDEV="!8139too"
					for i in $MODULES_EXPORTED; do
						BLACKLIST_UDEV="$BLACKLIST_UDEV !$i"
					done
					showlist2 "MODULES"  \($BLACKLIST_UDEV $MODULES_EXPORTED\) | sed -e 's/(\  /(/g' -e 's/(\ /(/g' -e 's/\ )/)/g' -e 's/\ \ /\ /g'
				fi
			else
				MODULES_EXPORTED="$MODULES_EXPORTED $(listmods drivers/net/ irda ppp_generic slhc) $(listmods drivers/usb/net/) $(listmods drivers/staging/)"
				BLACKLIST_UDEV=""
				for i in $MODULES_EXPORTED; do
					BLACKLIST_UDEV="$BLACKLIST_UDEV !$i"
				done
				showlist2 "MODULES"  \($BLACKLIST_UDEV $MODULES_EXPORTED\) | sed -e 's/(\ /(/g' -e 's/\ )/)/g' -e 's/\ \ /\ /g'
			fi
			;;
		--sound) MODULES_EXPORTED="$MODULES_EXPORTED $(listmods pcspkr) $(listmods sound/)"
			 BLACKLIST_UDEV=""
			 for i in $MODULES_EXPORTED; do
				BLACKLIST_UDEV="$BLACKLIST_UDEV !$i"
			 done
			 showlist2 "MODULES" \($BLACKLIST_UDEV $MODULES_EXPORTED\) | sed -e 's/(\ /(/g' -e 's/\ )/)/g' -e 's/\ \ /\ /g'
			 ;;
		--usbhost) MODULES_EXPORTED="$MODULES_EXPORTED $(listmods ehci-hcd) $(listmods uhci-hcd) $(listmods ohci-hcd)"
			 BLACKLIST_UDEV=""
			 for i in $MODULES_EXPORTED; do
				BLACKLIST_UDEV="$BLACKLIST_UDEV !$i"
			 done
			 showlist2 "MODULES" \($BLACKLIST_UDEV $MODULES_EXPORTED\) | sed -e 's/(\ /(/g' -e 's/\ )/)/g' -e 's/\ \ /\ /g'
			 ;;
		--modules) showlist2 "MODULES" \($(listmods modules/)\) | sed -e 's/(\ /(/g' -e 's/\ )/)/g' -e 's/\ \ /\ /g'
			 ;;
		--hooks) 
			if [ "$HOOKS_DIR" = "" ]; then
				HOOKS_DIR="/lib/initcpio/install"
			fi
			START_HOOKS="base v86d udev keymap autodetect ide pata scsi sata usb fw pcmcia net dmraid usbinput $ADVANCED btrfs filesystems"
			# remove the ones that don't exist on the system
			for i in ${START_HOOKS}; do
				if ! [ -e "${HOOKS_DIR}/$i" ]; then 
					START_HOOKS=$(echo $START_HOOKS | sed -e "s/${i}\ //g")
				fi
			done
			# ide/pata check
			if [ "${IDE_LEGACY}" = "1" ]; then
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/pata//g")
			else
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/ide//g")
			fi
			if !  [ "$USBINPUT" = "1" ]; then
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/usbinput//g")
			fi
			if ! [ "$KEYMAP" = "1" ]; then 
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/keymap//g")
			fi
			if ! [ "$UVESAFB" = "1" ]; then 
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/v86d//g")
			fi
			if ! [ "$DMRAID" = "1" ]; then 
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/dmraid//g")
			fi
			if ! [ "$USB" = "1" ]; then
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/usb\ //g")
			fi
			if ! [ "$FW" = "1" ]; then
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/fw//g")
			fi
			if ! [ "$PCMCIA" = "1" ]; then
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/pcmcia//g")
			fi
			if ! [ "$NFS" = "1" ]; then
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/net//g")
			fi
			if ! [ "$BTRFS" = "1" ]; then
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/btrfs//g")
			fi
			echo "HOOKS=\"$START_HOOKS\"" | sed -e 's/"\ /"/g' -e 's/\ "/"/g' -e 's/\ \ /\ /g'
		;;
		--advanced) ADVANCED_ARCHBOOT=""
			    for i in $ADVANCED; do
				ADVANCED_ARCHBOOT="$ADVANCED_ARCHBOOT $(echo arch_$i)"
			    done
			    echo "$ADVANCED_ARCHBOOT"
			    ;;
	esac
	shift
done

# cleanup
rm /tmp/modules-plain
rm /tmp/modules-sorted
rm /tmp/modules-stripped
rm /tmp/moduleslist

# vim: set ts=2 sw=2 noet:
