Author: dteske
Date: Fri Oct 11 23:12:05 2013
New Revision: 256361
URL: http://svnweb.freebsd.org/changeset/base/256361

Log:
  MFC revisions 256321-256323,256331,256333,256335,256343:
  Bring in a new zfsboot auto script for performing automatic setup of a boot
  pool (optionally encrypted) with many other options, validations, features.
  Originally submitted by Allan Jude; modified in collaboration.
  
  MFC revisions 256325,256330,256345:
  Rewrite the keymap selection menu to display keymaps and provide a test
  mechanism. Test mechanism originally submitted by Warren Block; modified.
  
  MFC r256347:
  Prominently display "Wireless" for each wireless network interface. Part
  of PR bin/161547; submitted by Warren Block; slightly modified.
  
  MFC r256348:
  Remove the dumpdev configuration dialog, merge it into the regular
  services configuration and enable it by default. Originally submitted by
  Allan Jude; slightly modified.
  
  PR:           bin/161547
  Submitted by: Allan Jude, Warren Block <wbl...@wonkity.com>
  In collaboration with:        Allan Jude <free...@allanjude.com>
  Approved by:  re (glebius)

Added:
  stable/10/usr.sbin/bsdconfig/share/keymap.subr
     - copied unchanged from r256325, head/usr.sbin/bsdconfig/share/keymap.subr
  stable/10/usr.sbin/bsdinstall/scripts/zfsboot
     - copied unchanged from r256343, head/usr.sbin/bsdinstall/scripts/zfsboot
Modified:
  stable/10/usr.sbin/bsdconfig/include/messages.subr
  stable/10/usr.sbin/bsdconfig/share/Makefile
  stable/10/usr.sbin/bsdconfig/share/device.subr
  stable/10/usr.sbin/bsdconfig/share/dialog.subr
  stable/10/usr.sbin/bsdconfig/share/strings.subr
  stable/10/usr.sbin/bsdconfig/share/variable.subr
  stable/10/usr.sbin/bsdinstall/bsdinstall
  stable/10/usr.sbin/bsdinstall/scripts/Makefile
  stable/10/usr.sbin/bsdinstall/scripts/auto
  stable/10/usr.sbin/bsdinstall/scripts/config
  stable/10/usr.sbin/bsdinstall/scripts/keymap
  stable/10/usr.sbin/bsdinstall/scripts/netconfig
  stable/10/usr.sbin/bsdinstall/scripts/services
Directory Properties:
  stable/10/usr.sbin/bsdconfig/   (props changed)
  stable/10/usr.sbin/bsdinstall/   (props changed)

Modified: stable/10/usr.sbin/bsdconfig/include/messages.subr
==============================================================================
--- stable/10/usr.sbin/bsdconfig/include/messages.subr  Fri Oct 11 23:11:33 
2013        (r256360)
+++ stable/10/usr.sbin/bsdconfig/include/messages.subr  Fri Oct 11 23:12:05 
2013        (r256361)
@@ -201,6 +201,7 @@ msg_lithuania="Lithuania"
 msg_loading_of_dependent_package_failed="Loading of dependent package %s 
failed"
 msg_located_index_now_reading_package_data_from_it="Located INDEX, now reading 
package data from it..."
 msg_logging_in_to_user_at_host="Logging in to %s@%s.."
+msg_looking_for_keymap_files="Looking for keymap files..."
 msg_looking_up_host="Looking up host %s"
 msg_mail_desc="Electronic mail packages and utilities."
 msg_main_menu="Main Menu"

Modified: stable/10/usr.sbin/bsdconfig/share/Makefile
==============================================================================
--- stable/10/usr.sbin/bsdconfig/share/Makefile Fri Oct 11 23:11:33 2013        
(r256360)
+++ stable/10/usr.sbin/bsdconfig/share/Makefile Fri Oct 11 23:12:05 2013        
(r256361)
@@ -5,8 +5,9 @@ NO_OBJ=
 SUBDIR=        media packages
 
 FILESDIR=      ${SHAREDIR}/bsdconfig
-FILES=         common.subr device.subr dialog.subr mustberoot.subr \
-               script.subr strings.subr struct.subr sysrc.subr variable.subr
+FILES=         common.subr device.subr dialog.subr keymap.subr \
+               mustberoot.subr script.subr strings.subr struct.subr \
+               sysrc.subr variable.subr
 
 beforeinstall:
        mkdir -p ${DESTDIR}${FILESDIR}

Modified: stable/10/usr.sbin/bsdconfig/share/device.subr
==============================================================================
--- stable/10/usr.sbin/bsdconfig/share/device.subr      Fri Oct 11 23:11:33 
2013        (r256360)
+++ stable/10/usr.sbin/bsdconfig/share/device.subr      Fri Oct 11 23:12:05 
2013        (r256361)
@@ -49,6 +49,7 @@ f_struct_define DEVICE \
        desc            \
        devname         \
        type            \
+       capacity        \
        enabled         \
        init            \
        get             \
@@ -114,7 +115,7 @@ f_device_try()
 }
 
 # f_device_register $name $desc $devname $type $enabled $init_function \
-#                   $get_function $shutdown_function $private
+#                   $get_function $shutdown_function $private $capacity
 #
 # Register a device. A `structure' (see struct.subr) is created with the name
 # device_$name (so make sure $name contains only alpha-numeric characters or
