# See ../COPYING for terms
# GLobals
-CMD=/lib/mkinit/cmd
-INITCTL=/dev/initctl
+COMMAND=boot
+TESTING=false
+if [ $$ == 1 ]; then
+ DAEMON=true
+else
+ DAEMON=false
+fi
+
PATH=/lib/mkinit/bin:/bin:/sbin:/usr/bin:/usr/sbin
export PATH
# Functions
function usage {
-cat - <<EOF
-usage: $0 [options] [command]
+ echo 'usage: '$0' [options] [command]'
+ echo
+ echo 'Options:'
+ echo ' -h,--help Print usage information'
+ echo ' -t,--test Fake all commands'
+ echo ' -d,--daemon For spawning stdin listener'
+ echo ''
+ echo 'Command:'
+ echo ' boot Execute boot-up procedures'
+ echo ' halt Execute shutdown procedures'
+ echo ' reload Re-execute init process'
+ echo ' mk <rule> Execute mk rule'
+ echo ' start|stop|restart|zap|status <service>'
+ echo ' Start,stop,restart,zap or query status of service'
+ echo ' eval <cmd> Execute command in mkinit process'
+ exit
+}
-Options:
- -h,--help Print usage information
- -t,--test Fake all commands
+# Handle arguments
+function doopts {
+ TMP=`getopt -n "$0" -o htd -l help,test,daemon -- "$@"`
+ [ $? != 0 ] &&
+ usage
+ eval set -- "$TMP"
-Command:
- boot Execute boot-up procedures
- halt Execute shutdown procedures
- reload Re-execute init process
- mk <rule> Execute mk rule
- start|stop|restart|zap|status <service>
- Start,stop,restart,zap or query status of service
- eval <cmd> Execute command in mkinit process
-EOF
-exit
+ # Parse options
+ while [ ! "$1" == "--" ]; do
+ case "$1" in
+ -h|--help ) usage ;;
+ -t|--test ) TESTING=true ;;
+ -d|--daemon ) DAEMON=true ;;
+ esac
+ shift
+ done
+ shift
+ if [ "$*" ]; then
+ COMMAND=($@)
+ fi
+
+ # Debugging output
+ if $TESTING; then
+ echo 'Options' 1>&2
+ echo ' TESTING:' $TESTING 1>&2
+ echo ' DAEMON:' $DAEMON 1>&2
+ echo ' COMMAND:' $COMMAND 1>&2
+ fi
}
+# Run mk on the init scripts
function runamk {
- [ "$TEST" ] && export P=true
+ if $TESTING; then
+ export P=echo
+ export MKINIT_STATE=/tmp/mkinit_state
+ mkdir -p $MKINIT_STATE
+ fi
/usr/lib/plan9/bin/mk \
-f /etc/init.mk \
-i -k "$@"
}
+# Process one command
function process {
- cmd="$1"
+ cmd=$1
shift
- args="$@"
+ echo mkinit -- running "$cmd" "$@"
case "$cmd" in
boot )
- echo
- echo "mkinit -- booting"
- runamk -a "$args"
+ runamk -a "$@"
;;
restart )
- if [ "$args" ]; then
- echo "mkinit -- restarting $args"
- runamk "$args-stop"
- runamk "$args-start"
+ if [ "$*" ]; then
+ runamk "$@"-stop ||
+ runamk "$@"-zap
+ runamk "$@"-start
fi
;;
start|stop|zap|status )
- if [ "$args" ]; then
- echo "mkinit -- ${cmd}ing $args"
- runamk "$args-$cmd"
- fi
- ;;
- mk|runlevel )
- if [ "$args" ]; then
- [ "$cmd" = mk ] &&
- echo "mkinit -- running mk cmd [$args]"
- [ "$cmd" = runlevel ] &&
- echo "mkinit -- entering runlevel $args"
- runamk "$args"
+ if [ "$*" ]; then
+ runamk "$@-$cmd"
fi
;;
reload )
- echo "mkinit -- ${cmd}ing"
- exec $0 -r ${TEST:+"-t"}
+ $TESTING &&
+ opt=-t
+ exec $0 -r $opt
+ ;;
+ poweroff|reboot|kexec|halt)
+ ( runamk "$cmd" "$@" & )
;;
eval )
- eval $args
+ eval "$@"
;;
?* )
- echo "mkinit -- unknown command [$cmd $args]"
+ runamk "$cmd" "$@"
;;
esac
}
-# Handle arguments
-TEMP=`getopt -n "$0" \
- --options hrt \
- --longoptions help,reload,test \
- -- "$@"`
-[ $? != 0 ] && usage
-eval set -- "$TEMP"
-while true; do
- [ "$TEST" ] && echo "\$1=$1"
- case "$1" in
- -h|--help ) usage ;;
- -r|--reload ) RELOAD=true; shift ;;
- -t|--test ) TEST=true; shift ;;
- -- ) shift; cmd="$1";
- shift; args="$@";
- break ;;
- * ) ;;
- esac
-done
+# Process arguments
+doopts "$@"
-# Initial boot-up
-process $cmd $args
-
-if [ "$TEST" ]; then
- CMD=/tmp/pipe
- echo "Options"
- echo " test=$TEST"
- echo " reload=$RELOAD"
- echo " cmd=$cmd"
- echo " args=$args"
-fi
+# Run whatever was requested
+process "${COMMAND[@]}"
-if [ ! "$RELOAD" ]; then
- # Fork /dev/initctl listener
- initctld $INITCTL |
- while read line; do
- echo $line > $CMD
- done &
-
- # Fork console listener
- while read -e -p "mkinit> " line; do
- echo $line > $CMD
+# Fork console listener
+while $DAEMON; do
+ while read -ep "mkinit> " line; do
+ process $line
history -s $line
- done <&0 &
-fi
-
-# Kill listeners on exit
-trap "pkill -HUP -P $$ initctld" EXIT
-
-# Main loop
-while true; do
-while line=$(line); do
- process $line
-done < $CMD
+ done
+ $TESTING && exit
+ exec 0</dev/console 1>/dev/console 2>&1
+ echo "Respawning on /dev/console.."
+ sleep 1
done