1698 lines
32 KiB
Plaintext
1698 lines
32 KiB
Plaintext
|
#! /bin/sh
|
|||
|
#
|
|||
|
# This script is used to configure the borgware.
|
|||
|
#
|
|||
|
# It was derived from the Ethersex project.
|
|||
|
#
|
|||
|
# It was once derived from the Linux kernel's Menuconfig script.
|
|||
|
#
|
|||
|
# It uses a very modified/mutilated version of the "dialog" utility
|
|||
|
# written by Savio Lam (lam836@cs.cuhk.hk). Savio is not responsible
|
|||
|
# for this script or the version of dialog used by this script.
|
|||
|
# Please do not contact him with questions. The official version of
|
|||
|
# dialog is available at sunsite.unc.edu or a sunsite mirror.
|
|||
|
#
|
|||
|
|
|||
|
#
|
|||
|
# Change this to TRUE if you prefer all kernel options listed
|
|||
|
# in a single menu rather than the standard menu hierarchy.
|
|||
|
#
|
|||
|
single_menu_mode=
|
|||
|
|
|||
|
#
|
|||
|
# Make sure we're really running bash.
|
|||
|
#
|
|||
|
[ -z "$BASH" ] && { echo "Menuconfig requires bash" 1>&2; exit 1; }
|
|||
|
|
|||
|
#
|
|||
|
# Cache function definitions, turn off posix compliance
|
|||
|
#
|
|||
|
set -h +o posix
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# Given a configuration variable, set the global variable $x to its value,
|
|||
|
# and the global variable $info to the string " (NEW)" if this is a new
|
|||
|
# variable.
|
|||
|
#
|
|||
|
# This function looks for: (1) the current value, or (2) the default value
|
|||
|
# from the arch-dependent defconfig file, or (3) a default passed by the caller.
|
|||
|
|
|||
|
function set_x_info () {
|
|||
|
eval x=\$$1
|
|||
|
if [ -z "$x" ]; then
|
|||
|
eval `sed -n -e 's/# \(.*\) is not set.*/\1=n/' -e "/^$1=/p" arch/$ARCH/defconfig`
|
|||
|
eval x=\${$1:-\"$2\"}
|
|||
|
eval $1=$x
|
|||
|
eval INFO_$1="' (NEW)'"
|
|||
|
fi
|
|||
|
eval info=\"\$INFO_$1\"
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Load the functions used by the config.in files.
|
|||
|
#
|
|||
|
# I do this because these functions must be redefined depending
|
|||
|
# on whether they are being called for interactive use or for
|
|||
|
# saving a configuration to a file.
|
|||
|
#
|
|||
|
# Thank the heavens bash supports nesting function definitions.
|
|||
|
#
|
|||
|
load_functions () {
|
|||
|
|
|||
|
#
|
|||
|
# Additional comments
|
|||
|
#
|
|||
|
function comment () {
|
|||
|
comment_ctr=$[ comment_ctr + 1 ]
|
|||
|
echo -ne "': $comment_ctr' '--- $1' " >>MCmenu
|
|||
|
}
|
|||
|
|
|||
|
function impossible () {
|
|||
|
comment_ctr=$[ comment_ctr + 1 ]
|
|||
|
echo -ne "': $comment_ctr' '[-] $1' " >>MCmenu
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Define a boolean to a specific value.
|
|||
|
#
|
|||
|
function define_bool () {
|
|||
|
eval $1=$2
|
|||
|
}
|
|||
|
|
|||
|
function define_tristate () {
|
|||
|
eval $1=$2
|
|||
|
}
|
|||
|
|
|||
|
function define_hex () {
|
|||
|
eval $1=$2
|
|||
|
}
|
|||
|
|
|||
|
function define_int () {
|
|||
|
eval $1=$2
|
|||
|
}
|
|||
|
|
|||
|
function define_string () {
|
|||
|
eval $1=\"$2\"
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Create a boolean (Yes/No) function for our current menu
|
|||
|
# which calls our local bool function.
|
|||
|
#
|
|||
|
function bool () {
|
|||
|
set_x_info "$2" "n"
|
|||
|
|
|||
|
case $x in
|
|||
|
y|m) flag="*" ;;
|
|||
|
n) flag=" " ;;
|
|||
|
esac
|
|||
|
|
|||
|
echo -ne "'$2' '[$flag] $1$info' " >>MCmenu
|
|||
|
|
|||
|
echo -e "function $2 () { l_bool '$2' \"\$1\" ;}\n" >>MCradiolists
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Create a tristate (Yes/No/Module) radiolist function
|
|||
|
# which calls our local tristate function.
|
|||
|
#
|
|||
|
# Collapses to a boolean (Yes/No) if module support is disabled.
|
|||
|
#
|
|||
|
function tristate () {
|
|||
|
if [ "$CONFIG_MODULES" != "y" ]
|
|||
|
then
|
|||
|
bool "$1" "$2"
|
|||
|
else
|
|||
|
set_x_info "$2" "n"
|
|||
|
|
|||
|
case $x in
|
|||
|
y) flag="*" ;;
|
|||
|
m) flag="M" ;;
|
|||
|
*) flag=" " ;;
|
|||
|
esac
|
|||
|
|
|||
|
echo -ne "'$2' '<$flag> $1$info' " >>MCmenu
|
|||
|
|
|||
|
echo -e "
|
|||
|
function $2 () { l_tristate '$2' \"\$1\" ;}" >>MCradiolists
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Create a tristate radiolist function which is dependent on
|
|||
|
# another kernel configuration option.
|
|||
|
#
|
|||
|
# Quote from the original configure script:
|
|||
|
#
|
|||
|
# If the option we depend upon is a module,
|
|||
|
# then the only allowable options are M or N. If Y, then
|
|||
|
# this is a normal tristate. This is used in cases where modules
|
|||
|
# are nested, and one module requires the presence of something
|
|||
|
# else in the kernel.
|
|||
|
#
|
|||
|
function dep_tristate () {
|
|||
|
ques="$1"
|
|||
|
var="$2"
|
|||
|
dep=y
|
|||
|
shift 2
|
|||
|
while [ $# -gt 0 ]; do
|
|||
|
if [ "$1" = y ]; then
|
|||
|
shift
|
|||
|
elif [ "$1" = m ]; then
|
|||
|
dep=m
|
|||
|
shift
|
|||
|
else
|
|||
|
dep=n
|
|||
|
shift $#
|
|||
|
fi
|
|||
|
done
|
|||
|
if [ "$dep" = y ]; then
|
|||
|
tristate "$ques" "$var"
|
|||
|
elif [ "$dep" = m ]; then
|
|||
|
mod_bool "$ques" "$var"
|
|||
|
else
|
|||
|
define_tristate "$var" n
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Same as above, but now only Y and N are allowed as dependency
|
|||
|
# (i.e. third and next arguments).
|
|||
|
#
|
|||
|
function dep_bool () {
|
|||
|
ques="$1"
|
|||
|
var="$2"
|
|||
|
dep="$3"
|
|||
|
shift 2
|
|||
|
while [ $# -gt 0 ]; do
|
|||
|
if [ "$1" = y ]; then
|
|||
|
shift
|
|||
|
else
|
|||
|
dep=n
|
|||
|
shift $#
|
|||
|
fi
|
|||
|
done
|
|||
|
if [ "$dep" = y ]; then
|
|||
|
bool "$ques" "$var"
|
|||
|
else
|
|||
|
impossible "$ques"
|
|||
|
define_bool "$var" n
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
function dep_bool_menu () {
|
|||
|
ques="$1"; shift
|
|||
|
echo "haveMCmenu$1=y" >> MCradiolists
|
|||
|
dep_bool "$ques --->" $*
|
|||
|
}
|
|||
|
|
|||
|
function dep_mbool () {
|
|||
|
ques="$1"
|
|||
|
var="$2"
|
|||
|
dep=y
|
|||
|
shift 2
|
|||
|
while [ $# -gt 0 ]; do
|
|||
|
if [ "$1" = y -o "$1" = m ]; then
|
|||
|
shift
|
|||
|
else
|
|||
|
dep=n
|
|||
|
shift $#
|
|||
|
fi
|
|||
|
done
|
|||
|
if [ "$dep" = y ]; then
|
|||
|
bool "$ques" "$var"
|
|||
|
else
|
|||
|
define_bool "$var" n
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Add a menu item which will call our local int function.
|
|||
|
#
|
|||
|
function int () {
|
|||
|
set_x_info "$2" "$3"
|
|||
|
|
|||
|
echo -ne "'$2' '($x) $1$info' " >>MCmenu
|
|||
|
|
|||
|
echo -e "function $2 () { l_int '$1' '$2' '$3' '$x' ;}" >>MCradiolists
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Add a menu item which will call our local hex function.
|
|||
|
#
|
|||
|
function hex () {
|
|||
|
set_x_info "$2" "$3"
|
|||
|
x=${x##*[x,X]}
|
|||
|
|
|||
|
echo -ne "'$2' '($x) $1$info' " >>MCmenu
|
|||
|
|
|||
|
echo -e "function $2 () { l_hex '$1' '$2' '$3' '$x' ;}" >>MCradiolists
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Add a menu item which will call our local string function.
|
|||
|
#
|
|||
|
function string () {
|
|||
|
set_x_info "$2" "$3"
|
|||
|
|
|||
|
echo -ne "'$2' ' $1: \"$x\"$info' " >>MCmenu
|
|||
|
|
|||
|
echo -e "function $2 () { l_string '$1' '$2' '$3' '$x' ;}" >>MCradiolists
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Add a menu item which will call our local editor function.
|
|||
|
#
|
|||
|
function editor () {
|
|||
|
|
|||
|
echo -ne "'$2' ' Edit "$1"$info' " >>MCmenu
|
|||
|
|
|||
|
echo -e "function $2 () { l_editor '$1';}" >>MCradiolists
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Add a menu item which will call our local mac function.
|
|||
|
#
|
|||
|
function mac () {
|
|||
|
set_x_info "$2" "$3"
|
|||
|
|
|||
|
echo -ne "'$2' ' $1: \"$x\"$info' " >>MCmenu
|
|||
|
|
|||
|
echo -e "function $2 () { l_mac '$1' '$2' '$3' '$x' ;}" >>MCradiolists
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Add a menu item which will call our local ipv4 function.
|
|||
|
#
|
|||
|
function ipv4 () {
|
|||
|
set_x_info "$2" "$3"
|
|||
|
|
|||
|
echo -ne "'$2' ' $1: \"$x\"$info' " >>MCmenu
|
|||
|
|
|||
|
echo -e "function $2 () { l_ipv4 '$1' '$2' '$3' '$x' ;}" >>MCradiolists
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Add a menu item which will call our local ipv6 function.
|
|||
|
#
|
|||
|
function ipv6 () {
|
|||
|
set_x_info "$2" "$3"
|
|||
|
|
|||
|
echo -ne "'$2' ' $1: \"$x\"$info' " >>MCmenu
|
|||
|
|
|||
|
echo -e "function $2 () { l_ipv6 '$1' '$2' '$3' '$x' ;}" >>MCradiolists
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Add a menu item which will call our local One-of-Many choice list.
|
|||
|
#
|
|||
|
function choice () {
|
|||
|
#
|
|||
|
# Need to remember params cause they're gonna get reset.
|
|||
|
#
|
|||
|
title=$1
|
|||
|
choices=$2
|
|||
|
default=$3
|
|||
|
define_symbol=$4
|
|||
|
current=
|
|||
|
|
|||
|
#
|
|||
|
# Find out if one of the choices is already set.
|
|||
|
# If it's not then make it the default.
|
|||
|
#
|
|||
|
set -- $choices
|
|||
|
firstchoice=$2
|
|||
|
|
|||
|
|
|||
|
if [ -n "$define_symbol" ]
|
|||
|
then
|
|||
|
firstchoice=$define_symbol
|
|||
|
while [ -n "$2" ]
|
|||
|
do
|
|||
|
if eval [ \"_\$$define_symbol\" == \"_$2\" ]
|
|||
|
then
|
|||
|
current=$1
|
|||
|
break
|
|||
|
fi
|
|||
|
shift ; shift
|
|||
|
done
|
|||
|
else
|
|||
|
while [ -n "$2" ]
|
|||
|
do
|
|||
|
if eval [ \"_\$$2\" = \"_y\" ]
|
|||
|
then
|
|||
|
current=$1
|
|||
|
break
|
|||
|
fi
|
|||
|
shift ; shift
|
|||
|
done
|
|||
|
fi
|
|||
|
|
|||
|
: ${current:=$default}
|
|||
|
|
|||
|
echo -ne "'$firstchoice' '($current) $title' " >>MCmenu
|
|||
|
|
|||
|
echo -e "
|
|||
|
function $firstchoice () \
|
|||
|
{ l_choice '$title' \"$choices\" \"$current\" \"$define_symbol\" ;}" >>MCradiolists
|
|||
|
}
|
|||
|
|
|||
|
} # END load_functions()
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#
|
|||
|
# Extract available help for an option from Configure.help
|
|||
|
# and send it to standard output.
|
|||
|
#
|
|||
|
# Most of this function was borrowed from the original kernel
|
|||
|
# Configure script.
|
|||
|
#
|
|||
|
function extract_help () {
|
|||
|
if [ -f Documentation/Configure.help ]
|
|||
|
then
|
|||
|
#first escape regexp special characters in the argument:
|
|||
|
var=$(echo "$1"|sed 's/[][\/.^$*]/\\&/g')
|
|||
|
#now pick out the right help text:
|
|||
|
text=$(sed -n "/^$var[ ]*\$/,\${
|
|||
|
/^$var[ ]*\$/c\\
|
|||
|
${var}:\\
|
|||
|
|
|||
|
/^#/b
|
|||
|
/^[^ ]/q
|
|||
|
s/^ //
|
|||
|
/<file:\\([^>]*\\)>/s//\\1/g
|
|||
|
p
|
|||
|
}" Documentation/Configure.help)
|
|||
|
|
|||
|
if [ -z "$text" ]
|
|||
|
then
|
|||
|
echo "There is no help available for this option."
|
|||
|
return 1
|
|||
|
else
|
|||
|
echo "$text"
|
|||
|
fi
|
|||
|
else
|
|||
|
echo "There is no help available for this option."
|
|||
|
return 1
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Activate a help dialog.
|
|||
|
#
|
|||
|
function help () {
|
|||
|
if extract_help $1 >help.out
|
|||
|
then
|
|||
|
$DIALOG --backtitle "$backtitle" --title "$2"\
|
|||
|
--textbox help.out $ROWS $COLS
|
|||
|
else
|
|||
|
$DIALOG --backtitle "$backtitle" \
|
|||
|
--textbox help.out $ROWS $COLS
|
|||
|
fi
|
|||
|
rm -f help.out
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Show the README file.
|
|||
|
#
|
|||
|
function show_readme () {
|
|||
|
$DIALOG --backtitle "$backtitle" \
|
|||
|
--textbox scripts/README.Menuconfig $ROWS $COLS
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Begin building the dialog menu command and Initialize the
|
|||
|
# Radiolist function file.
|
|||
|
#
|
|||
|
function menu_name () {
|
|||
|
echo -ne "$DIALOG --title '$1'\
|
|||
|
--backtitle '$backtitle' \
|
|||
|
--menu '$menu_instructions' \
|
|||
|
$ROWS $COLS $((ROWS-10)) \
|
|||
|
'$default' " >MCmenu
|
|||
|
>MCradiolists
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Add a submenu option to the menu currently under construction.
|
|||
|
#
|
|||
|
function submenu () {
|
|||
|
echo -ne "'activate_menu $2' '$1 --->' " >>MCmenu
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Handle a boolean (Yes/No) option.
|
|||
|
#
|
|||
|
function l_bool () {
|
|||
|
if [ -n "$2" ]
|
|||
|
then
|
|||
|
case "$2" in
|
|||
|
y|m) eval $1=y ;;
|
|||
|
c) eval x=\$$1
|
|||
|
case $x in
|
|||
|
y) eval $1=n ;;
|
|||
|
n) eval $1=y ;;
|
|||
|
*) eval $1=y ;;
|
|||
|
esac ;;
|
|||
|
*) eval $1=n ;;
|
|||
|
esac
|
|||
|
else
|
|||
|
get_cmd='echo $haveMCmenu'"$1"
|
|||
|
value="`eval $get_cmd`"
|
|||
|
|
|||
|
if [ -n "$value" ]; then
|
|||
|
eval activate_menu MCmenu$1
|
|||
|
else
|
|||
|
echo -ne "\007"
|
|||
|
fi
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Same as bool() except options are (Module/No)
|
|||
|
#
|
|||
|
function mod_bool () {
|
|||
|
if [ "$CONFIG_MODULES" != "y" ]; then
|
|||
|
define_bool "$2" "n"
|
|||
|
else
|
|||
|
set_x_info "$2" "n"
|
|||
|
|
|||
|
case $x in
|
|||
|
y|m) flag='M' ;;
|
|||
|
*) flag=' ' ;;
|
|||
|
esac
|
|||
|
|
|||
|
echo -ne "'$2' '<$flag> $1$info' " >>MCmenu
|
|||
|
|
|||
|
echo -e "function $2 () { l_mod_bool '$2' \"\$1\" ;}" >>MCradiolists
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Same as l_bool() except options are (Module/No)
|
|||
|
#
|
|||
|
function l_mod_bool() {
|
|||
|
if [ -n "$2" ]
|
|||
|
then
|
|||
|
case "$2" in
|
|||
|
y) echo -en "\007"
|
|||
|
${DIALOG} --backtitle "$backtitle" \
|
|||
|
--infobox "\
|
|||
|
This feature depends on another which has been configured as a module. \
|
|||
|
As a result, this feature will be built as a module." 4 70
|
|||
|
sleep 5
|
|||
|
eval $1=m ;;
|
|||
|
m) eval $1=m ;;
|
|||
|
c) eval x=\$$1
|
|||
|
case $x in
|
|||
|
m) eval $1=n ;;
|
|||
|
n) eval $1=m ;;
|
|||
|
*) eval $1=m ;;
|
|||
|
esac ;;
|
|||
|
*) eval $1=n ;;
|
|||
|
esac
|
|||
|
else
|
|||
|
echo -ne "\007"
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Handle a tristate (Yes/No/Module) option.
|
|||
|
#
|
|||
|
function l_tristate () {
|
|||
|
if [ -n "$2" ]
|
|||
|
then
|
|||
|
eval x=\$$1
|
|||
|
|
|||
|
case "$2" in
|
|||
|
y) eval $1=y ;;
|
|||
|
m) eval $1=m ;;
|
|||
|
c) eval x=\$$1
|
|||
|
case $x in
|
|||
|
y) eval $1=n ;;
|
|||
|
n) eval $1=m ;;
|
|||
|
m) eval $1=y ;;
|
|||
|
*) eval $1=y ;;
|
|||
|
esac ;;
|
|||
|
*) eval $1=n ;;
|
|||
|
esac
|
|||
|
else
|
|||
|
echo -ne "\007"
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Create a dialog for entering an integer into a kernel option.
|
|||
|
#
|
|||
|
function l_int () {
|
|||
|
while true
|
|||
|
do
|
|||
|
if $DIALOG --title "$1" \
|
|||
|
--backtitle "$backtitle" \
|
|||
|
--inputbox "$inputbox_instructions_int" \
|
|||
|
10 75 "$4" 2>MCdialog.out
|
|||
|
then
|
|||
|
answer="`cat MCdialog.out`"
|
|||
|
answer="${answer:-$3}"
|
|||
|
|
|||
|
# Semantics of + and ? in GNU expr changed, so
|
|||
|
# we avoid them:
|
|||
|
if expr "$answer" : '0$' '|' "$answer" : '[1-9][0-9]*$' '|' "$answer" : '-[1-9][0-9]*$' >/dev/null
|
|||
|
then
|
|||
|
eval $2=\"$answer\"
|
|||
|
else
|
|||
|
eval $2=\"$3\"
|
|||
|
echo -en "\007"
|
|||
|
${DIALOG} --backtitle "$backtitle" \
|
|||
|
--infobox "You have made an invalid entry." 3 43
|
|||
|
sleep 2
|
|||
|
fi
|
|||
|
|
|||
|
break
|
|||
|
fi
|
|||
|
|
|||
|
help "$2" "$1"
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Create a dialog for entering a hexadecimal into a kernel option.
|
|||
|
#
|
|||
|
function l_hex () {
|
|||
|
while true
|
|||
|
do
|
|||
|
if $DIALOG --title "$1" \
|
|||
|
--backtitle "$backtitle" \
|
|||
|
--inputbox "$inputbox_instructions_hex" \
|
|||
|
10 75 "$4" 2>MCdialog.out
|
|||
|
then
|
|||
|
answer="`cat MCdialog.out`"
|
|||
|
answer="${answer:-$3}"
|
|||
|
answer="${answer##*[x,X]}"
|
|||
|
|
|||
|
if expr "$answer" : '[0-9a-fA-F][0-9a-fA-F]*$' >/dev/null
|
|||
|
then
|
|||
|
eval $2=\"$answer\"
|
|||
|
else
|
|||
|
eval $2=\"$3\"
|
|||
|
echo -en "\007"
|
|||
|
${DIALOG} --backtitle "$backtitle" \
|
|||
|
--infobox "You have made an invalid entry." 3 43
|
|||
|
sleep 2
|
|||
|
fi
|
|||
|
|
|||
|
break
|
|||
|
fi
|
|||
|
|
|||
|
help "$2" "$1"
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Create a dialog for entering a string into a kernel option.
|
|||
|
#
|
|||
|
function l_string () {
|
|||
|
while true
|
|||
|
do
|
|||
|
if $DIALOG --title "$1" \
|
|||
|
--backtitle "$backtitle" \
|
|||
|
--inputbox "$inputbox_instructions_string" \
|
|||
|
10 75 "$4" 2>MCdialog.out
|
|||
|
then
|
|||
|
answer="`cat MCdialog.out`"
|
|||
|
answer="${answer:-$3}"
|
|||
|
|
|||
|
#
|
|||
|
# Someone may add a nice check for the entered
|
|||
|
# string here...
|
|||
|
#
|
|||
|
eval $2=\"$answer\"
|
|||
|
|
|||
|
break
|
|||
|
fi
|
|||
|
|
|||
|
help "$2" "$1"
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Use an editor to edit a certain file
|
|||
|
#
|
|||
|
|
|||
|
function l_editor() {
|
|||
|
if [ -n "$EDITOR" ]; then
|
|||
|
$EDITOR $1
|
|||
|
elif [ -n "`which nano`" ]; then
|
|||
|
nano $1
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Create a dialog for entering a MAC address
|
|||
|
#
|
|||
|
function l_mac () {
|
|||
|
while true
|
|||
|
do
|
|||
|
if $DIALOG --title "$1" \
|
|||
|
--backtitle "$backtitle" \
|
|||
|
--inputbox "$inputbox_instructions_ipv4" \
|
|||
|
10 75 "$4" 2>MCdialog.out
|
|||
|
then
|
|||
|
answer="`cat MCdialog.out`"
|
|||
|
answer="${answer:-$3}"
|
|||
|
|
|||
|
if expr "$answer" : '[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]$' >/dev/null
|
|||
|
then
|
|||
|
eval $2=\"$answer\"
|
|||
|
else
|
|||
|
eval $2=\"$3\"
|
|||
|
echo -en "\007"
|
|||
|
$DIALOG --backtitle "$backtitle" \
|
|||
|
--infobox "You have made an invalid entry." 3 43
|
|||
|
sleep 2
|
|||
|
fi
|
|||
|
|
|||
|
break
|
|||
|
fi
|
|||
|
|
|||
|
help "$2" "$1"
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#
|
|||
|
# Create a dialog for entering an IPv4 address
|
|||
|
#
|
|||
|
function l_ipv4 () {
|
|||
|
while true
|
|||
|
do
|
|||
|
if $DIALOG --title "$1" \
|
|||
|
--backtitle "$backtitle" \
|
|||
|
--inputbox "$inputbox_instructions_ipv4" \
|
|||
|
10 75 "$4" 2>MCdialog.out
|
|||
|
then
|
|||
|
answer="`cat MCdialog.out`"
|
|||
|
answer="${answer:-$3}"
|
|||
|
|
|||
|
if expr "$answer" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null
|
|||
|
then
|
|||
|
eval $2=\"$answer\"
|
|||
|
else
|
|||
|
eval $2=\"$3\"
|
|||
|
echo -en "\007"
|
|||
|
$DIALOG --backtitle "$backtitle" \
|
|||
|
--infobox "You have made an invalid entry." 3 43
|
|||
|
sleep 2
|
|||
|
fi
|
|||
|
|
|||
|
break
|
|||
|
fi
|
|||
|
|
|||
|
help "$2" "$1"
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#
|
|||
|
# Create a dialog for entering an IPv6 address
|
|||
|
#
|
|||
|
function l_ipv6 () {
|
|||
|
while true
|
|||
|
do
|
|||
|
if $DIALOG --title "$1" \
|
|||
|
--backtitle "$backtitle" \
|
|||
|
--inputbox "$inputbox_instructions_ipv6" \
|
|||
|
10 75 "$4" 2>MCdialog.out
|
|||
|
then
|
|||
|
answer="`scripts/ipv6-expand "$(cat MCdialog.out)"`"
|
|||
|
answer="${answer:-$3}"
|
|||
|
|
|||
|
if scripts/ipv6-check "$answer"
|
|||
|
then
|
|||
|
eval $2=\"$answer\"
|
|||
|
else
|
|||
|
eval $2=\"$3\"
|
|||
|
echo -en "\007"
|
|||
|
$DIALOG --backtitle "$backtitle" \
|
|||
|
--infobox "You have made an invalid entry." 3 43
|
|||
|
sleep 2
|
|||
|
fi
|
|||
|
|
|||
|
break
|
|||
|
fi
|
|||
|
|
|||
|
help "$2" "$1"
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#
|
|||
|
# Handle a one-of-many choice list.
|
|||
|
#
|
|||
|
function l_choice () {
|
|||
|
#
|
|||
|
# Need to remember params cause they're gonna get reset.
|
|||
|
#
|
|||
|
title="$1"
|
|||
|
choices="$2"
|
|||
|
current="$3"
|
|||
|
define_symbol="$4"
|
|||
|
chosen=
|
|||
|
|
|||
|
#
|
|||
|
# Scan current value of choices and set radiolist switches.
|
|||
|
#
|
|||
|
list=
|
|||
|
set -- $choices
|
|||
|
firstchoice=$2
|
|||
|
while [ -n "$2" ]
|
|||
|
do
|
|||
|
case "$1" in
|
|||
|
"$current"*) if [ -z "$chosen" ]; then
|
|||
|
list="$list $2 $1 ON "
|
|||
|
chosen=1
|
|||
|
else
|
|||
|
list="$list $2 $1 OFF "
|
|||
|
fi ;;
|
|||
|
*) list="$list $2 $1 OFF " ;;
|
|||
|
esac
|
|||
|
|
|||
|
shift ; shift
|
|||
|
done
|
|||
|
|
|||
|
while true
|
|||
|
do
|
|||
|
if $DIALOG --title "$title" \
|
|||
|
--backtitle "$backtitle" \
|
|||
|
--radiolist "$radiolist_instructions" \
|
|||
|
15 70 6 $list 2>MCdialog.out
|
|||
|
then
|
|||
|
choice=`cat MCdialog.out`
|
|||
|
break
|
|||
|
fi
|
|||
|
|
|||
|
help "$firstchoice" "$title"
|
|||
|
done
|
|||
|
|
|||
|
#
|
|||
|
# Now set the boolean value of each option based on
|
|||
|
# the selection made from the radiolist.
|
|||
|
#
|
|||
|
set -- $choices
|
|||
|
while [ -n "$2" ]
|
|||
|
do
|
|||
|
if [ "$2" = "$choice" ]
|
|||
|
then
|
|||
|
if [ \! -z "$define_symbol" ]; then
|
|||
|
eval $define_symbol="$2"
|
|||
|
else
|
|||
|
eval $2=\"y\"
|
|||
|
fi
|
|||
|
else
|
|||
|
if [ -z "$define_symbol" ]; then
|
|||
|
eval $2=\"n\"
|
|||
|
fi
|
|||
|
fi
|
|||
|
|
|||
|
shift ; shift
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Call awk, and watch for error codes, etc.
|
|||
|
#
|
|||
|
function callawk () {
|
|||
|
awk "$1" || { echo "Awk died with error code $?. Giving up."; exit 1; }
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# A faster awk based recursive parser. (I hope)
|
|||
|
#
|
|||
|
function parser1 () {
|
|||
|
callawk '
|
|||
|
BEGIN {
|
|||
|
menu_no = 0
|
|||
|
comment_is_option = 0
|
|||
|
parser("'$CONFIG_IN'","MCmenu0")
|
|||
|
}
|
|||
|
|
|||
|
function parser(ifile,menu) {
|
|||
|
|
|||
|
while ((getline <ifile) > 0) {
|
|||
|
if ($1 == "mainmenu_option") {
|
|||
|
comment_is_option = "1"
|
|||
|
}
|
|||
|
else if ($1 == "dep_bool_menu") {
|
|||
|
print >>menu
|
|||
|
|
|||
|
split ($0,ll,"\\\"");
|
|||
|
split (ll[3],mm," ");
|
|||
|
|
|||
|
newmenu = sprintf("MCmenu%s", mm[1]);
|
|||
|
printf( "function MCmenu%s () {\n"\
|
|||
|
"default=$1\n"\
|
|||
|
"menu_name \"%s\"\n",\
|
|||
|
mm[1], ll[2]) > newmenu
|
|||
|
|
|||
|
parser(ifile, newmenu)
|
|||
|
}
|
|||
|
else if ($1 == "comment" && comment_is_option == "1") {
|
|||
|
comment_is_option= "0"
|
|||
|
sub($1,"",$0)
|
|||
|
++menu_no
|
|||
|
|
|||
|
printf("submenu %s MCmenu%s\n", $0, menu_no) >>menu
|
|||
|
|
|||
|
newmenu = sprintf("MCmenu%d", menu_no);
|
|||
|
printf( "function MCmenu%s () {\n"\
|
|||
|
"default=$1\n"\
|
|||
|
"menu_name %s\n",\
|
|||
|
menu_no, $0) >newmenu
|
|||
|
|
|||
|
parser(ifile, newmenu)
|
|||
|
}
|
|||
|
else if ($0 ~ /^#|\$MAKE|mainmenu_name/) {
|
|||
|
printf("") >>menu
|
|||
|
}
|
|||
|
else if ($1 ~ "endmenu") {
|
|||
|
printf("}\n") >>menu
|
|||
|
return
|
|||
|
}
|
|||
|
else if ($1 == "source") {
|
|||
|
parser($2,menu)
|
|||
|
}
|
|||
|
else {
|
|||
|
print >>menu
|
|||
|
}
|
|||
|
}
|
|||
|
}'
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Secondary parser for single menu mode.
|
|||
|
#
|
|||
|
function parser2 () {
|
|||
|
callawk '
|
|||
|
BEGIN {
|
|||
|
parser("'$CONFIG_IN'","MCmenu0")
|
|||
|
}
|
|||
|
|
|||
|
function parser(ifile,menu) {
|
|||
|
|
|||
|
while ((getline <ifile) > 0) {
|
|||
|
if ($0 ~ /^#|$MAKE|mainmenu_name/) {
|
|||
|
printf("") >>menu
|
|||
|
}
|
|||
|
else if ($1 ~ /mainmenu_option|endmenu/) {
|
|||
|
printf("") >>menu
|
|||
|
}
|
|||
|
else if ($1 == "source") {
|
|||
|
parser($2,menu)
|
|||
|
}
|
|||
|
else {
|
|||
|
print >>menu
|
|||
|
}
|
|||
|
}
|
|||
|
}'
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Parse all the config.in files into mini scripts.
|
|||
|
#
|
|||
|
function parse_config_files () {
|
|||
|
rm -f MCmenu*
|
|||
|
|
|||
|
echo "function MCmenu0 () {" >MCmenu0
|
|||
|
echo 'default=$1' >>MCmenu0
|
|||
|
echo "menu_name 'Main Menu'" >>MCmenu0
|
|||
|
|
|||
|
echo "g_dflt_config" >>MCmenu0
|
|||
|
|
|||
|
if [ "_$single_menu_mode" = "_TRUE" ]
|
|||
|
then
|
|||
|
parser2
|
|||
|
else
|
|||
|
parser1
|
|||
|
fi
|
|||
|
|
|||
|
echo "comment ''" >>MCmenu0
|
|||
|
echo "g_alt_config" >>MCmenu0
|
|||
|
echo "s_alt_config" >>MCmenu0
|
|||
|
|
|||
|
echo "}" >>MCmenu0
|
|||
|
|
|||
|
#
|
|||
|
# These mini scripts must be sourced into the current
|
|||
|
# environment in order for all of this to work. Leaving
|
|||
|
# them on the disk as executables screws up the recursion
|
|||
|
# in activate_menu(), among other things. Once they are
|
|||
|
# sourced we can discard them.
|
|||
|
#
|
|||
|
for i in MCmenu*
|
|||
|
do
|
|||
|
echo -n "."
|
|||
|
source ./$i
|
|||
|
done
|
|||
|
#rm -f MCmenu*
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# This is the menu tree's bootstrap.
|
|||
|
#
|
|||
|
# Executes the parsed menus on demand and creates a set of functions,
|
|||
|
# one per configuration option. These functions will in turn execute
|
|||
|
# dialog commands or recursively call other menus.
|
|||
|
#
|
|||
|
function activate_menu () {
|
|||
|
rm -f lxdialog.scrltmp
|
|||
|
while true
|
|||
|
do
|
|||
|
comment_ctr=0 #So comment lines get unique tags
|
|||
|
|
|||
|
$1 "$default" 2> MCerror #Create the lxdialog menu & functions
|
|||
|
|
|||
|
if [ "$?" != "0" ]
|
|||
|
then
|
|||
|
clear
|
|||
|
cat <<EOM
|
|||
|
|
|||
|
Menuconfig has encountered a possible error in one of the
|
|||
|
configuration files and is unable to continue. Here is the error
|
|||
|
report:
|
|||
|
|
|||
|
EOM
|
|||
|
sed 's/^/ Q> /' MCerror
|
|||
|
cat <<EOM
|
|||
|
|
|||
|
|
|||
|
EOM
|
|||
|
cleanup
|
|||
|
exit 1
|
|||
|
fi
|
|||
|
rm -f MCerror
|
|||
|
|
|||
|
. ./MCradiolists #Source the menu's functions
|
|||
|
|
|||
|
. ./MCmenu 2>MCdialog.out #Activate the lxdialog menu
|
|||
|
ret=$?
|
|||
|
|
|||
|
read selection <MCdialog.out
|
|||
|
|
|||
|
case "$ret" in
|
|||
|
0|3|4|5|6)
|
|||
|
defaults="$selection$defaults" #pseudo stack
|
|||
|
case "$ret" in
|
|||
|
0) eval $selection ;;
|
|||
|
3) eval $selection y ;;
|
|||
|
4) eval $selection n ;;
|
|||
|
5) eval $selection m ;;
|
|||
|
6) eval $selection c ;;
|
|||
|
esac
|
|||
|
default="${defaults%%*}" defaults="${defaults#*}"
|
|||
|
;;
|
|||
|
2)
|
|||
|
default="${selection%%\ *}"
|
|||
|
|
|||
|
case "$selection" in
|
|||
|
*"-->"*|*"alt_config"*)
|
|||
|
show_readme ;;
|
|||
|
*)
|
|||
|
eval help $selection ;;
|
|||
|
esac
|
|||
|
;;
|
|||
|
255|1)
|
|||
|
break
|
|||
|
;;
|
|||
|
139)
|
|||
|
stty sane
|
|||
|
clear
|
|||
|
cat <<EOM
|
|||
|
|
|||
|
There seems to be a problem with the lxdialog companion utility which is
|
|||
|
built prior to running Menuconfig. Usually this is an indicator that you
|
|||
|
have upgraded/downgraded your ncurses libraries and did not remove the
|
|||
|
old ncurses header file(s) in /usr/include or /usr/include/ncurses.
|
|||
|
|
|||
|
It is VERY important that you have only one set of ncurses header files
|
|||
|
and that those files are properly version matched to the ncurses libraries
|
|||
|
installed on your machine.
|
|||
|
|
|||
|
You may also need to rebuild lxdialog. This can be done by moving to
|
|||
|
the /usr/src/linux/scripts/lxdialog directory and issuing the
|
|||
|
"make clean all" command.
|
|||
|
|
|||
|
EOM
|
|||
|
cleanup
|
|||
|
exit 139
|
|||
|
;;
|
|||
|
esac
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
g_dflt_config () {
|
|||
|
echo -n "get_dflt_config 'Load a Default Configuration --->' "\
|
|||
|
>>MCmenu
|
|||
|
}
|
|||
|
|
|||
|
get_dflt_config () {
|
|||
|
config_files=`ls ./profiles/`
|
|||
|
choices=""
|
|||
|
for file in $config_files
|
|||
|
do
|
|||
|
choices="$choices $file $file 0"
|
|||
|
done
|
|||
|
|
|||
|
while true
|
|||
|
do
|
|||
|
$DIALOG --title "Load Default Configuration" \
|
|||
|
--backtitle "$backtitle" \
|
|||
|
--radiolist "\
|
|||
|
Select the default profile you wish to load. \
|
|||
|
<Esc><Esc> to abort." \
|
|||
|
15 70 7 \
|
|||
|
$choices \
|
|||
|
2>MCdialog.out
|
|||
|
|
|||
|
exit_status=$?
|
|||
|
|
|||
|
if [ $exit_status -eq 0 ]; then
|
|||
|
choice=`cat MCdialog.out`
|
|||
|
echo $choice
|
|||
|
load_config_file "./profiles/$choice"
|
|||
|
break
|
|||
|
elif [ $exit_status -eq 255 ]; then
|
|||
|
break # ESC-ESC ...
|
|||
|
elif [ $exit_status -eq 1 ]; then
|
|||
|
help "$firstchoice" "$title"
|
|||
|
fi
|
|||
|
done
|
|||
|
|
|||
|
rm -f help.out MCdialog.out
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Create a menu item to load an alternate configuration file.
|
|||
|
#
|
|||
|
g_alt_config () {
|
|||
|
echo -n "get_alt_config 'Load an Alternate Configuration File' "\
|
|||
|
>>MCmenu
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Get alternate config file name and load the
|
|||
|
# configuration from it.
|
|||
|
#
|
|||
|
get_alt_config () {
|
|||
|
set -f ## Switch file expansion OFF
|
|||
|
|
|||
|
while true
|
|||
|
do
|
|||
|
ALT_CONFIG="${ALT_CONFIG:-$DEFAULTS}"
|
|||
|
|
|||
|
$DIALOG --backtitle "$backtitle" \
|
|||
|
--inputbox "\
|
|||
|
Enter the name of the configuration file you wish to load. \
|
|||
|
Accept the name shown to restore the configuration you \
|
|||
|
last retrieved. Leave blank to abort."\
|
|||
|
11 55 "$ALT_CONFIG" 2>MCdialog.out
|
|||
|
|
|||
|
if [ "$?" = "0" ]
|
|||
|
then
|
|||
|
ALT_CONFIG=`cat MCdialog.out`
|
|||
|
|
|||
|
[ "_" = "_$ALT_CONFIG" ] && break
|
|||
|
|
|||
|
if eval [ -r \"$ALT_CONFIG\" ]
|
|||
|
then
|
|||
|
eval load_config_file \"$ALT_CONFIG\"
|
|||
|
break
|
|||
|
else
|
|||
|
echo -ne "\007"
|
|||
|
$DIALOG --backtitle "$backtitle" \
|
|||
|
--infobox "File does not exist!" 3 38
|
|||
|
sleep 2
|
|||
|
fi
|
|||
|
else
|
|||
|
cat <<EOM >help.out
|
|||
|
|
|||
|
For various reasons, one may wish to keep several different kernel
|
|||
|
configurations available on a single machine.
|
|||
|
|
|||
|
If you have saved a previous configuration in a file other than the
|
|||
|
kernel's default, entering the name of the file here will allow you
|
|||
|
to modify that configuration.
|
|||
|
|
|||
|
If you are uncertain, then you have probably never used alternate
|
|||
|
configuration files. You should therefor leave this blank to abort.
|
|||
|
|
|||
|
EOM
|
|||
|
$DIALOG --backtitle "$backtitle"\
|
|||
|
--title "Load Alternate Configuration"\
|
|||
|
--textbox help.out $ROWS $COLS
|
|||
|
fi
|
|||
|
done
|
|||
|
|
|||
|
set +f ## Switch file expansion ON
|
|||
|
rm -f help.out MCdialog.out
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Create a menu item to store an alternate config file.
|
|||
|
#
|
|||
|
s_alt_config () {
|
|||
|
echo -n "save_alt_config 'Save Configuration to an Alternate File' "\
|
|||
|
>>MCmenu
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Get an alternate config file name and save the current
|
|||
|
# configuration to it.
|
|||
|
#
|
|||
|
save_alt_config () {
|
|||
|
set -f ## Switch file expansion OFF
|
|||
|
|
|||
|
while true
|
|||
|
do
|
|||
|
$DIALOG --backtitle "$backtitle" \
|
|||
|
--inputbox "\
|
|||
|
Enter a filename to which this configuration should be saved \
|
|||
|
as an alternate. Leave blank to abort."\
|
|||
|
10 55 "$ALT_CONFIG" 2>MCdialog.out
|
|||
|
|
|||
|
if [ "$?" = "0" ]
|
|||
|
then
|
|||
|
ALT_CONFIG=`cat MCdialog.out`
|
|||
|
|
|||
|
[ "_" = "_$ALT_CONFIG" ] && break
|
|||
|
|
|||
|
if eval touch $ALT_CONFIG 2>/dev/null
|
|||
|
then
|
|||
|
eval save_configuration $ALT_CONFIG
|
|||
|
load_functions ## RELOAD
|
|||
|
break
|
|||
|
else
|
|||
|
echo -ne "\007"
|
|||
|
$DIALOG --backtitle "$backtitle" \
|
|||
|
--infobox "Can't create file! Probably a nonexistent directory." 3 60
|
|||
|
sleep 2
|
|||
|
fi
|
|||
|
else
|
|||
|
cat <<EOM >help.out
|
|||
|
|
|||
|
For various reasons, one may wish to keep different kernel
|
|||
|
configurations available on a single machine.
|
|||
|
|
|||
|
Entering a file name here will allow you to later retrieve, modify
|
|||
|
and use the current configuration as an alternate to whatever
|
|||
|
configuration options you have selected at that time.
|
|||
|
|
|||
|
If you are uncertain what all this means then you should probably
|
|||
|
leave this blank.
|
|||
|
EOM
|
|||
|
$DIALOG --backtitle "$backtitle"\
|
|||
|
--title "Save Alternate Configuration"\
|
|||
|
--textbox help.out $ROWS $COLS
|
|||
|
fi
|
|||
|
done
|
|||
|
|
|||
|
set +f ## Switch file expansion ON
|
|||
|
rm -f help.out MCdialog.out
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Load config options from a file.
|
|||
|
# Converts all "# OPTION is not set" lines to "OPTION=n" lines
|
|||
|
#
|
|||
|
function load_config_file () {
|
|||
|
awk '
|
|||
|
/# .* is not set.*/ { printf("%s=n\n", $2) }
|
|||
|
! /# .* is not set.*/ { print }
|
|||
|
' $1 >.tmpconfig
|
|||
|
|
|||
|
source ./.tmpconfig
|
|||
|
rm -f .tmpconfig
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Just what it says.
|
|||
|
#
|
|||
|
save_configuration () {
|
|||
|
echo
|
|||
|
echo -n "Saving your Borg configuration."
|
|||
|
|
|||
|
#
|
|||
|
# Now, let's redefine the configuration functions for final
|
|||
|
# output to the config files.
|
|||
|
#
|
|||
|
# Nested function definitions, YIPEE!
|
|||
|
#
|
|||
|
function bool () {
|
|||
|
set_x_info "$2" "n"
|
|||
|
eval define_bool \"$2\" \"$x\"
|
|||
|
}
|
|||
|
|
|||
|
function tristate () {
|
|||
|
set_x_info "$2" "n"
|
|||
|
eval define_tristate \"$2\" \"$x\"
|
|||
|
}
|
|||
|
|
|||
|
function dep_tristate () {
|
|||
|
set_x_info "$2" "n"
|
|||
|
var="$2"
|
|||
|
shift 2
|
|||
|
while [ $# -gt 0 ]; do
|
|||
|
if [ "$1" = y ]; then
|
|||
|
shift
|
|||
|
elif [ "$1" = m -a "$x" != n ]; then
|
|||
|
x=m; shift
|
|||
|
else
|
|||
|
x=n; shift $#
|
|||
|
fi
|
|||
|
done
|
|||
|
define_tristate "$var" "$x"
|
|||
|
}
|
|||
|
|
|||
|
function dep_bool () {
|
|||
|
set_x_info "$2" "n"
|
|||
|
var="$2"
|
|||
|
shift 2
|
|||
|
while [ $# -gt 0 ]; do
|
|||
|
if [ "$1" = y ]; then
|
|||
|
shift
|
|||
|
else
|
|||
|
x=n; shift $#
|
|||
|
fi
|
|||
|
done
|
|||
|
define_bool "$var" "$x"
|
|||
|
}
|
|||
|
|
|||
|
function dep_bool_menu () {
|
|||
|
ques="$1"; shift
|
|||
|
dep_bool "" $*
|
|||
|
}
|
|||
|
|
|||
|
function dep_mbool () {
|
|||
|
set_x_info "$2" "n"
|
|||
|
var="$2"
|
|||
|
shift 2
|
|||
|
while [ $# -gt 0 ]; do
|
|||
|
if [ "$1" = y -o "$1" = m ]; then
|
|||
|
shift
|
|||
|
else
|
|||
|
x=n; shift $#
|
|||
|
fi
|
|||
|
done
|
|||
|
define_bool "$var" "$x"
|
|||
|
}
|
|||
|
|
|||
|
function int () {
|
|||
|
set_x_info "$2" "$3"
|
|||
|
echo "$2=$x" >>$CONFIG
|
|||
|
echo "#define $2 ($x)" >>$CONFIG_H
|
|||
|
}
|
|||
|
|
|||
|
function hex () {
|
|||
|
set_x_info "$2" "$3"
|
|||
|
echo "$2=$x" >>$CONFIG
|
|||
|
echo "#define $2 \"$(echo "$x" | sed -e 's/\(..\)/\\x\1/g')\"" >>$CONFIG_H
|
|||
|
}
|
|||
|
|
|||
|
function string () {
|
|||
|
set_x_info "$2" "$3"
|
|||
|
echo "$2=\"$x\"" >>$CONFIG
|
|||
|
echo "#define $2 \"$x\"" >>$CONFIG_H
|
|||
|
}
|
|||
|
|
|||
|
function mac () {
|
|||
|
set_x_info "$2" "$3"
|
|||
|
echo "$2=\"$x\"" >>$CONFIG
|
|||
|
echo "#define $2 " \
|
|||
|
"\"\\x$(echo "$x" | sed -e 's;:;\\x;g')\"" >> $CONFIG_H
|
|||
|
}
|
|||
|
|
|||
|
function ipv4 () {
|
|||
|
set_x_info "$2" "$3"
|
|||
|
echo "$2=\"$x\"" >>$CONFIG
|
|||
|
echo "#define $2 uip_ipaddr(ip," \
|
|||
|
$(echo "$x" | sed -e 's;\.;,;g') ")" >> $CONFIG_H
|
|||
|
}
|
|||
|
|
|||
|
function ipv6 () {
|
|||
|
set_x_info "$2" "$3"
|
|||
|
echo "$2=\"$x\"" >>$CONFIG
|
|||
|
echo "#define $2 uip_ip6addr(ip," \
|
|||
|
"0x"$(echo "$x" | sed -e 's;:;,0x;g') ")" >> $CONFIG_H
|
|||
|
}
|
|||
|
|
|||
|
function define_hex () {
|
|||
|
eval $1=\"$2\"
|
|||
|
echo "$1=$2" >>$CONFIG
|
|||
|
echo "#define $1 0x${2##*[x,X]}" >>$CONFIG_H
|
|||
|
}
|
|||
|
|
|||
|
function define_int () {
|
|||
|
eval $1=\"$2\"
|
|||
|
echo "$1=$2" >>$CONFIG
|
|||
|
echo "#define $1 ($2)" >>$CONFIG_H
|
|||
|
}
|
|||
|
|
|||
|
function define_symbol () {
|
|||
|
eval $1=\"$2\"
|
|||
|
echo "$1=$2" >>$CONFIG
|
|||
|
echo "#define $1 $2" >>$CONFIG_H
|
|||
|
}
|
|||
|
|
|||
|
function define_string () {
|
|||
|
eval $1=\"$2\"
|
|||
|
echo "$1=\"$2\"" >>$CONFIG
|
|||
|
echo "#define $1 \"$2\"" >>$CONFIG_H
|
|||
|
}
|
|||
|
|
|||
|
function define_bool () {
|
|||
|
define_tristate "$1" "$2"
|
|||
|
}
|
|||
|
|
|||
|
function define_tristate () {
|
|||
|
eval $1=\"$2\"
|
|||
|
|
|||
|
case "$2" in
|
|||
|
y)
|
|||
|
echo "$1=y" >>$CONFIG
|
|||
|
echo "#define $1 1" >>$CONFIG_H
|
|||
|
;;
|
|||
|
|
|||
|
m)
|
|||
|
if [ "$CONFIG_MODULES" = "y" ]
|
|||
|
then
|
|||
|
echo "$1=m" >>$CONFIG
|
|||
|
echo "#undef $1" >>$CONFIG_H
|
|||
|
echo "#define $1_MODULE 1" >>$CONFIG_H
|
|||
|
else
|
|||
|
echo "$1=y" >>$CONFIG
|
|||
|
echo "#define $1 1" >>$CONFIG_H
|
|||
|
fi
|
|||
|
;;
|
|||
|
|
|||
|
n)
|
|||
|
echo "# $1 is not set" >>$CONFIG
|
|||
|
echo "#undef $1" >>$CONFIG_H
|
|||
|
;;
|
|||
|
esac
|
|||
|
}
|
|||
|
|
|||
|
function choice () {
|
|||
|
#
|
|||
|
# Find the first choice that's already set to 'y'
|
|||
|
#
|
|||
|
choices="$2"
|
|||
|
default="$3"
|
|||
|
define_symbol="$4"
|
|||
|
current=
|
|||
|
chosen=
|
|||
|
|
|||
|
set -- $choices
|
|||
|
if [ -n "$define_symbol" ]
|
|||
|
then
|
|||
|
while [ -n "$2" ]
|
|||
|
do
|
|||
|
if eval [ \"_\$$define_symbol\" == \"_$2\" ]
|
|||
|
then
|
|||
|
current=$1
|
|||
|
break
|
|||
|
fi
|
|||
|
shift ; shift
|
|||
|
done
|
|||
|
else
|
|||
|
while [ -n "$2" ]
|
|||
|
do
|
|||
|
if eval [ \"_\$$2\" = \"_y\" ]
|
|||
|
then
|
|||
|
current=$1
|
|||
|
break
|
|||
|
fi
|
|||
|
shift ; shift
|
|||
|
done
|
|||
|
fi
|
|||
|
|
|||
|
#
|
|||
|
# Use the default if none were set.
|
|||
|
#
|
|||
|
: ${current:=$default}
|
|||
|
|
|||
|
#
|
|||
|
# Output all choices (to be compatible with other configs).
|
|||
|
#
|
|||
|
set -- $choices
|
|||
|
while [ -n "$2" ]
|
|||
|
do
|
|||
|
case "$1" in
|
|||
|
"$current"*) if [ -z "$chosen" ]; then
|
|||
|
if [ \! -z "$define_symbol" ]; then
|
|||
|
echo "$define_symbol=$2" >>$CONFIG
|
|||
|
echo "#define $define_symbol $2" >>$CONFIG_H
|
|||
|
else
|
|||
|
define_bool "$2" "y"
|
|||
|
fi
|
|||
|
|
|||
|
chosen=1
|
|||
|
else
|
|||
|
if [ -z "$define_symbol" ]; then
|
|||
|
define_bool "$2" "n"
|
|||
|
fi
|
|||
|
fi ;;
|
|||
|
*) if [ -z "$define_symbol" ]; then
|
|||
|
define_bool "$2" "n"
|
|||
|
fi ;;
|
|||
|
esac
|
|||
|
shift ; shift
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
function mainmenu_name () {
|
|||
|
:
|
|||
|
}
|
|||
|
|
|||
|
function mainmenu_option () {
|
|||
|
comment_is_option=TRUE
|
|||
|
}
|
|||
|
|
|||
|
function endmenu () {
|
|||
|
:
|
|||
|
}
|
|||
|
|
|||
|
function comment () {
|
|||
|
if [ "$comment_is_option" ]
|
|||
|
then
|
|||
|
comment_is_option=
|
|||
|
echo >>$CONFIG
|
|||
|
echo "#" >>$CONFIG
|
|||
|
echo "# $1" >>$CONFIG
|
|||
|
echo "#" >>$CONFIG
|
|||
|
|
|||
|
echo >>$CONFIG_H
|
|||
|
echo "/*" >>$CONFIG_H
|
|||
|
echo " * $1" >>$CONFIG_H
|
|||
|
echo " */" >>$CONFIG_H
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
echo -n "."
|
|||
|
|
|||
|
DEF_CONFIG="${1:-.config}"
|
|||
|
DEF_CONFIG_H="autoconf.h"
|
|||
|
|
|||
|
CONFIG=.tmpconfig
|
|||
|
CONFIG_H=.tmpconfig.h
|
|||
|
|
|||
|
echo "#" >$CONFIG
|
|||
|
echo "# Automatically generated by make menuconfig: don't edit" >>$CONFIG
|
|||
|
echo "#" >>$CONFIG
|
|||
|
|
|||
|
echo "/*" >$CONFIG_H
|
|||
|
echo " * Automatically generated by make menuconfig: don't edit" >>$CONFIG_H
|
|||
|
echo " */" >>$CONFIG_H
|
|||
|
echo "#define AUTOCONF_INCLUDED" >> $CONFIG_H
|
|||
|
|
|||
|
echo -n "."
|
|||
|
if . $CONFIG_IN >>.menuconfig.log 2>&1
|
|||
|
then
|
|||
|
if [ "$DEF_CONFIG" = ".config" ]
|
|||
|
then
|
|||
|
mv $CONFIG_H $DEF_CONFIG_H
|
|||
|
fi
|
|||
|
|
|||
|
if [ -f "$DEF_CONFIG" ]
|
|||
|
then
|
|||
|
rm -f ${DEF_CONFIG}.old
|
|||
|
mv $DEF_CONFIG ${DEF_CONFIG}.old
|
|||
|
fi
|
|||
|
|
|||
|
mv $CONFIG $DEF_CONFIG
|
|||
|
|
|||
|
return 0
|
|||
|
else
|
|||
|
return 1
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
# Remove temporary files
|
|||
|
#
|
|||
|
cleanup () {
|
|||
|
cleanup1
|
|||
|
cleanup2
|
|||
|
}
|
|||
|
|
|||
|
cleanup1 () {
|
|||
|
rm -f MCmenu* MCradiolists MCdialog.out help.out
|
|||
|
}
|
|||
|
|
|||
|
cleanup2 () {
|
|||
|
rm -f .tmpconfig .tmpconfig.h
|
|||
|
}
|
|||
|
|
|||
|
set_geometry () {
|
|||
|
# Some distributions export these with incorrect values
|
|||
|
# which can really screw up some ncurses programs.
|
|||
|
LINES= COLUMNS=
|
|||
|
|
|||
|
ROWS=${1:-24} COLS=${2:-80}
|
|||
|
|
|||
|
# Just in case the nasty rlogin bug returns.
|
|||
|
#
|
|||
|
[ $ROWS = 0 ] && ROWS=24
|
|||
|
[ $COLS = 0 ] && COLS=80
|
|||
|
|
|||
|
if [ $ROWS -lt 19 -o $COLS -lt 80 ]
|
|||
|
then
|
|||
|
echo -e "\n\007Your display is too small to run Menuconfig!"
|
|||
|
echo "It must be at least 19 lines by 80 columns."
|
|||
|
exit 1
|
|||
|
fi
|
|||
|
|
|||
|
ROWS=$((ROWS-4)) COLS=$((COLS-5))
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
set_geometry `stty size 2>/dev/null`
|
|||
|
|
|||
|
menu_instructions="\
|
|||
|
Arrow keys navigate the menu. \
|
|||
|
<Enter> selects submenus --->. \
|
|||
|
Highlighted letters are hotkeys. \
|
|||
|
Pressing <Y> includes, <N> excludes. <Esc><Esc> to exit, <?> for Help. \
|
|||
|
Legend: [*] enabled [ ] disabled [-] not available"
|
|||
|
|
|||
|
radiolist_instructions="\
|
|||
|
Use the arrow keys to navigate this window or \
|
|||
|
press the hotkey of the item you wish to select \
|
|||
|
followed by the <SPACE BAR>.
|
|||
|
Press <?> for additional information about this option."
|
|||
|
|
|||
|
inputbox_instructions_int="\
|
|||
|
Please enter a decimal value. \
|
|||
|
Fractions will not be accepted. \
|
|||
|
Use the <TAB> key to move from the input field to the buttons below it."
|
|||
|
|
|||
|
inputbox_instructions_hex="\
|
|||
|
Please enter a hexadecimal string. \
|
|||
|
Use the <TAB> key to move from the input field to the buttons below it."
|
|||
|
|
|||
|
inputbox_instructions_string="\
|
|||
|
Please enter a string value. \
|
|||
|
Use the <TAB> key to move from the input field to the buttons below it."
|
|||
|
|
|||
|
DIALOG="./scripts/lxdialog/lxdialog"
|
|||
|
|
|||
|
backtitle="Borg Configuration"
|
|||
|
|
|||
|
trap "cleanup ; exit 1" 1 2 15
|
|||
|
|
|||
|
|
|||
|
#
|
|||
|
# Locate default files.
|
|||
|
#
|
|||
|
CONFIG_IN=./config.in
|
|||
|
if [ "$1" != "" ] ; then
|
|||
|
CONFIG_IN=$1
|
|||
|
fi
|
|||
|
|
|||
|
DEFAULTS=scripts/profiles/defconfig
|
|||
|
if [ -f .config ]; then
|
|||
|
DEFAULTS=.config
|
|||
|
fi
|
|||
|
|
|||
|
if [ -f $DEFAULTS ]
|
|||
|
then
|
|||
|
echo "Using defaults found in" $DEFAULTS
|
|||
|
load_config_file $DEFAULTS
|
|||
|
else
|
|||
|
echo "No defaults found"
|
|||
|
fi
|
|||
|
|
|||
|
|
|||
|
# Fresh new log.
|
|||
|
>.menuconfig.log
|
|||
|
|
|||
|
# Load the functions used by the config.in files.
|
|||
|
echo -n "Preparing scripts: functions"
|
|||
|
load_functions
|
|||
|
|
|||
|
if [ ! -e $CONFIG_IN ]
|
|||
|
then
|
|||
|
echo "Your main config.in file ($CONFIG_IN) does not exist"
|
|||
|
exit 1
|
|||
|
fi
|
|||
|
|
|||
|
if [ ! -x $DIALOG ]
|
|||
|
then
|
|||
|
echo "Your lxdialog utility does not exist"
|
|||
|
exit 1
|
|||
|
fi
|
|||
|
|
|||
|
#
|
|||
|
# Read config.in files and parse them into one shell function per menu.
|
|||
|
#
|
|||
|
echo -n ", parsing"
|
|||
|
parse_config_files $CONFIG_IN
|
|||
|
|
|||
|
echo "done."
|
|||
|
#
|
|||
|
# Start the ball rolling from the top.
|
|||
|
#
|
|||
|
activate_menu MCmenu0
|
|||
|
|
|||
|
#
|
|||
|
# All done!
|
|||
|
#
|
|||
|
cleanup1
|
|||
|
|
|||
|
#
|
|||
|
# Confirm and Save
|
|||
|
#
|
|||
|
if $DIALOG --backtitle "$backtitle" \
|
|||
|
--yesno "Do you wish to save your new Borg configuration?" 5 60
|
|||
|
then
|
|||
|
save_configuration
|
|||
|
echo
|
|||
|
echo
|
|||
|
echo "*** End of Borg configuration."
|
|||
|
echo
|
|||
|
else
|
|||
|
echo
|
|||
|
echo
|
|||
|
echo Your Borg configuration changes were NOT saved.
|
|||
|
echo
|
|||
|
fi
|
|||
|
|
|||
|
# Remove log if empty.
|
|||
|
if [ ! -s .menuconfig.log ] ; then
|
|||
|
rm -f .menuconfig.log
|
|||
|
fi
|
|||
|
|
|||
|
exit 0
|