@@ -128,6 +129,7 @@ f_device_register()
 {
        local name="$1" desc="$2" devname="$3" type="$4" enabled="$5"
        local init_func="$6" get_func="$7" shutdown_func="$8" private="$9"
+       local capacity="${10}"
 
        f_struct_new DEVICE "device_$name" || return $FAILURE
        device_$name set name     "$name"
@@ -139,6 +141,7 @@ f_device_register()
        device_$name set get      "$get_func"
        device_$name set shutdown "$shutdown_func"
        device_$name set private  "$private"
+       device_$name set capacity "$capacity"
 
        # Scan our global register to see if it needs ammending
        local dev found=
@@ -196,7 +199,7 @@ f_device_get_all()
                f_dprintf "Found a network device named %s" "$devname"
                f_device_register $devname \
                        "$desc" "$devname" $DEVICE_TYPE_NETWORK 1 \
-                       f_media_init_network "" f_media_shutdown_network ""
+                       f_media_init_network "" f_media_shutdown_network "" -1
        done
 
        # Next, try to find all the types of devices one might use
@@ -208,6 +211,10 @@ f_device_get_all()
                n=$(( $n + 1 ))
                # Get the desc, type, and max (with debugging disabled)
                # NOTE: Bypassing f_device_name_get() for efficiency
+               # ASIDE: This would be equivalent to the following:
+               #       debug= f_device_name_get $dev desc
+               #       debug= f_device_name_get $dev type
+               #       debug= f_device_name_get $dev max
                debug= f_getvar _device_desc$n desc
                debug= f_getvar _device_type$n type
                debug= f_getvar _device_max$n max
@@ -222,7 +229,8 @@ f_device_get_all()
                                f_device_register "${devname##*/}" "$desc" \
                                        "$devname" $DEVICE_TYPE_CDROM 1 \
                                        f_media_init_cdrom f_media_get_cdrom \
-                                       f_media_shutdown_cdrom ""
+                                       f_media_shutdown_cdrom "" \
+                                       "$( f_device_capacity "$devname" )"
                                f_dprintf "Found a CDROM device for %s" \
                                          "$devname"
                                ;;
@@ -232,7 +240,8 @@ f_device_get_all()
                                        "$devname" $DEVICE_TYPE_FLOPPY 1 \
                                        f_media_init_floppy \
                                        f_media_get_floppy \
-                                       f_media_shutdown_floppy ""
+                                       f_media_shutdown_floppy "" \
+                                       "$( f_device_capacity "$devname" )"
                                f_dprintf "Found a floppy device for %s" \
                                          "$devname"
                                ;;
@@ -241,7 +250,8 @@ f_device_get_all()
                                f_device_register "${devname##*/}" "$desc" \
                                        "$devname" $DEVICE_TYPE_USB 1 \
                                        f_media_init_usb f_media_get_usb \
-                                       f_media_shutdown_usb ""
+                                       f_media_shutdown_usb "" \
+                                       "$( f_device_capacity "$devname" )"
                                f_dprintf "Found a USB disk for %s" "$devname"
                                ;;
                        esac
@@ -254,7 +264,8 @@ f_device_get_all()
                f_device_register "${devname##*/}" "ISO9660 file system" \
                        "$devname" $DEVICE_TYPE_CDROM 1 \
                        f_media_init_cdrom f_media_get_cdrom \
-                       f_media_shutdown_cdrom ""
+                       f_media_shutdown_cdrom "" \
+                       "$( f_device_capacity "$devname" )"
                f_dprintf "Found a CDROM device for %s" "$devname"
        done
 
@@ -281,7 +292,8 @@ f_device_get_all()
                                "md(4) vnode file system" \
                                "$devname" $DEVICE_TYPE_CDROM 1 \
                                f_media_init_cdrom f_media_get_cdrom \
-                               f_media_shutdown_cdrom ""
+                               f_media_shutdown_cdrom "" \
+                               "$( f_device_capacity "$devname" )"
                        f_dprintf "Found a CDROM device for %s" "$devname"
                        ;;
                esac
@@ -313,8 +325,13 @@ f_device_get_all()
                        continue
                fi
 
-               f_device_register "$diskname" "" \
-                                 "/dev/$diskname" $DEVICE_TYPE_DISK 0
+               # Try and find its description
+               f_device_desc "$diskname" $DEVICE_TYPE_DISK desc
+
+               f_device_register "$diskname" "$desc" \
+                                 "/dev/$diskname" $DEVICE_TYPE_DISK 0 \
+                                 "" "" "" "" \
+                                 "$( f_device_capacity "$diskname" )"
                f_dprintf "Found a disk device named %s" "$diskname"
 
                # Look for existing partitions to register
@@ -327,7 +344,8 @@ f_device_get_all()
                                f_device_register "$slice" "" \
                                        "/dev/$slice" $DEVICE_TYPE_DOS 1 \
                                        f_media_init_dos f_media_get_dos \
-                                       f_media_shutdown_dos ""
+                                       f_media_shutdown_dos "" \
+                                       "$( f_device_capacity "/dev/$slice" )"
                                f_dprintf "Found a DOS partition %s" "$slice"
                                ;;
                        0xa5) # FreeBSD partition
@@ -347,7 +365,9 @@ f_device_get_all()
                                                $DEVICE_TYPE_UFS 1 \
                                                f_media_init_ufs \
                                                f_media_get_ufs \
-                                               f_media_shutdown_ufs ""
+                                               f_media_shutdown_ufs "" \
+                                               "$( f_device_capacity \
+                                                       "$/dev/$part" )"
                                        f_dprintf "Found a UFS partition %s" \
                                                  "$part"
                                done # parts
@@ -379,10 +399,27 @@ f_device_name_get()
        case "$__prop" in type|desc|max) : good ;;
        *) return $FAILURE; esac
 
