aboutsummaryrefslogtreecommitdiff
path: root/contrib/bsddialog/bsdconfig/share/geom.subr
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bsddialog/bsdconfig/share/geom.subr')
-rw-r--r--contrib/bsddialog/bsdconfig/share/geom.subr430
1 files changed, 0 insertions, 430 deletions
diff --git a/contrib/bsddialog/bsdconfig/share/geom.subr b/contrib/bsddialog/bsdconfig/share/geom.subr
deleted file mode 100644
index d6486c6d6543..000000000000
--- a/contrib/bsddialog/bsdconfig/share/geom.subr
+++ /dev/null
@@ -1,430 +0,0 @@
-if [ ! "$_GEOM_SUBR" ]; then _GEOM_SUBR=1
-#
-# Copyright (c) 2012-2014 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..." geom.subr
-f_include $BSDCFG_SHARE/strings.subr
-f_include $BSDCFG_SHARE/struct.subr
-
-############################################################ GLOBALS
-
-NGEOM_CLASSES=0 # Set by f_geom_get_all()/f_geom_reset()
-
-#
-# GEOM classes for use with f_geom_find()
-#
-# NB: Since $GEOM_CLASS_ANY is the NULL string, make sure you quote it whenever
-# you put arguments after it.
-#
-setvar GEOM_CLASS_ANY "any"
-setvar GEOM_CLASS_DEV "DEV"
-setvar GEOM_CLASS_DISK "DISK"
-setvar GEOM_CLASS_ELI "ELI"
-setvar GEOM_CLASS_FD "FD"
-setvar GEOM_CLASS_LABEL "LABEL"
-setvar GEOM_CLASS_MD "MD"
-setvar GEOM_CLASS_NOP "NOP"
-setvar GEOM_CLASS_PART "PART"
-setvar GEOM_CLASS_RAID "RAID"
-setvar GEOM_CLASS_SWAP "SWAP"
-setvar GEOM_CLASS_VFS "VFS"
-setvar GEOM_CLASS_ZFS_VDEV "ZFS::VDEV"
-setvar GEOM_CLASS_ZFS_ZVOL "ZFS::ZVOL"
-
-#
-# GEOM structure definitions
-#
-f_struct_define GEOM_CLASS \
- id name ngeoms
-f_struct_define GEOM_GEOM \
- id class_ref config name nconsumers nproviders rank
- # Also consumerN where N is 1 through nconsumers
- # Also providerN where N is 1 through nproviders
-f_struct_define GEOM_CONSUMER \
- id geom_ref config mode provider_ref
-f_struct_define GEOM_PROVIDER \
- id geom_ref config mode name mediasize
-
-# The config property of GEOM_GEOM struct is defined as this
-f_struct_define GEOM_GEOM_CONFIG \
- entries first fwheads fwsectors last modified scheme state
-
-# The config property of GEOM_PROVIDER struct is defined as this
-f_struct_define GEOM_PROVIDER_CONFIG \
- descr file fwheads fwsectors ident length type unit
-
-#
-# Default behavior is to call f_geom_get_all() automatically when loaded.
-#
-: ${GEOM_SELF_SCAN_ALL=1}
-
-############################################################ FUNCTIONS
-
-# f_geom_get_all
-#
-# Parse sysctl(8) `kern.geom.confxml' data into a series of structs. GEOM
-# classes are at the top of the hierarchy and are stored as numbered structs
-# from 1 to $NGEOM_CLASSES (set by this function) named `geom_class_C'. GEOM
-# objects within each class are stored as numbered structs from 1 to `ngeoms'
-# (a property of the GEOM class struct) named `geom_class_C_geom_N' (where C
-# is the class number and N is the geom number).
-#
-# Use the function f_geom_find() to get a list of geoms (execute without
-# arguments) or find specific geoms by class or name.
-#
-f_geom_get_all()
-{
- eval "$( sysctl -n kern.geom.confxml | awk '
- BEGIN {
- struct_count["class"] = 0
- struct_count["geom"] = 0
- struct_count["consumer"] = 0
- struct_count["provider"] = 0
- }
- ############################################### FUNCTIONS
- function set_value(prop, value)
- {
- if (!struct_stack[cur_struct]) return
- printf "%s set %s \"%s\"\n",
- struct_stack[cur_struct], prop, value
- }
- function create(type, id)
- {
- if (struct = created[type "_" id])
- print "f_struct_free", struct
- else {
- struct = struct_stack[cur_struct]
- struct = struct ( struct ? "" : "geom" )
- struct = struct "_" type "_" ++struct_count[type]
- created[type "_" id] = struct
- }
- print "debug= f_struct_new GEOM_" toupper(type), struct
- cur_struct++
- struct_stack[cur_struct] = struct
- type_stack[cur_struct] = type
- set_value("id", id)
- }
- function create_config()
- {
- struct = struct_stack[cur_struct]
- struct = struct ( struct ? "" : "geom" )
- struct = struct "_config"
- set_value("config", struct)
- type = type_stack[cur_struct]
- print "debug= f_struct_new GEOM_" toupper(type) "_CONFIG", \
- struct
- cur_struct++
- struct_stack[cur_struct] = struct
- type_stack[cur_struct] = type "_config"
- }
- function extract_attr(field, attr)
- {
- if (match(field, attr "=\"0x[[:xdigit:]]+\"")) {
- len = length(attr)
- return substr($2, len + 3, RLENGTH - len - 3)
- }
- }
- function extract_data(type)
- {
- data = $0
- sub("^[[:space:]]*<" type ">", "", data)
- sub("</" type ">.*$", "", data)
- return data
- }
- ############################################### OPENING PATTERNS
- $1 == "<mesh>" { mesh = 1 }
- $1 ~ /^<(class|geom)$/ && mesh {
- prop = substr($1, 2)
- if ((ref = extract_attr($2, "ref")) != "")
- set_value(prop "_ref", ref)
- else if ((id = extract_attr($2, "id")) != "")
- create(prop, id)
- }
- $1 ~ /^<(consumer|provider)$/ && mesh {
- prop = substr($1, 2)
- if ((ref = extract_attr($2, "ref")) != "")
- set_value(prop "_ref", ref)
- else if ((id = extract_attr($2, "id")) != "") {
- create(prop, id)
- cur_struct--
- propn = struct_count[prop]
- set_value(prop propn, struct_stack[cur_struct+1])
- cur_struct++
- }
- }
- $1 == "<config>" && mesh { create_config() }
- ############################################### PROPERTIES
- $1 ~ /^<[[:alnum:]]+>/ {
- prop = $1
- sub(/^</, "", prop); sub(/>.*/, "", prop)
- set_value(prop, extract_data(prop))
- }
- ############################################### CLOSING PATTERNS
- $1 ~ "^</(consumer|provider|config)>$" { cur_struct-- }
- $1 == "</geom>" {
- set_value("nconsumers", struct_count["consumer"])
- set_value("nproviders", struct_count["provider"])
- cur_struct--
- struct_count["consumer"] = 0
- struct_count["provider"] = 0
- }
- $1 == "</class>" {
- set_value("ngeoms", struct_count["geom"])
- cur_struct--
- struct_count["consumer"] = 0
- struct_count["provider"] = 0
- struct_count["geom"] = 0
- }
- $1 == "</mesh>" {
- printf "NGEOM_CLASSES=%u\n", struct_count["class"]
- delete struct_count
- mesh = 0
- }' )"
-}
-
-# f_geom_reset
-#
-# Reset the registered GEOM chain.
-#
-f_geom_reset()
-{
- local classn=1 class ngeoms geomn geom
- while [ $classn -le ${NGEOM_CLASSES:-0} ]; do
- class=geom_class_$classn
- $class get ngeoms ngeoms
- geomn=1
- while [ $geomn -le $ngeoms ]; do
- f_struct_free ${class}_geom_$geomn
- geomn=$(( $geomn + 1 ))
- done
- classn=$(( $classn + 1 ))
- done
- NGEOM_CLASSES=0
-}
-
-# f_geom_rescan
-#
-# Rescan all GEOMs - convenience function.
-#
-f_geom_rescan()
-{
- f_geom_reset
- f_geom_get_all
-}
-
-# f_geom_find $name [$type [$var_to_set]]
-#
-# Find one or more registered GEOMs by name, type, or both. Returns a space-
-# separated list of GEOMs matching the search criterion. The $type argument
-# should be the GEOM class (see $GEOM_CLASS_* variables in GLOBALS above).
-#
-# If $var_to_set is missing or NULL, the GEOM name(s) are printed to standard
-# out for capturing in a sub-shell (which is less-recommended because of
-# performance degredation; for example, when called in a loop).
-#
-f_geom_find()
-{
- local __name="$1" __type="${2:-$GEOM_CLASS_ANY}" __var_to_set="$3"
- local __classn=1 __class __class_name __ngeoms
- local __geomn __geom __geom_name __found=
- while [ $__classn -le ${NGEOM_CLASSES:-0} ]; do
- __class=geom_class_$__classn
- $__class get name __class_name
- if [ "$__type" != "$GEOM_CLASS_ANY" -a \
- "$__type" != "$__class_name" ]
- then
- __classn=$(( $__classn + 1 ))
- continue
- fi
-
- __geomn=1
- $__class get ngeoms __ngeoms || __ngeoms=0
- while [ $__geomn -le $__ngeoms ]; do
- __geom=${__class}_geom_$__geomn
- $__geom get name __geom_name
- [ "$__name" = "$__geom_name" -o ! "$__name" ] &&
- __found="$__found $__geom"
- __geomn=$(( $__geomn + 1 ))
- done
- __classn=$(( $__classn + 1 ))
- done
- if [ "$__var_to_set" ]; then
- setvar "$__var_to_set" "${__found# }"
- else
- echo $__found
- fi
- [ "$__found" ] # Return status
-}
-
-# f_geom_find_by $prop $find [$type [$var_to_set]]
-#
-# Find GEOM-related struct where $prop of the struct is equal to $find. Returns
-# NULL or the name of the first GEOM struct to match. The $type argument should
-# be one of the following:
-#
-# NULL Find any of the below
-# class Find GEOM_CLASS struct
-# geom Find GEOM_GEOM struct
-# consumer Find GEOM_CONSUMER struct
-# provider Find GEOM_PROVIDER struct
-#
-# The $prop argument can be any property of the given type of struct. Some
-# properties are common to all types (such as id) so the $type argument is
-# optional (allowing you to return any struct whose property matches $find).
-#
-# If $var_to_set is missing or NULL, the GEOM struct name is printed to
-# standard out for capturing in a sub-shell (which is less-recommended because
-# of performance degredation; for example when called in a loop).
-#
-f_geom_find_by()
-{
- local __prop="$1" __find="$2" __type="$3" __var_to_set="$4"
- local __classn=1 __class __ngeoms
- local __geomn __geom __nitems
- local __itype __itemn __item
- local __value __found=
-
- if [ ! "$__prop" ]; then
- [ "$__var_to_set" ] && setvar "$__var_to_set" ""
- return $FAILURE
- fi
-
- case "$__type" in
- "") : OK ;;
- class|GEOM_CLASS) __type=class ;;
- geom|GEOM_GEOM) __type=geom ;;
- consumer|GEOM_CONSUMER) __type=consumer ;;
- provider|GEOM_PROVIDER) __type=provider ;;
- *)
- [ "$__var_to_set" ] && setvar "$__var_to_set" ""
- return $FAILURE
- esac
-
- while [ $__classn -le ${NGEOM_CLASSES:-0} ]; do
- __class=geom_class_$__classn
-
- if [ "${__type:-class}" = "class" ]; then
- $__class get "$__prop" __value || __value=
- [ "$__value" = "$__find" ] && __found="$__class" break
- [ "$__type" ] && __classn=$(( $__classn + 1 )) continue
- fi
-
- __geomn=1
- $__class get ngeoms __ngeoms || __ngeoms=0
- while [ $__geomn -le $__ngeoms ]; do
- __geom=${__class}_geom_$__geomn
-
- if [ "${__type:-geom}" = "geom" ]; then
- $__geom get "$__prop" __value || __value=
- [ "$__value" = "$__find" ] &&
- __found="$__geom" break
- [ "$__type" ] &&
- __geomn=$(( $__geomn + 1 )) continue
- fi
-
- for __itype in ${__type:-consumer provider}; do
- $__geom get n${__itype}s __nitems || continue
- __itemn=1
- while [ $__itemn -le $__nitems ]; do
- __item=${__geom}_${__itype}_$__itemn
-
- $__item get "$__prop" __value ||
- __value=
- [ "$__value" = "$__find" ] &&
- __found="$__item" break
- __itemn=$(( $__itemn + 1 ))
- done
- [ "$__found" ] && break
- done
- [ "$__found" ] && break
- __geomn=$(( $__geomn + 1 ))
- done
- [ "$__found" ] && break
- __classn=$(( $__classn + 1 ))
- done
- if [ "$__var_to_set" ]; then
- setvar "$__var_to_set" "$__found"
- else
- [ "$__found" ] && echo "$__found"
- fi
- [ "$__found" ] # Return status
-}
-
-# f_geom_parent $geom|$consumer|$provider|$config [$var_to_set]
-#
-# Get the GEOM class associated with one of $geom, $consumer, $provider or
-# $config.
-#
-# If $var_to_set is missing or NULL, the GEOM class name is printed to standard
-# out for capturing in a sub-shell (which is less-recommended because of
-# performance degredation; for example when called in a loop).
-#
-f_geom_parent()
-{
- local __struct="$1" __var_to_set="$2"
- # NB: Order of pattern matches below is important
- case "$__struct" in
- *_config*) __struct="${__struct%_config*}" ;;
- *_consumer_*) __struct="${__struct%_consumer_[0-9]*}" ;;
- *_provider_*) __struct="${__struct%_provider_[0-9]*}" ;;
- *_geom_*) __struct="${__struct%_geom_[0-9]*}" ;;
- *) __struct=
- esac
- if [ "$__var_to_set" ]; then
- setvar "$__var_to_set" "$__struct"
- else
- echo "$__struct"
- fi
- f_struct "$__struct" # Return status
-}
-
-############################################################ MAIN
-
-#
-# Parse GEOM configuration unless requested otherwise
-#
-f_dprintf "%s: GEOM_SELF_SCAN_ALL=[%s]" geom.subr "$GEOM_SELF_SCAN_ALL"
-case "$GEOM_SELF_SCAN_ALL" in
-""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;;
-*)
- f_geom_get_all
- if [ "$debug" ]; then
- debug= f_geom_find "" "$GEOM_CLASS_ANY" geoms
- f_count ngeoms $geoms
- f_dprintf "%s: Initialized %u geom devices in %u classes." \
- geom.subr "$ngeoms" "$NGEOM_CLASSES"
- unset geoms ngeoms
- fi
-esac
-
-f_dprintf "%s: Successfully loaded." geom.subr
-
-fi # ! $_GEOM_SUBR