#!/bin/sh
#
# Init file for configuring Qemu non-native binary formats
#
# Written by Dag Wieers <dag@wieers.com>
#
# chkconfig: 2345 35 98
# description: Qemu non-native binary formats

source /etc/rc.d/init.d/functions

RETVAL=0
prog="qemu"

start() {
	case "$(uname -m)" in
		(i386|i486|i586|i686|i86pc|BePC)
			cpu="i386";;
		("Power Macintosh"|ppc|ppc64)
			cpu="ppc";;
		(armv4l|armv5l)
			cpu="arm";;
	esac
	echo -n $"Registering non-native binary handler for Qemu"
	/sbin/modprobe binfmt_misc &>/dev/null
	if [ "$cpu" != "i386" -a -x "/usr/bin/qemu-i386" -a -d "/usr/qemu-i386" ]; then
		echo ':qemu-i386:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff\xff:/usr/bin/qemu-i386:' >/proc/sys/fs/binfmt_misc/register
		echo ':qemu-i486:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff\xff:/usr/bin/qemu-i386:' >/proc/sys/fs/binfmt_misc/register
	fi
	if [ "$cpu" != "arm" -a -x "/usr/bin/qemu-arm" -a -d "/usr/qemu-arm" ]; then
		echo ':qemu-arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff\xff:/usr/bin/qemu-arm:' >/proc/sys/fs/binfmt_misc/register
	fi
	if [ "$cpu" != "ppc" -a -x "/usr/bin/qemu-ppc" -a -d "/usr/qemu-ppc" ]; then
		echo ':ppc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff\xff:/usr/bin/qemu-ppc:' >/proc/sys/fs/binfmt_misc/register
	fi
	if [ "$cpu" != "sparc" -a -x "/usr/bin/qemu-sparc" -a -d "/usr/qemu-sparc" ]; then
		echo ':qemu-sparc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff\xff:$QEMU/qemu-sparc:' >/proc/sys/fs/binfmt_misc/register
	fi
	echo
}

stop() {
	echo -n $"Unregistering non-native binary handler for Qemu"
	for cpu in i386 i486 ppc arm sparc; do
		if [ -r "/proc/sys/fs/binfmt_misc/qemu-$cpu" ]; then
			echo "-1" >/proc/sys/fs/binfmt_misc/qemu-$cpu
		fi
	done
	echo
}

restart() {
	stop
	start
}

status() {
	if ls /proc/sys/fs/binfmt_misc/qemu-* &>/dev/null; then
		echo $"Qemu non-native binary format handlers registered."
		return 0
	else
		echo $"Qemu non-native binary format handlers not registered."
		return 1
	fi
}

case "$1" in
  start)
	start
	;;
  stop)
	stop
	;;
  restart|reload)
	restart
	;;
  condrestart)
	if status &>/dev/null; then
		restart
	fi
	;;
  status)
	status
	RETVAL=$?
	;;
  *)
	echo $"Usage: $prog {start|stop|restart|condrestart|status}"
	RETVAL=1
esac

exit $RETVAL