+       #
+       # Attempt to create an alternate-form of $__name that contains the
+       # first contiguous string of numbers replaced with `%d' for comparison
+       # against stored pattern names (see MAIN).
+       #
+       local __left="${__name%%[0-9]*}" __right="${__name#*[0-9]}" __dname=
+       if [ "$__left" != "$__name" ]; then
+               # Chop leading digits from right 'til we hit first non-digit
+               while :; do
+                       case "$__right" in
+                       [0-9]*) __right="${__right#[0-9]}" ;;
+                            *) break
+                       esac
+               done
+               __dname="${__left}%d$__right"
+       fi
+
        [ "$__type" = "$DEVICE_TYPE_ANY" ] && __type=
        for __dev in $DEVICE_NAMES; do
                __n=$(( $__n + 1 ))
-               [ "$__dev" = "$__name" ] || continue
+               [ "$__dev" = "$__name" -o "$__dev" = "$__dname" ] || continue
                f_getvar _device_type$__n __devtype
                [ "${__type:-$__devtype}" = "$__devtype" ] || continue
                f_getvar _device_$__prop$__n $__var_to_set
@@ -463,6 +500,39 @@ f_device_desc()
                fi
        fi
 
+       #
+       # For disks, attempt to return camcontrol(8) descriptions.
+       # Otherwise fall through to below static list.
+       #
+       f_have camcontrol &&
+       [ "${__type:-$DEVICE_TYPE_DISK}" = "$DEVICE_TYPE_DISK" ] &&
+       __cp=$( camcontrol devlist 2> /dev/null | awk -v disk="$__name" '
+               $0~"(\\(|,)"disk"(,|\\))" {
+                       if (!match($0, "<[^>]+>")) next
+                       print substr($0, RSTART+1, RLENGTH-2)
+                       found = 1
+                       exit
+               }
+               END { exit ! found }
+       ' ) && setvar "$__var_to_set" "$__cp" && return $SUCCESS
+
+       #
+       # Attempt to create an alternate-form of $__name that contains the
+       # first contiguous string of numbers replaced with `%d' for comparison
+       # against stored pattern names (see MAIN).
+       #
+       local __left="${__name%%[0-9]*}" __right="${__name#*[0-9]}" __dname=
+       if [ "$__left" != "$__name" ]; then
+               # Chop leading digits from right 'til we hit first non-digit
+               while :; do
+                       case "$__right" in
+                       [0-9]*) __right="${__right#[0-9]}" ;;
+                            *) break
+                       esac
+               done
+               __dname="${__left}%d$__right"
+       fi
+
        local __dev __devtype __n=0
        for __dev in $DEVICE_NAMES; do
                __n=$(( $__n + 1 ))
