aboutsummaryrefslogtreecommitdiffstats
path: root/package/base-files/files/lib/preinit/30_failsafe_wait
diff options
context:
space:
mode:
Diffstat (limited to 'package/base-files/files/lib/preinit/30_failsafe_wait')
-rw-r--r--package/base-files/files/lib/preinit/30_failsafe_wait85
1 files changed, 85 insertions, 0 deletions
diff --git a/package/base-files/files/lib/preinit/30_failsafe_wait b/package/base-files/files/lib/preinit/30_failsafe_wait
new file mode 100644
index 000000000..04dc57df2
--- /dev/null
+++ b/package/base-files/files/lib/preinit/30_failsafe_wait
@@ -0,0 +1,85 @@
+#!/bin/sh
+# Copyright (C) 2006-2010 OpenWrt.org
+# Copyright (C) 2010 Vertical Communications
+
+fs_wait_for_key () {
+ local timeout=$3
+ local timer
+ local do_failsafe
+ local keypress_true="$(mktemp)"
+ local keypress_wait="$(mktemp)"
+ local keypress_sec="$(mktemp)"
+ if [ -z "$keypress_wait" ]; then
+ keypress_wait=/tmp/.keypress_wait
+ touch $keypress_wait
+ fi
+ if [ -z "$keypress_true" ]; then
+ keypress_true=/tmp/.keypress_true
+ touch $keypress_true
+ fi
+ if [ -z "$keypress_sec" ]; then
+ keypress_sec=/tmp/.keypress_sec
+ touch $keypress_sec
+ fi
+
+ trap "echo 'true' >$keypress_true; lock -u $keypress_wait ; rm -f $keypress_wait" INT
+ trap "echo 'true' >$keypress_true; lock -u $keypress_wait ; rm -f $keypress_wait" USR1
+
+ [ -n "$timeout" ] || timeout=1
+ [ $timeout -ge 1 ] || timeout=1
+ timer=$timeout
+ lock $keypress_wait
+ {
+ while [ $timer -gt 0 ]; do
+ echo "$timer" >$keypress_sec
+ timer=$(($timer - 1))
+ sleep 1
+ done
+ lock -u $keypress_wait
+ rm -f $keypress_wait
+ } &
+
+ echo "Press the [$1] key and hit [enter] $2"
+ # if we're on the console we wait for input
+ {
+ while [ -r $keypress_wait ]; do
+ timer="$(cat $keypress_sec)"
+
+ [ -n "$timer" ] || timer=1
+ timer="${timer%%\ *}"
+ [ $timer -ge 1 ] || timer=1
+ do_failsafe=""
+ {
+ read -t "$timer" do_failsafe
+ if [ "$do_failsafe" = "$1" ]; then
+ echo "true" >$keypress_true
+ lock -u $keypress_wait
+ rm -f $keypress_wait
+ fi
+ }
+ done
+ }
+ lock -w $keypress_wait
+
+ trap - INT
+ trap - USR1
+
+ keypressed=1
+ [ "$(cat $keypress_true)" = "true" ] && keypressed=0
+ rm -f $keypress_true
+ rm -f $keypress_wait
+ rm -f $keypress_sec
+
+ return $keypressed
+}
+
+failsafe_wait() {
+ FAILSAFE=
+ pi_failsafe_net_message=true
+ preinit_net_echo "Please press button now to enter failsafe"
+ pi_failsafe_net_message=false
+ fs_wait_for_key f 'to enter failsafe mode' $fs_failsafe_wait_timeout && FAILSAFE=true && export FAILSAFE
+}
+
+boot_hook_add preinit_main failsafe_wait
+