@@ -472,11 +542,8 @@ f_device_desc()
                        __devname=$( f_substr "$__name" 0 ${#__dev} )
                        [ "$__devname" = "$__dev" ] || continue
                else
-                       __devname="${__name%%[0-9]*}"
-                       __devunit="${__name#$__devname}"
-                       __devunit="${__devunit%%[!0-9]*}"
-                       __devname=$( printf "$__dev" $__devunit )
-                       [ "$__devname" = "$__name" ] || continue
+                       [ "$__dev" = "$__name" -o "$__dev" = "$__dname" ] ||
+                               continue
                fi
                debug= f_getvar _device_desc$__n $__var_to_set
                return $?
@@ -655,6 +722,25 @@ f_device_menu()
        return $retval
 }
 
+# f_device_capacity $device [$var_to_set]
+#
+# Return the capacity of $device in bytes.
+#
+f_device_capacity()
+{
+       local __dev="$1" __var_to_set="$2"
+       local __bytes
+
+       __bytes=$( diskinfo -v "$__dev" 2> /dev/null |
+               awk '/# mediasize in bytes/{print $1}' ) || __bytes=-1
+
+       if [ "$__var_to_set" ]; then
+               setvar "$__var_to_set" "$__bytes"
+       else
+               echo "$__bytes"
+       fi
+}
+
 #
 # Short-hand
 #
@@ -680,6 +766,7 @@ f_disk   "ipsd%d" "IBM ServeRAID RAID ar
 f_disk   "mfid%d" "LSI MegaRAID SAS array"            4
 f_disk   "mlxd%d" "Mylex RAID disk"                   4
 f_disk   "twed%d" "3ware ATA RAID array"              4
+f_disk   "vtbd%d" "VirtIO Block Device"               16
 f_floppy "fd%d"   "Floppy Drive unit A"               4
 f_serial "cuau%d" "%s on device %s (COM%d)"           16
 f_usb    "da%da"  "USB Mass Storage Device"           16

Modified: stable/10/usr.sbin/bsdconfig/share/dialog.subr
==============================================================================
--- stable/10/usr.sbin/bsdconfig/share/dialog.subr      Fri Oct 11 23:11:33 
2013        (r256360)
+++ stable/10/usr.sbin/bsdconfig/share/dialog.subr      Fri Oct 11 23:12:05 
2013        (r256361)
@@ -415,8 +415,8 @@ f_dialog_size_constrain()
 
        if [ "$debug" ]; then
                # Print final constrained values to debugging
-               f_quietly f_getvar "$__var_height"
-               f_quietly f_getvar "$__var_width"
+               [ "$__var_height" ] && f_quietly f_getvar "$__var_height"
+               [ "$__var_width"  ] && f_quietly f_getvar "$__var_width"
        fi
 
        return $__retval # success if no debug warnings were printed
@@ -532,10 +532,10 @@ f_dialog_menu_constrain()
        fi
 
        if [ "$debug" ]; then
-               # Print final constrained values to debuggin
-               f_quietly f_getvar "$__var_height"
-               f_quietly f_getvar "$__var_width"
-               f_quietly f_getvar "$__var_rows"
+               # Print final constrained values to debugging
+               [ "$__var_height" ] && f_quietly f_getvar "$__var_height"
+               [ "$__var_width"  ] && f_quietly f_getvar "$__var_width"
+               [ "$__var_rows"   ] && f_quietly f_getvar "$__var_rows"
        fi
 
        return $__retval # success if no debug warnings were printed
@@ -2044,6 +2044,7 @@ f_dialog_menutag2index_with_help()
 f_dialog_init()
 {
        DIALOG_SELF_INITIALIZE=
+       USE_DIALOG=1
 
        #
        # Clone terminal stdout so we can redirect to it from within sub-shells
@@ -2087,7 +2088,7 @@ f_dialog_init()
        #
        # Process `-X' command-line option
        #
-       [ "$USE_XDIALOG" ] && DIALOG=Xdialog
+       [ "$USE_XDIALOG" ] && DIALOG=Xdialog USE_DIALOG=
 
        #
        # Sanity check, or die gracefully

Copied: stable/10/usr.sbin/bsdconfig/share/keymap.subr (from r256325, 
head/usr.sbin/bsdconfig/share/keymap.subr)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ stable/10/usr.sbin/bsdconfig/share/keymap.subr      Fri Oct 11 23:12:05 
2013        (r256361, copy of r256325, 
head/usr.sbin/bsdconfig/share/keymap.subr)
@@ -0,0 +1,262 @@
+if [ ! "$_KEYMAP_SUBR" ]; then _KEYMAP_SUBR=1
+#
+# Copyright (c) 2013 Devin Teske
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+############################################################ INCLUDES
+
+BSDCFG_SHARE="/usr/share/bsdconfig"
+. $BSDCFG_SHARE/common.subr || exit 1
+f_dprintf "%s: loading includes..." keymap.subr
+f_include $BSDCFG_SHARE/struct.subr
+
+############################################################ CONFIGURATION
+
+#
+# Defaults taken from usr.sbin/kbdmap/kbdmap.h
+#
+: ${DEFAULT_LANG:=en}
+: ${DEFAULT_KEYMAP_DIR:=/usr/share/syscons/keymaps}
+
+############################################################ GLOBALS
+
+KEYMAPS=
+
+# A "keymap" from kbdmap's point of view
+f_struct_define KEYMAP \
+       desc \
+       keym \
+       mark
+
+#
+# Default behavior is to call f_keymap_get_all() automatically when loaded.
+#
+: ${KEYMAP_SELF_SCAN_ALL=1}
+
+############################################################ FUNCTIONS
+
+# f_keymap_register $name $desc $keym $mark
+#
+# Register a keymap. A `structure' (see struct.subr) is created with the name
+# keymap_$name (so make sure $name contains only alpha-numeric characters or
+# the underscore, `_'). The remaining arguments after $name correspond to the
+# propertise of the `KEYMAP' structure-type (defined above).
+#
+# If not already registered, the keymap is then appended to the KEYMAPS
+# environment variable, a space-separated list of all registered keymaps.
+#
+f_keymap_register()
+{
+       local name="$1" desc="$2" keym="$3" mark="$4"
+
+       f_struct_new KEYMAP "keymap_$name" || return $FAILURE
+       keymap_$name set desc "$desc"
+       keymap_$name set keym "$keym"
+       keymap_$name set mark "$mark"
+
+       # Scan our global register to see if needs ammending
+       local k found=
+       for k in $KEYMAPS; do
+               [ "$k" = "$name" ] || continue
+               found=1 && break
+       done
+       [ "$found" ] || KEYMAPS="$KEYMAPS $name"
+
+       return $SUCCESS
+}
+
+# f_keymap_checkfile $keymap
+#
+# Check that $keymap is a readable kbdmap(5) file. Returns success if $keymap
+# is a file, is readable, and exists in $DEFAULT_KEYMAP_DIR; otherwise failure.
+# If debugging is enabled, an appropriate debug error message is printed if
+# $keymap is not available.
+#
+f_keymap_checkfile()
+{
+       local keym="$1"
+       
+       # Fixup keymap if it doesn't already contain at least one `/'
+       [ "${keym#*/}" = "$keym" ] && keym="$DEFAULT_KEYMAP_DIR/$keym"
+
+       # Short-cuts
+       [ -f "$keym" -a -r "$keym" ] && return $SUCCESS
+       f_debugging || return $FAILURE
+
+       # Print an appropriate debug error message
+       if [ ! -e "$keym" ]; then
+               f_dprintf "%s: No such file or directory" "$keym"
+       elif [ ! -f "$keym" ]; then
+               f_dprintf "%s: Not a file!" "$keym"
+       elif [ ! -r "$keym" ]; then
+               f_dprintf "%s: Permission denied" "$keym"
+       fi
+
+       return $FAILURE
+}
+
+# f_keymap_get_all
+#
+# Get all keymap information for kbdmap(5) entries both in the database and
+# loosely existing in $DEFAULT_KEYMAP_DIR.
+#
+f_keymap_get_all()
+{
+       local fname=f_keymap_get_all
+       local lang="${LC_ALL:-${LC_CTYPE:-${LANG:-$DEFAULT_LANG}}}"
+       [ "$lang" = "C" ] && lang="$DEFAULT_LANG"
+
+       f_dprintf "%s: Looking for keymap files..." $fname
+       f_dialog_info "$msg_looking_for_keymap_files"
+       f_dprintf "DEFAULT_LANG=[%s]" "$DEFAULT_LANG"
+
+       eval "$( awk -F: -v lang="$lang" -v lang_default="$DEFAULT_LANG" '
+               BEGIN {
+                       # en_US.ISO8859-1 -> en_..\.ISO8859-1
+                       dialect = lang
+                       if (length(dialect) >= 6 &&
+                           substr(dialect, 3, 1) == "_")
+                               dialect = substr(dialect, 1, 3) ".." \
+                                         substr(dialect, 6)
+                       printf "f_dprintf \"dialect=[%%s]\" \"%s\";\n", dialect
+
+                       # en_US.ISO8859-1 -> en
+                       lang_abk = lang
+                       if (length(lang_abk) >= 3 &&
+                           substr(lang_abk, 3, 1) == "_")
+                               lang_abk = substr(lang_abk, 1, 2)
+                       printf "f_dprintf \"lang_abk=[%%s]\" \"%s\";\n",
+                              lang_abk
+               }
+               function find_token(buffer, token)
+               {
+                       if (split(buffer, tokens, /,/) == 0) return 0
+                       found = 0
+                       for (t in tokens)
+                               if (token == tokens[t]) { found = 1; break }
+                       return found
+               }
+               function add_keymap(desc,mark,keym)
+               {
+                       marks[keym] = mark
+                       name = keym
+                       gsub(/[^[:alnum:]_]/, "_", name)
+                       gsub(/'\''/, "'\''\\'\'''\''", desc);
+                       printf "f_keymap_checkfile %s && " \
+                              "f_keymap_register %s '\'%s\'' %s %u\n",
+                              keym, name, desc, keym, mark
+               }
+               !/^[[:space:]]*(#|$)/ {
+                       sub(/^[[:space:]]*/, "", $0)
+                       keym = $1
+                       if (keym ~ /^(MENU|FONT)$/) next
+                       lg = ($2 == "" ? lang_default : $2)
+
+                       # Match the entry and store the type of match we made
+                       # as the mark value (so that if we make a better match
+                       # later on with a higher mark, it overwrites previous)
+
+                       mark = marks[keym];
+                       if (find_token(lg, lang))
+                               add_keymap($3, 4, keym) # Best match
+                       else if (mark <= 3 && find_token(lg, dialect))
+                               add_keymap($3, 3, keym)
+                       else if (mark <= 2 && find_token(lg, lang_abk))
+                               add_keymap($3, 2, keym)
+                       else if (mark <= 1 && find_token(lg, lang_default))
+                               add_keymap($3, 1, keym)
+                       else if (mark <= 0)
+                               add_keymap($3, 0, keym)
+               }
+       ' "$DEFAULT_KEYMAP_DIR/INDEX.${DEFAULT_KEYMAP_DIR##*/}" )"
+
+
+       #
+       # Look for keymaps not in database
+       #
+       local direntry keym name
+       set +f # glob
+       for direntry in "$DEFAULT_KEYMAP_DIR"/*; do
+               [ "${direntry##*.}" = ".kbd" ] || continue
+               keym="${direntry##*/}"
+               f_str2varname "$keym" name
+               f_struct keymap_$name && continue
+               f_keymap_checkfile "$keym" &&
+                       f_keymap_register $name "${keym%.*}" "$keym" 0
+               f_dprintf "%s: not in kbdmap(5) database" "$keym"
+       done
+
+       #
+       # Sort the items by their descriptions
+       #
+       f_dprintf "%s: Sorting keymap entries by description..." $fname
+       KEYMAPS=$(
+               for k in $KEYMAPS; do
+                       echo -n "$k "
+                       # NOTE: Translate '8x8' to '8x08' before sending to
+                       # sort(1) so that things work out as we might expect.
+                       debug= keymap_$k get desc | sed -e 's/8x8/8x08/g'
+               done | sort -k2 | awk '{
+                       printf "%s%s", (started ? " " : ""), $1; started = 1
+               }'
+       )
+
+       return $SUCCESS
+}
+
+# f_keymap_kbdcontrol $keymap
+#
+# Install keyboard map file from $keymap.
+#
+f_keymap_kbdcontrol()
+{
+       local keymap="$1"
+
+       [ "$keymap" ] || return $SUCCESS
+
+       # Fixup keymap if it doesn't already contain at least one `/'
+       [ "${keymap#*/}" = "$keymap" ] && keymap="$DEFAULT_KEYMAP_DIR/$keymap"
+
+       [ "$USE_XDIALOG" ] || kbdcontrol -l "$keymap"
+}
+
+############################################################ MAIN
+
+#
+# Scan for keymaps unless requeted otherwise
+#
+f_dprintf "%s: KEYMAP_SELF_SCAN_ALL=[%s]" keymap.subr "$KEYMAP_SELF_SCAN_ALL"
+case "$KEYMAP_SELF_SCAN_ALL" in
+""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;;
+*) f_keymap_get_all
+esac
+
+f_dprintf "%s: Found %u keymap file(s)." keymap.subr \
+          "$( set -- $KEYMAPS; echo $# )"
+
+f_dprintf "%s: Successfully loaded." keymap.subr
+
+fi # ! $_KEYMAP_SUBR

Modified: stable/10/usr.sbin/bsdconfig/share/strings.subr
==============================================================================
--- stable/10/usr.sbin/bsdconfig/share/strings.subr     Fri Oct 11 23:11:33 
2013        (r256360)
+++ stable/10/usr.sbin/bsdconfig/share/strings.subr     Fri Oct 11 23:12:05 
2013        (r256361)
@@ -26,6 +26,11 @@ if [ ! "$_STRINGS_SUBR" ]; then _STRINGS
 #
 # $FreeBSD$
 #
+############################################################ INCLUDES
+
+BSDCFG_SHARE="/usr/share/bsdconfig"
+. $BSDCFG_SHARE/common.subr || exit 1
+
 ############################################################ GLOBALS
 
 #
@@ -319,6 +324,112 @@ f_shell_unescape()
        f_replaceall "$__string" "'\\''" "'" "$__var_to_set"
 }
 
+# f_expand_number $string [$var_to_set]
+#
+# Unformat $string into a number, optionally to be stored in $var_to_set. This
+# function follows the SI power of two convention.
+#
+# The prefixes are:
+#
+#      Prefix  Description     Multiplier
+#      k       kilo            1024
+#      M       mega            1048576
+#      G       giga            1073741824
+#      T       tera            1099511627776
+#      P       peta            1125899906842624
+#      E       exa             1152921504606846976
+#
+# NOTE: Prefixes are case-insensitive.
+#
+# Upon successful completion, the value 0 is returned (or stored to
+# $var_to_set); otherwise -1. Reasons for a -1 return include:
+#
+#      Given $string contains no digits.
+#      An unrecognized prefix was given.
+#      Result too large to calculate.
+#
+f_expand_number()
+{
+       local __string="$1" __var_to_set="$2"
+       local __cp __num
+
+       # Remove any leading non-digits
+       while :; do
+               __cp="$__string"
+               __string="${__cp#[!0-9]}"
+               [ "$__string" = "$__cp" ] && break
+       done
+
+       # Return `-1' if string didn't contain any digits
+       if [ ! "$__string" ]; then
+               if [ "$__var_to_set" ]; then
+                       setvar "$__var_to_set" -1
+               else
+                       echo -1
+               fi
+               return $FAILURE
+       fi
+
+       # Store the numbers
+       __num="${__string%%[!0-9]*}"
+
+       # Shortcut
+       if [ $__num -eq 0 ]; then
+               if [ "$__var_to_set" ]; then
+                       setvar "$__var_to_set" 0
+               else
+                       echo 0
+               fi
+               return $SUCCESS
+       fi
+
+       # Remove all the leading numbers from the string to get at the prefix
+       while :; do
+               __cp="$__string"
+               __string="${__cp#[0-9]}"
+               [ "$__string" = "$__cp" ] && break
+       done
+
+       # Test for invalid prefix
+       case "$__string" in
+       ""|[KkMmGgTtPpEe]*) : known prefix ;;
+       *)
+               # Unknown prefix
+               if [ "$__var_to_set" ]; then
+                       setvar "$__var_to_set" -1
+               else
+                       echo -1
+               fi
+               return $FAILURE
+       esac
+
+       # Multiply the number out
+       case "$__string" in
+       [Kk]) __num=$(( $__num * 1024 )) ;;
+       [Mm]) __num=$(( $__num * 1048576 )) ;;
+       [Gg]) __num=$(( $__num * 1073741824 )) ;;
+       [Tt]) __num=$(( $__num * 1099511627776 )) ;;
+       [Pp]) __num=$(( $__num * 1125899906842624 )) ;;
+       [Ee]) __num=$(( $__num * 1152921504606846976 )) ;;
+       esac
+       if [ $__num -le 0 ]; then
+               # Arithmetic overflow
+               if [ "$__var_to_set" ]; then
+                       setvar "$__var_to_set" -1
+               else
+                       echo -1
+               fi
+               return $FAILURE
+       fi
+
+       # Return the number
+       if [ "$__var_to_set" ]; then
+               setvar "$__var_to_set" $__num
+       else
+               echo $__num
+       fi
+}
+
 ############################################################ MAIN
 
 f_dprintf "%s: Successfully loaded." strings.subr

Modified: stable/10/usr.sbin/bsdconfig/share/variable.subr
==============================================================================
--- stable/10/usr.sbin/bsdconfig/share/variable.subr    Fri Oct 11 23:11:33 
2013        (r256360)
+++ stable/10/usr.sbin/bsdconfig/share/variable.subr    Fri Oct 11 23:12:05 
2013        (r256361)
@@ -205,6 +205,21 @@ f_netinteractive()
        f_getvar $VAR_NETINTERACTIVE value && [ "$value" ]
 }
 
+# f_zfsinteractive()
+#
+# Has the user specifically requested the ZFS-portion of configuration and
+# setup to be performed interactively? Returns success if the user has asked
+# for the ZFS configuration to be done interactively even if perhaps overall
+# non-interactive mode has been requested (by setting nonInteractive).
+#
+# Returns success if $zfsInteractive is set and non-NULL.
+#
+f_zfsinteractive()
+{
+       local value
+       f_getvar $VAR_ZFSINTERACTIVE value && [ "$value" ]
+}
+
 ############################################################ MAIN
 
 #
@@ -240,6 +255,7 @@ f_variable_new VAR_IFCONFIG         ifconfig_
 f_variable_new VAR_IPADDR              ipaddr
 f_variable_new VAR_IPV6ADDR            ipv6addr
 f_variable_new VAR_IPV6_ENABLE         ipv6_activate_all_interfaces
+f_variable_new VAR_KEYMAP              keymap
 f_variable_new VAR_MEDIA_TIMEOUT       MEDIA_TIMEOUT
 f_variable_new VAR_MEDIA_TYPE          mediaType
 f_variable_new VAR_NAMESERVER          nameserver
@@ -263,6 +279,7 @@ f_variable_new VAR_SLOW_ETHER               slowEther
 f_variable_new VAR_TRY_DHCP            tryDHCP
 f_variable_new VAR_TRY_RTSOL           tryRTSOL
 f_variable_new VAR_UFS_PATH            ufs
+f_variable_new VAR_ZFSINTERACTIVE      zfsInteractive
 
 #
 # Self-initialize unless requested otherwise

Modified: stable/10/usr.sbin/bsdinstall/bsdinstall
==============================================================================
--- stable/10/usr.sbin/bsdinstall/bsdinstall    Fri Oct 11 23:11:33 2013        
(r256360)
+++ stable/10/usr.sbin/bsdinstall/bsdinstall    Fri Oct 11 23:12:05 2013        
(r256361)
@@ -28,6 +28,7 @@
 
 : ${BSDINSTALL_LOG="/tmp/bsdinstall_log"}; export BSDINSTALL_LOG
 : ${BSDINSTALL_TMPETC="/tmp/bsdinstall_etc"}; export BSDINSTALL_TMPETC
+: ${BSDINSTALL_TMPBOOT="/tmp/bsdinstall_boot"}; export BSDINSTALL_TMPBOOT
 : ${PATH_FSTAB="$BSDINSTALL_TMPETC/fstab"}; export PATH_FSTAB
 : ${BSDINSTALL_DISTDIR="/usr/freebsd-dist"}; export BSDINSTALL_DISTDIR
 : ${BSDINSTALL_CHROOT="/mnt"}; export BSDINSTALL_CHROOT
@@ -35,5 +36,6 @@
 VERB=${1:-auto}; shift
 
 [ -d "$BSDINSTALL_TMPETC" ] || mkdir -p "$BSDINSTALL_TMPETC"
+[ -d "$BSDINSTALL_TMPBOOT" ] || mkdir -p "$BSDINSTALL_TMPBOOT"
 echo "Running installation step: $VERB $@" >> "$BSDINSTALL_LOG"
 exec "/usr/libexec/bsdinstall/$VERB" "$@" 2>> "$BSDINSTALL_LOG"

Modified: stable/10/usr.sbin/bsdinstall/scripts/Makefile
==============================================================================
--- stable/10/usr.sbin/bsdinstall/scripts/Makefile      Fri Oct 11 23:11:33 
2013        (r256360)
+++ stable/10/usr.sbin/bsdinstall/scripts/Makefile      Fri Oct 11 23:12:05 
2013        (r256361)
@@ -2,7 +2,7 @@
 
 SCRIPTS= auto adduser checksum config docsinstall entropy hostname jail \
         keymap mirrorselect mount netconfig netconfig_ipv4 netconfig_ipv6 \
-        rootpass script services time umount wlanconfig
+        rootpass script services time umount wlanconfig zfsboot
 BINDIR= /usr/libexec/bsdinstall
 
 NO_MAN=        true

Modified: stable/10/usr.sbin/bsdinstall/scripts/auto
==============================================================================
--- stable/10/usr.sbin/bsdinstall/scripts/auto  Fri Oct 11 23:11:33 2013        
(r256360)
+++ stable/10/usr.sbin/bsdinstall/scripts/auto  Fri Oct 11 23:12:05 2013        
(r256361)
@@ -93,24 +93,46 @@ fi
 rm $PATH_FSTAB
 touch $PATH_FSTAB
 
-dialog --backtitle "FreeBSD Installer" --title "Partitioning" --extra-button \
-    --extra-label "Manual" --ok-label "Guided" --cancel-label "Shell" \
-    --yesno "Would you like to use the guided partitioning tool (recommended 
for beginners) or to set up partitions manually (experts)? You can also open a 
shell and set up partitions entirely by hand." 0 0
+PMODES="\
+Guided \"Partitioning Tool (Recommended for Beginners)\" \
+Manual \"Manually Configure Partitions (Expert)\" \
+Shell \"Open a shell and partition by hand\""
+
+CURARCH=$( uname -m )
+case $CURARCH in
+       amd64|i386)     # Booting ZFS Supported
+               PMODES="$PMODES ZFS \"Automatic Root-on-ZFS (Experimental)\""
+               ;;
+       *)              # Booting ZFS Unspported
+               ;;
+esac
 
-case $? in
-0)     # Guided
+exec 3>&1
+PARTMODE=`echo $PMODES | xargs dialog --backtitle "FreeBSD Installer" \
+       --title "Partitioning" \
+       --menu "How would you like to partition your disk?" \
+       0 0 0 2>&1 1>&3`
+if [ $? -eq $DIALOG_CANCEL ]; then exit 1; fi
+exec 3>&-
+
+case "$PARTMODE" in
+"Guided")      # Guided
        bsdinstall autopart || error
        bsdinstall mount || error
        ;;
-1)     # Shell
+"Shell")       # Shell
        clear
        echo "Use this shell to set up partitions for the new system. When 
finished, mount the system at $BSDINSTALL_CHROOT and place an fstab file for 
the new system at $PATH_FSTAB. Then type 'exit'. You can also enter the 
partition editor at any time by entering 'bsdinstall partedit'."
        sh 2>&1
        ;;
-3)     # Manual
+"Manual")      # Manual
        bsdinstall partedit || error
        bsdinstall mount || error
        ;;
+"ZFS") # ZFS
+       bsdinstall zfsboot || error
+       bsdinstall mount || error
+       ;;
 *)
        error
        ;;

Modified: stable/10/usr.sbin/bsdinstall/scripts/config
==============================================================================
--- stable/10/usr.sbin/bsdinstall/scripts/config        Fri Oct 11 23:11:33 
2013        (r256360)
+++ stable/10/usr.sbin/bsdinstall/scripts/config        Fri Oct 11 23:12:05 
2013        (r256361)
@@ -31,6 +31,11 @@ rm $BSDINSTALL_TMPETC/rc.conf.*
 
 cp $BSDINSTALL_TMPETC/* $BSDINSTALL_CHROOT/etc
 
+cat $BSDINSTALL_TMPBOOT/loader.conf.* >> $BSDINSTALL_TMPBOOT/loader.conf
+rm $BSDINSTALL_TMPBOOT/loader.conf.*
+
+cp $BSDINSTALL_TMPBOOT/* $BSDINSTALL_CHROOT/boot
+
 # Set up other things from installed config
 chroot $BSDINSTALL_CHROOT /usr/bin/newaliases
 

Modified: stable/10/usr.sbin/bsdinstall/scripts/keymap
==============================================================================
--- stable/10/usr.sbin/bsdinstall/scripts/keymap        Fri Oct 11 23:11:33 
2013        (r256360)
+++ stable/10/usr.sbin/bsdinstall/scripts/keymap        Fri Oct 11 23:12:05 
2013        (r256361)
@@ -1,6 +1,7 @@
 #!/bin/sh
 #-
 # Copyright (c) 2011 Nathan Whitehorn
+# Copyright (c) 2013 Devin Teske
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -25,11 +26,212 @@
 # SUCH DAMAGE.
 #
 # $FreeBSD$
+#
+############################################################ INCLUDES
+ 
+BSDCFG_SHARE="/usr/share/bsdconfig"
+. $BSDCFG_SHARE/common.subr || exit 1
+f_dprintf "%s: loading includes..." "$0"
+f_include $BSDCFG_SHARE/dialog.subr
+f_include $BSDCFG_SHARE/keymap.subr
+f_include $BSDCFG_SHARE/sysrc.subr
+
+############################################################ CONFIGURATION
+
+#
+# Default file to store keymap selection in
+#
+: ${KEYMAPFILE:=$BSDINSTALL_TMPETC/rc.conf.keymap}
+
+#
+# Default path to keymap INDEX containing descriptions
+#
+: ${MAPDESCFILE:=/usr/share/syscons/keymaps/INDEX.keymaps}
+
+############################################################ GLOBALS
+
+#
+# Strings that should be moved to an i18n file and loaded with f_include_lang()
+#
+hline_arrows_tab_enter="Press arrows, TAB or ENTER"
+msg_continue_with_keymap="Continue with %s keymap"
+msg_default="default"
+msg_error="Error"
+msg_freebsd_installer="FreeBSD Installer"
+msg_keymap_menu_text="The system console driver for FreeBSD defaults to 
standard \"US\"\nkeyboard map. Other keymaps can be chosen below."
+msg_keymap_selection="Keymap Selection"
+msg_ok="OK"
+msg_select="Select"
+msg_test_keymap="Test %s keymap"
+msg_test_the_currently_selected_keymap="Test the currently selected keymap"
+msg_test_the_keymap_by_typing="Test the keymap by typing letters, numbers, and 
symbols. Characters\nshould match labels on the keyboard keys. Press Enter to 
stop testing."
+
+############################################################ FUNCTIONS
+
+# dialog_keymap_test $keymap
+#
+# Activate $keymap and display an input box (without cancel button) for the
+# user to test keyboard input and return. Always returns success.
+#
+dialog_keymap_test()
+{
+       local keym="$1"
+       local title= # Calculated below
+       local btitle= # Calculated below
+       local prompt="$msg_test_the_keymap_by_typing"
+       local hline=
+
+       # Attempt to activate the keymap
+       if [ "$keym" ]; then
+               local err
+               err=$( f_keymap_kbdcontrol "$keym" 2>&1 > /dev/null )
+               if [ "$err" ]; then
+                       f_dialog_title "$msg_error"
+                       f_dialog_msgbox "$err"
+                       f_dialog_title_restore
+                       return $FAILURE
+               fi
+       fi
+
+       f_dialog_title "$( printf "$msg_test_keymap" "${keym:-$msg_default}" )"
+       title="$DIALOG_TITLE"
+       btitle="$DIALOG_BACKTITLE"
+       f_dialog_title_restore
+
+       local height width
+       f_dialog_inputbox_size height width \
+               "$title" "$btitle" "$prompt" "" "$hline"
+
+       $DIALOG \
+               --title "$title"      \
+               --backtitle "$btitle" \
+               --hline "$hline"      \
+               --ok-label "$msg_ok"  \
+               --no-cancel           \
+               --inputbox "$prompt"  \
+               $height $width        \
+               2>/dev/null >&$DIALOG_TERMINAL_PASSTHRU_FD
 
-kbdcontrol -d >/dev/null 2>&1
-if [ $? -eq 0 ]; then
-       dialog --backtitle "FreeBSD Installer" --title "Keymap Selection" \
-           --yesno "Would you like to set a non-default key mapping for your 
keyboard?" 0 0 || exit 0
-       exec 3>&1
-       kbdmap 2>&1 1>&3 | grep 'keymap=' > $BSDINSTALL_TMPETC/rc.conf.keymap
+       return $DIALOG_OK
+}
+
+############################################################ MAIN
+
+#
+# Initialize
+#
+f_dialog_title "$msg_keymap_selection"
+f_dialog_backtitle "$msg_freebsd_installer"
+
+#
+# Die immediately if we can't dump the current keyboard map
+#
+#error=$( kbdcontrol -d 2>&1 > /dev/null ) || f_die $FAILURE "%s" "$error"
+
+# Capture Ctrl-C for clean-up
+trap 'rm -f $KEYMAPFILE; exit $FAILURE' SIGINT
+
+# Get a value from rc.conf(5) as initial value (if not being scripted)
+f_getvar $VAR_KEYMAP keymap
+if [ ! "$keymap" ]; then
+       keymap=$( f_sysrc_get keymap )
+       case "$keymap" in [Nn][Oo]) keymap="";; esac
 fi
+
+#
+# Loop until the user has finalized their selection (by clicking the
+# [relabeled] Cancel button).
+#
+width=67 first_pass=1 back_from_testing=
+[ "$USE_XDIALOG" ] && width=70
+prompt="$msg_keymap_menu_text"
+hline="$hline_arrows_tab_enter"
+while :; do
+       #

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to