diff options
author | dteske <dteske@FreeBSD.org> | 2014-04-23 22:04:04 +0000 |
---|---|---|
committer | dteske <dteske@FreeBSD.org> | 2014-04-23 22:04:04 +0000 |
commit | 70eef882b375ccbab79ba026423e85d58e9beefa (patch) | |
tree | 9ad2385061c262108b35673a6f484e11aacdd324 /usr.sbin | |
parent | 17495be0b718b94d234d4b4ab299a63ba15f0adf (diff) | |
download | FreeBSD-src-70eef882b375ccbab79ba026423e85d58e9beefa.zip FreeBSD-src-70eef882b375ccbab79ba026423e85d58e9beefa.tar.gz |
Implement GEOM based media device classification. You'll notice a few
different things from this commit:
+ More devices. Devices that were previously ignored are now present.
+ Faster device scanning. "There is no try, only Do" -- f_device_try()
is no longer the basis of device scanning as GEOM provides [nearly]
all devices (doesn't provide network devices).
+ More information available as non-root. Usually you have to be root
to do things like taste filesystems, and that limits the amount of
information available to non-root users; with GEOM, we see all even
running unprivileged as the brunt of information (except for so-
called ``dangerously dedicated'' file systems) is represented by the
`kern.geom.confxml' sysctl(8) MIB.
NB: Only really useful for external scripts that use the API and run as
non-root; where this code is used in bsdconfig(8) and bsdinstall(8)
you are running as root so can detect even ``dangerously dedicated''
file systems that are not present in GEOM; e.g., no PART class for
a DOS filesystem written directly to disk without partition table).
+ No more use of legacy tools such as diskinfo(8) to get disk capacity
or fdisk(8) to see partitions.
MFC after: 1 week
Diffstat (limited to 'usr.sbin')
22 files changed, 1579 insertions, 771 deletions
diff --git a/usr.sbin/bsdconfig/dot/dot b/usr.sbin/bsdconfig/dot/dot index 7f34c81..9093d63 100755 --- a/usr.sbin/bsdconfig/dot/dot +++ b/usr.sbin/bsdconfig/dot/dot @@ -29,7 +29,7 @@ ############################################################ INCLUDES # Prevent common.subr from auto initializing debugging (this is not an inter- -# active utility that requires debugging; also `-d' has been repurposed). +# active utility so does not require debugging; also `-d' has been repurposed). # DEBUG_SELF_INITIALIZE=NO diff --git a/usr.sbin/bsdconfig/examples/browse_packages_ftp.sh b/usr.sbin/bsdconfig/examples/browse_packages_ftp.sh index 1deb562..015d799 100755 --- a/usr.sbin/bsdconfig/examples/browse_packages_ftp.sh +++ b/usr.sbin/bsdconfig/examples/browse_packages_ftp.sh @@ -18,7 +18,7 @@ if [ ! -e "$TMPDIR/packages/INDEX" ]; then mediaSetFTP mediaOpen f_show_info "Downloading packages/INDEX from\n %s" "$_ftpPath" - f_device_get media packages/INDEX > $TMPDIR/packages/INDEX + f_device_get device_media packages/INDEX > $TMPDIR/packages/INDEX fi _directoryPath=$TMPDIR mediaSetDirectory diff --git a/usr.sbin/bsdconfig/examples/browse_packages_http.sh b/usr.sbin/bsdconfig/examples/browse_packages_http.sh index e88a576..a0e6801 100755 --- a/usr.sbin/bsdconfig/examples/browse_packages_http.sh +++ b/usr.sbin/bsdconfig/examples/browse_packages_http.sh @@ -18,7 +18,7 @@ if [ ! -e "$TMPDIR/packages/INDEX" ]; then mediaSetHTTP mediaOpen f_show_info "Downloading packages/INDEX from\n %s" "$_httpPath" - f_device_get media packages/INDEX > $TMPDIR/packages/INDEX + f_device_get device_media packages/INDEX > $TMPDIR/packages/INDEX fi _directoryPath=$TMPDIR mediaSetDirectory diff --git a/usr.sbin/bsdconfig/networking/share/device.subr b/usr.sbin/bsdconfig/networking/share/device.subr index 2d72045..42010ab 100644 --- a/usr.sbin/bsdconfig/networking/share/device.subr +++ b/usr.sbin/bsdconfig/networking/share/device.subr @@ -75,10 +75,11 @@ f_dialog_menu_netdev() # # Get list of usable network interfaces # - local devs if iflist= # Calculated below + local dev devs if iflist= # Calculated below f_device_rescan_network f_device_find "" $DEVICE_TYPE_NETWORK devs - for if in $devs; do + for dev in $devs; do + f_struct "$dev" get name if || continue # Skip unsavory interfaces case "$if" in lo[0-9]*|ppp[0-9]*|sl[0-9]*|faith[0-9]*) continue ;; diff --git a/usr.sbin/bsdconfig/share/Makefile b/usr.sbin/bsdconfig/share/Makefile index 98cc779..5b81af4 100644 --- a/usr.sbin/bsdconfig/share/Makefile +++ b/usr.sbin/bsdconfig/share/Makefile @@ -5,7 +5,7 @@ NO_OBJ= SUBDIR= media packages FILESDIR= ${SHAREDIR}/bsdconfig -FILES= common.subr device.subr dialog.subr keymap.subr \ +FILES= common.subr device.subr dialog.subr geom.subr keymap.subr \ mustberoot.subr script.subr strings.subr struct.subr \ sysrc.subr variable.subr diff --git a/usr.sbin/bsdconfig/share/common.subr b/usr.sbin/bsdconfig/share/common.subr index 7c3379e..762fd39 100644 --- a/usr.sbin/bsdconfig/share/common.subr +++ b/usr.sbin/bsdconfig/share/common.subr @@ -153,7 +153,7 @@ f_debug_init() # Process stored command-line arguments # set -- $ARGV - local OPTIND flag + local OPTIND OPTARG flag f_dprintf "f_debug_init: ARGV=[%s] GETOPTS_STDARGS=[%s]" \ "$ARGV" "$GETOPTS_STDARGS" while getopts "$GETOPTS_STDARGS$GETOPTS_EXTRA$GETOPTS_ALLFLAGS" flag \ @@ -798,14 +798,30 @@ f_running_as_init() } # f_mounted $local_directory +# f_mounted -b $device # -# Return success if a filesystem is mounted on a particular directory. +# Return success if a filesystem is mounted on a particular directory. If `-b' +# is present, instead check that the block device (or a partition thereof) is +# mounted. # f_mounted() { - local dir="$1" - [ -d "$dir" ] || return $FAILURE - mount | grep -Eq " on $dir \([^)]+\)$" + local OPTIND OPTARG flag use_device= + while getopts b flag; do + case "$flag" in + b) use_device=1 ;; + esac + done + shift $(( $OPTIND - 1 )) + if [ "$use_device" ]; then + local device="$1" + mount | grep -Eq \ + "^$device([[:space:]]|p[0-9]|s[0-9]|\.nop|\.eli)" + else + [ -d "$dir" ] || return $FAILURE + mount | grep -Eq " on $dir \([^)]+\)$" + fi + # Return status is that of last grep(1) } # f_eval_catch [-de] [-k $var_to_set] $funcname $utility \ @@ -890,7 +906,7 @@ f_eval_catch() # # Process local function arguments # - local OPTIND __flag + local OPTIND OPTARG __flag while getopts "dek:" __flag > /dev/null; do case "$__flag" in d) __no_dialog=1 ;; diff --git a/usr.sbin/bsdconfig/share/device.subr b/usr.sbin/bsdconfig/share/device.subr index 9201b95..d93cd9b 100644 --- a/usr.sbin/bsdconfig/share/device.subr +++ b/usr.sbin/bsdconfig/share/device.subr @@ -32,6 +32,7 @@ BSDCFG_SHARE="/usr/share/bsdconfig" . $BSDCFG_SHARE/common.subr || exit 1 f_dprintf "%s: loading includes..." device.subr f_include $BSDCFG_SHARE/dialog.subr +f_include $BSDCFG_SHARE/geom.subr f_include $BSDCFG_SHARE/strings.subr f_include $BSDCFG_SHARE/struct.subr @@ -40,42 +41,53 @@ f_include_lang $BSDCFG_LIBE/include/messages.subr ############################################################ GLOBALS -DEVICES= -DEVICE_NAMES= -NDEVICES=0 +NDEVICES=0 # Set by f_device_register(), used by f_device_*() -# A "device" from sysinstall's point of view +# +# A "device" from legacy sysinstall's point of view (mostly) +# +# NB: Disk devices have their `private' property set to GEOM ident +# NB: USB devices have their `private' property set to USB disk device name +# f_struct_define DEVICE \ - name \ + capacity \ desc \ devname \ - type \ - capacity \ enabled \ - init \ - get \ - shutdown \ flags \ + get \ + init \ + name \ private \ + shutdown \ + type \ volume # Network devices have their `private' property set to this f_struct_define DEVICE_INFO \ - use_rtsol use_dhcp ipaddr ipv6addr netmask extras - -setvar DEVICE_TYPE_NONE 1 -setvar DEVICE_TYPE_DISK 2 -setvar DEVICE_TYPE_FLOPPY 3 -setvar DEVICE_TYPE_FTP 4 -setvar DEVICE_TYPE_NETWORK 5 -setvar DEVICE_TYPE_CDROM 6 -setvar DEVICE_TYPE_USB 7 -setvar DEVICE_TYPE_DOS 8 -setvar DEVICE_TYPE_UFS 9 -setvar DEVICE_TYPE_NFS 10 -setvar DEVICE_TYPE_ANY 11 -setvar DEVICE_TYPE_HTTP_PROXY 12 -setvar DEVICE_TYPE_HTTP 13 + extras \ + ipaddr \ + ipv6addr \ + netmask \ + use_dhcp \ + use_rtsol + +# +# Device types for f_device_register(), f_device_find(), et al. +# +setvar DEVICE_TYPE_ANY "any" # Any +setvar DEVICE_TYPE_NONE "NONE" # Unknown +setvar DEVICE_TYPE_DISK "DISK" # GEOM `DISK' +setvar DEVICE_TYPE_FLOPPY "FD" # GEOM `FD' +setvar DEVICE_TYPE_FTP "FTP" # Dynamic network device +setvar DEVICE_TYPE_NETWORK "NETWORK" # See f_device_get_all_network +setvar DEVICE_TYPE_CDROM "CDROM" # GEOM `DISK' +setvar DEVICE_TYPE_USB "USB" # GEOM `PART' +setvar DEVICE_TYPE_DOS "DOS" # GEOM `DISK' `PART' or `LABEL' +setvar DEVICE_TYPE_UFS "UFS" # GEOM `DISK' `PART' or `LABEL' +setvar DEVICE_TYPE_NFS "NFS" # Dynamic network device +setvar DEVICE_TYPE_HTTP_PROXY "HTTP_PROXY" # Dynamic network device +setvar DEVICE_TYPE_HTTP "HTTP" # Dynamic network device # Network devices have the following flags available setvar IF_ETHERNET 1 @@ -87,76 +99,70 @@ setvar IF_ACTIVE 4 # : ${DEVICE_SELF_SCAN_ALL=1} -############################################################ FUNCTIONS - -# f_device_try $name [$i [$var_path]] # -# Test a particular device. If $i is given, then $name is expected to contain a -# single "%d" where $i will be inserted using printf. If $var_path is given, -# it is used as a variable name to provide the caller the device pathname. +# Device Catalog variables # -# Returns success if the device path exists and is a cdev. +DEVICE_CATALOG_APPEND_ONLY= # Used by f_device_catalog_set() +NCATALOG_DEVICES=0 # Used by f_device_catalog_*() and MAIN + # -f_device_try() -{ - local name="$1" i="$2" var_path="$3" unit - if [ "$i" ]; then - f_sprintf unit "$name" "$i" - else - unit="$name" - fi - case "$unit" in - /dev/*) : good ;; # already qualified - *) unit="/dev/$unit" ;; - esac - [ "$var_path" ] && setvar "$var_path" "$unit" - f_dprintf "f_device_try: making sure %s is a device node" "$unit" - if [ -c "$unit" ]; then - f_dprintf "f_device_try: %s is a cdev [good]" "$unit" - return $SUCCESS - else - f_dprintf "f_device_try: %s is not a cdev [skip]" "$unit" - return $FAILURE - fi -} +# A ``catalog'' device is for mapping GEOM devices to media devices (for +# example, determining if a $GEOM_CLASS_DISK geom is $DEVICE_TYPE_CDROM or +# $DEVICE_TYPE_DISK) and also getting default descriptions for devices that +# either lack a GEOM provided description or lack a presence in GEOM) +# +f_struct_define CATALOG_DEVICE \ + desc \ + name \ + type + +############################################################ FUNCTIONS -# f_device_register $name $desc $devname $type $enabled $init_function \ -# $get_function $shutdown_function $private $capacity +# f_device_register $var_to_set $name $desc $devname $type $enabled +# $init_function $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 -# the underscore, `_'). The remaining arguments after $name correspond to the -# properties of the `DEVICE' structure-type (defined above). +# Register a device. A `structure' (see struct.subr) is created and if +# $var_to_set is non-NULL, upon success holds the name of the struct created. +# The remaining positional arguments correspond to the properties of the +# `DEVICE' structure-type to be assigned (defined above). # -# If not already registered, the device is then appended to the DEVICES -# environment variable, a space-separated list of all registered devices. +# If not already registered (based on $name and $type), a new device is created +# and $NDEVICES is incremented. # 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" - device_$name set desc "$desc" - device_$name set devname "$devname" - device_$name set type "$type" - device_$name set enabled "$enabled" - device_$name set init "$init_func" - 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= - for dev in $DEVICES; do - [ "$dev" = "$name" ] || continue - found=1 && break - done - [ "$found" ] || DEVICES="$DEVICES $name" + local __var_to_set="$1" __name="$2" __desc="$3" __devname="$4" + local __type="$5" __enabled="$6" __init_func="$7" __get_func="$8" + local __shutdown_func="$9" __private="${10}" __capacity="${11}" + + # Required parameter(s) + [ "$__name" ] || return $FAILURE + if [ "$__var_to_set" ]; then + setvar "$__var_to_set" "" || return $FAILURE + fi + local __device + if f_device_find -1 "$__name" "$__type" __device; then + f_struct_free "$__device" + f_struct_new DEVICE "$__device" || return $FAILURE + else + __device=device_$(( NDEVICES + 1 )) + f_struct_new DEVICE "$__device" || return $FAILURE + NDEVICES=$(( $NDEVICES + 1 )) + fi + $__device set name "$__name" + $__device set desc "$__desc" + $__device set devname "$__devname" + $__device set type "$__type" + $__device set enabled "$__enabled" + $__device set init "$__init_func" + $__device set get "$__get_func" + $__device set shutdown "$__shutdown_func" + $__device set private "$__private" + $__device set capacity "$__capacity" + + [ "$__var_to_set" ] && setvar "$__var_to_set" "$__device" return $SUCCESS } @@ -166,18 +172,21 @@ f_device_register() # f_device_reset() { - local dev - for dev in $DEVICES; do - f_device_shutdown $dev + local n=1 + while [ $n -le $NDEVICES ]; do + f_device_shutdown device_$n + # # XXX This potentially leaks $dev->private if it's being # used to point to something dynamic, but you're not supposed # to call this routine at such times that some open instance # has its private member pointing somewhere anyway. # - f_struct_free device_$dev + f_struct_free device_$n + + n=$(( $n + 1 )) done - DEVICES= + NDEVICES=0 } # f_device_reset_network @@ -186,34 +195,45 @@ f_device_reset() # f_device_reset_network() { - local dev type private pruned_list= - for dev in $DEVICES; do - device_$dev get type type - if [ "$type" != "$DEVICE_TYPE_NETWORK" ]; then - pruned_list="$pruned_list $dev" - continue - fi + local n=1 device type private i + while [ $n -le $NDEVICES ]; do + device=device_$n + f_struct $device || continue + $device get type type + [ "$type" = "$DEVICE_TYPE_NETWORK" ] || continue # # Leave the device up (don't call shutdown routine) # # Network devices may have DEVICE_INFO private member - device_$dev get private private + $device get private private [ "$private" ] && f_struct_free "$private" - f_struct_free device_$dev + # Free the network device + f_struct_free $device + + # Fill the gap we just created + i=$n + while [ $i -lt $NDEVICES ]; do + f_struct_copy device_$(( $i + 1 )) device_$i + done + f_struct_free device_$NDEVICES + + # Finally decrement the number of devices + NDEVICES=$(( $NDEVICES - 1 )) + + n=$(( $n + 1 )) done - DEVICES="${pruned_list# }" } # f_device_get_all # -# Get all device information for devices we have attached. +# Get all device information for all devices. # f_device_get_all() { - local devname desc capacity + local devname type desc capacity f_dprintf "f_device_get_all: Probing devices..." f_dialog_info "$msg_probing_devices_please_wait_this_can_take_a_while" @@ -221,180 +241,16 @@ f_device_get_all() # First go for the network interfaces f_device_get_all_network - # Next, try to find all the types of devices one might use - # as a media source for content - # - - local dev type max n=0 - for dev in $DEVICE_NAMES; do - 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 - - local k=0 - while [ $k -lt ${max:-0} ]; do - i=$k k=$(( $k + 1 )) - devname="" - case "$type" in - $DEVICE_TYPE_CDROM) - f_device_try "$dev" "$i" devname || continue - f_device_capacity "$devname" capacity - f_device_register "${devname##*/}" "$desc" \ - "$devname" $DEVICE_TYPE_CDROM 1 \ - f_media_init_cdrom f_media_get_cdrom \ - f_media_shutdown_cdrom "" "$capacity" - f_dprintf "Found a CDROM device for %s" \ - "$devname" - ;; - $DEVICE_TYPE_FLOPPY) - f_device_try "$dev" "$i" devname || continue - f_device_capacity "$devname" capacity - f_device_register "${devname##*/}" "$desc" \ - "$devname" $DEVICE_TYPE_FLOPPY 1 \ - f_media_init_floppy \ - f_media_get_floppy \ - f_media_shutdown_floppy "" "$capacity" - f_dprintf "Found a floppy device for %s" \ - "$devname" - ;; - $DEVICE_TYPE_USB) - f_device_try "$dev" "$i" devname || continue - f_device_capacity "$devname" capacity - f_device_register "${devname##*/}" "$desc" \ - "$devname" $DEVICE_TYPE_USB 1 \ - f_media_init_usb f_media_get_usb \ - f_media_shutdown_usb "" "$capacity" - f_dprintf "Found a USB disk for %s" "$devname" - ;; - esac - done - done - - # Register ISO9660 providers as CDROM devices - for devname in /dev/iso9660/*; do - f_device_try "$devname" || continue - f_device_capacity "$devname" capacity - f_device_register "${devname##*/}" "ISO9660 file system" \ - "$devname" $DEVICE_TYPE_CDROM 1 \ - f_media_init_cdrom f_media_get_cdrom \ - f_media_shutdown_cdrom "" "$capacity" - f_dprintf "Found a CDROM device for %s" "$devname" - done - - # Scan for mdconfig(8)-created md(4) devices - local filename - for devname in /dev/md[0-9] /dev/md[0-9][0-9]; do - f_device_try "$devname" || continue - - # See if the md(4) device is a vnode type backed by a file - filename=$( sysctl kern.geom.conftxt | - awk -v devname="${devname##*/}" \ - ' - ( $2 == "MD" ) && \ - ( $3 == devname ) && \ - ( $(NF-2) == "vnode" ) && \ - ( $(NF-1) == "file" ) \ - { - print $NF - } - ' ) - case "$filename" in - *.iso) # Register the device as an ISO9660 provider - f_device_capacity "$devname" capacity - f_device_register "${devname##*/}" \ - "md(4) vnode file system" \ - "$devname" $DEVICE_TYPE_CDROM 1 \ - f_media_init_cdrom f_media_get_cdrom \ - f_media_shutdown_cdrom "" "$capacity" - f_dprintf "Found a CDROM device for %s" "$devname" - ;; - esac - done - - # Finally go get the disks and look for partitions to register - local diskname slices index type rest slice part - for diskname in $( sysctl -n kern.disks ); do - - case "$diskname" in - cd*) - # XXX Due to unknown reasons, kern.disks returns SCSI - # CDROM as a valid disk. This will prevent bsdconfig - # from presenting SCSI CDROMs as available disks in - # various menus. Why GEOM treats SCSI CDROM as a disk - # is beyond me and that should be investigated. - # For temporary workaround, ignore SCSI CDROM device. - # - continue ;; - esac - - # Try to create a list of partitions and their types, - # consisting of "N,typeN ..." (e.g., "1,0xa5 2,0x06"). - if ! slices=$( fdisk -p "$diskname" 2> /dev/null | - awk '( $1 == "p" ) { print $2","$3 }' ) - then - f_dprintf "Unable to open disk %s" "$diskname" - continue + # Next, go for the GEOM devices we might want to use as media + local geom geoms geom_name + debug= f_geom_find "" $GEOM_CLASS_DEV geoms + for geom in $geoms; do + if ! f_device_probe_geom $geom; then + debug= $geom get name geom_name + f_dprintf "WARNING! Unable to classify %s as %s" \ + "GEOM device $geom_name" "media source" fi - - # Try and find its description - f_device_desc "$diskname" $DEVICE_TYPE_DISK desc - - f_device_capacity "$diskname" capacity - f_device_register "$diskname" "$desc" \ - "/dev/$diskname" $DEVICE_TYPE_DISK 0 \ - "" "" "" "" "$capacity" - f_dprintf "Found a disk device named %s" "$diskname" - - # Look for existing partitions to register - for slice in $slices; do - index="${slice%%,*}" type="${slice#*,}" - slice=${diskname}s$index - case "$type" in - 0x01|0x04|0x06|0x0b|0x0c|0x0e|0xef) - # DOS partitions to add as "DOS media devices" - f_device_capacity "/dev/$slice" capacity - f_device_register "$slice" "" \ - "/dev/$slice" $DEVICE_TYPE_DOS 1 \ - f_media_init_dos f_media_get_dos \ - f_media_shutdown_dos "" "$capacity" - f_dprintf "Found a DOS partition %s" "$slice" - ;; - 0xa5) # FreeBSD partition - for part in $( - bsdlabel -r $slice 2> /dev/null | - awk -v slice="$slice" ' - ( $1 ~ /[abdefgh]:/ ) { - printf "%s%s\n", - slice, - substr($1,1,1) - }' - ); do - f_quietly dumpfs -m /dev/$part || - continue - f_device_capacity \ - "$/dev/$part" capacity - f_device_register \ - "$part" "" "/dev/$part" \ - $DEVICE_TYPE_UFS 1 \ - f_media_init_ufs \ - f_media_get_ufs \ - f_media_shutdown_ufs "" \ - "$capacity" - f_dprintf "Found a UFS partition %s" \ - "$part" - done # parts - ;; - esac - done # slices - - done # disks + done } # f_device_get_all_network @@ -403,7 +259,7 @@ f_device_get_all() # f_device_get_all_network() { - local devname desc flags + local devname desc device flags for devname in $( ifconfig -l ); do # Eliminate network devices that don't make sense case "$devname" in @@ -413,9 +269,9 @@ f_device_get_all_network() # Try and find its description f_device_desc "$devname" $DEVICE_TYPE_NETWORK desc - f_dprintf "Found a network device named %s" "$devname" - f_device_register $devname \ - "$desc" "$devname" $DEVICE_TYPE_NETWORK 1 \ + f_dprintf "Found network device named %s" "$devname" + debug= f_device_register device $devname "$desc" \ + "$devname" $DEVICE_TYPE_NETWORK 1 \ f_media_init_network "" f_media_shutdown_network "" -1 # Set flags based on media and status @@ -435,37 +291,532 @@ f_device_get_all_network() if (value ~ /^active/) _or(var, "IF_ACTIVE") } }' )" - device_$devname set flags $flags + $device set flags $flags done } -# f_device_name_get $type $name type|desc|max [$var_to_set] +# f_device_rescan +# +# Rescan all devices, after closing previous set - convenience function. +# +f_device_rescan() +{ + f_device_reset + f_geom_rescan + f_device_get_all +} + +# f_device_rescan_network +# +# Rescan all network devices, after closing previous set - for convenience. +# +f_device_rescan_network() +{ + f_device_reset_network + f_device_get_all_network +} + +# f_device_probe_geom $geom +# +# Probe a single GEOM device and if it can be classified as a media source, +# register it using f_device_register() with known type-specific arguments. +# +f_device_probe_geom() +{ + local geom="$1" + + f_struct "$geom" || return $FAILURE + + # geom associated variables + local geom_name geom_consumer provider_ref geom_provider= + local provider_geom provider_config provider_class= + local provider_config_type catalog_struct catalog_type + local disk_ident + + # gnop(8)/geli(8) associated variables (p for `parent device') + local p_devname p_geom p_consumer p_provider_ref p_provider + local p_provider_config p_provider_geom p_provider_class + + # md(4) associated variables + local config config_type config_file magic= + + # Temporarily disable debugging to keep debug output light + local old_debug="$debug" debug= + + # + # Get the GEOM name (for use below in device registration) + # + $geom get name devname || continue + + # + # Attempt to get the consumer, provider, provider config, and + # provider class for this geom (errors ignored). + # + # NB: Each GEOM in the `DEV' class should have one consumer. + # That consumer should have a reference to its provider. + # + $geom get consumer1 geom_consumer + f_struct "$geom_consumer" get provider_ref provider_ref && + f_geom_find_by id "$provider_ref" provider geom_provider + if f_struct "$geom_provider"; then + $geom_provider get config provider_config + f_geom_parent $geom_provider provider_geom && + f_geom_parent $provider_geom provider_class + fi + + # + # Get values for device registration (errors ignored) + # + f_struct "$provider_class" get name type + f_struct "$geom_provider" get mediasize capacity + f_struct "$provider_config" get descr desc + + # + # For gnop(8), geli(8), or combination thereof, change device type to + # that of the consumer + # + p_devname= p_geom= p_provider= p_provider_config= + case "$devname" in + *.nop.eli) p_devname="${devname%.nop.eli}" ;; + *.eli.nop) p_devname="${devname%.eli.nop}" ;; + *.eli) p_devname="${devname%.eli}" ;; + *.nop) p_devname="${devname%.nop}" ;; + esac + [ "$p_devname" ] && f_geom_find "$p_devname" $GEOM_CLASS_DEV p_geom + if [ "${p_geom:-$geom}" != "$geom" ]; then + f_struct "$p_geom" get consumer1 p_consumer + f_struct "$p_consumer" get provider_ref p_provider_ref && + f_geom_find_by id "$p_provider_ref" provider p_provider + if f_struct "$p_provider"; then + $p_provider get config p_provider_config + f_geom_parent $p_provider p_provider_geom && + f_geom_parent $p_provider_geom p_provider_class + fi + f_struct "$p_provider_class" get name type + fi + + # Look up geom device in device catalog for default description + f_device_catalog_get \ + $DEVICE_TYPE_ANY "${p_devname:-$devname}" catalog_struct + [ "$desc" ] || f_struct "catalog_device_$catalog_struct" get desc desc + + # Use device catalog entry for potential re-classification(s) + f_struct "catalog_device_$catalog_struct" get type catalog_type + + # Restore debugging for this next part (device registration) + debug="$old_debug" + + # + # Register the device + # + local retval device + case "$type" in + $GEOM_CLASS_DISK) + # First attempt to classify by device catalog (see MAIN) + case "$catalog_type" in + $DEVICE_TYPE_CDROM) + f_dprintf "Found CDROM device for disk %s" "$devname" + debug= f_device_register device "$devname" "$desc" \ + "/dev/$devname" $DEVICE_TYPE_CDROM 1 \ + f_media_init_cdrom f_media_get_cdrom \ + f_media_shutdown_cdrom "" "$capacity" && + return $SUCCESS + ;; + esac + + # Fall back to register label device as a disk and taste it + f_dprintf "Found disk device named %s" "$devname" + debug= f_struct "$p_provider_config" get \ + ident disk_ident || + debug= f_struct "$provider_config" get \ + ident disk_ident + debug= f_device_register device "$devname" "$desc" \ + "/dev/$devname" $DEVICE_TYPE_DISK 1 \ + "" "" "" "$disk_ident" "$capacity" + retval=$? + + # Detect ``dangerously dedicated'' filesystems (errors ignored) + f_device_probe_disk_fs device "$devname" "$capacity" && + retval=$SUCCESS + + return $retval + ;; + $GEOM_CLASS_FD) + f_dprintf "Found floppy device named %s" "$devname" + debug= f_device_register device "$devname" "$desc" \ + "/dev/$devname" $DEVICE_TYPE_FLOPPY 1 \ + f_media_init_floppy f_media_get_floppy \ + f_media_shutdown_floppy "" "$capacity" + return $? + ;; + $GEOM_CLASS_LABEL) + : fall through to below section # reduces indentation level + ;; + $GEOM_CLASS_MD) + f_dprintf "Found disk device named %s" "$devname" + debug= f_device_register device "$devname" "$desc" \ + "/dev/$devname" $DEVICE_TYPE_DISK 1 \ + "" "" "" "" "$capacity" + retval=$? + + # + # Attempt to get file(1) magic to potentially classify as + # alternate media type. If unable to get magic, fall back to + # md(4) characteristics (such as vnode filename). + # + [ -r "/dev/$devname" ] && + magic=$( file -bs "/dev/$devname" 2> /dev/null ) + if [ ! "$magic" ]; then + # Fall back to md(4) characteristics + if f_struct "$p_provider_config"; then + config="$p_provider_config" + else + config="$provider_config" + fi + debug= f_struct "$config" get type config_type + debug= f_struct "$config" get file config_file + + # Substitute magic for below based on type and file + case "$config_type=$config_file" in + vnode=*.iso) magic="ISO 9660" ;; + esac + fi + f_device_probe_disk_fs device \ + "$devname" "$capacity" "$magic" && + retval=$SUCCESS # Errors ignored + + return $retval + ;; + $GEOM_CLASS_PART) + if f_struct "$p_provider_config"; then + config="$p_provider_config" + else + config="$provider_config" + fi + debug= f_struct "$config" get type provider_config_type + f_device_probe_geom_part device \ + "$provider_config_type" "$devname" "$capacity" + retval=$? + device_type=$DEVICE_TYPE_NONE + [ $retval -eq $SUCCESS ] && + debug= f_struct "$device" get type device_type + + # Potentially re-classify as USB device + if [ "$device_type" = "$DEVICE_TYPE_UFS" -a \ + "$catalog_type" = "$DEVICE_TYPE_USB" ] + then + f_dprintf "Found USB device for partition %s" \ + "$devname" + debug= f_struct "$p_provider_geom" get \ + name disk_name || + debug= f_struct "$provider_geom" get \ + name disk_name + debug= f_device_register device "$devname" "$desc" \ + "/dev/$devname" $DEVICE_TYPE_USB 1 \ + f_media_init_usb f_media_get_usb \ + f_media_shutdown_usb "$disk_name" "$capacity" + retval=$? + fi + + return $retval + ;; + $GEOM_CLASS_RAID) + # Use the provider geom name as the description + if [ ! "$desc" ]; then + f_struct "$p_provider_geom" get name desc || + f_struct "$provider_geom" get name desc + fi + + f_dprintf "Found disk device named %s" "$devname" + debug= f_device_register device \ + "$devname" "${desc:-GEOM RAID device}" \ + "/dev/$devname" $DEVICE_TYPE_DISK 1 \ + "" "" "" "" "$capacity" + retval=$? + + # Detect ``dangerously dedicated'' filesystems + f_device_probe_disk_fs device "$devname" "$capacity" && + retval=$SUCCESS # Errors ignored + + return $retval + ;; + $GEOM_CLASS_ZFS_ZVOL) + f_dprintf "Found disk device named %s" "$devname" + debug= f_device_register device \ + "$devname" "${desc:-GEOM ZFS::ZVOL device}" \ + "/dev/$devname" $DEVICE_TYPE_DISK 1 \ + "" "" "" "" "$capacity" + retval=$? + + # Detect ``dangerously dedicated'' filesystems + f_device_probe_disk_fs device "$devname" "$capacity" && + retval=$SUCCESS # Errors ignored + + return $retval + ;; + *) + return $FAILURE # Unknown GEOM class + esac + + # + # Still here? Must be $GEOM_CLASS_LABEL + # + + local label_geom label_devname label_devgeom= label_devconsumer + local label_devprovider= label_devprovider_ref label_devprovider_config + local label_gpart_type + + if f_struct "$p_provider"; then + label_geom="$p_provider_geom" + else + label_geom="$provider_geom" + fi + + case "$devname" in + gpt/*|gptid/*) + # + # Attempt to get the partition type by getting the `config' + # member of the provider for our device (which is named in the + # parent geom of our current provider). + # + debug= f_struct "$label_geom" get name label_devname && + debug= f_geom_find "$label_devname" $GEOM_CLASS_DEV \ + label_devgeom + debug= f_struct "$label_devgeom" get \ + consumer1 label_devconsumer + debug= f_struct "$label_devconsumer" get \ + provider_ref label_devprovider_ref && + debug= f_geom_find_by id "$label_devprovider_ref" \ + provider label_devprovider + debug= f_struct "$label_devprovider" get \ + config label_devprovider_config + debug= f_struct "$label_devprovider_config" get \ + type label_gpart_type + + # + # Register device label based on partition type + # + f_device_probe_geom_part device \ + "$label_gpart_type" "$devname" "$capacity" + return $? + ;; + iso9660/*) + f_dprintf "Found CDROM device labeled %s" "$devname" + debug= f_device_register device \ + "$devname" "ISO9660 file system" \ + "/dev/$devname" $DEVICE_TYPE_CDROM 1 \ + f_media_init_cdrom f_media_get_cdrom \ + f_media_shutdown_cdrom "" "$capacity" + return $? + ;; + label/*) + # For generic labels, use provider geom name as real device + debug= f_struct "$label_geom" get name label_devname + + # Look up label geom device in device catalog for default desc + debug= f_device_catalog_get \ + $DEVICE_TYPE_ANY "$label_devname" catalog_struct + [ "$desc" ] || debug= f_struct \ + "catalog_device_$catalog_struct" get desc desc + + # Use device catalog entry for potential re-classification(s) + debug= f_struct "catalog_device_$catalog_struct" get \ + type catalog_type + + # First attempt to classify by device catalog (see MAIN) + case "$catalog_type" in + $DEVICE_TYPE_CDROM) + f_dprintf "Found CDROM device for disk %s" "$devname" + debug= f_device_register device "$devname" "$desc" \ + "/dev/$devname" $DEVICE_TYPE_CDROM 1 \ + f_media_init_cdrom f_media_get_cdrom \ + f_media_shutdown_cdrom "" "$capacity" && + return $SUCCESS + ;; + esac + + # Fall back to register label device as a disk and taste it + f_dprintf "Found disk device labeled %s" "$devname" + debug= f_device_register device \ + "$devname" "GEOM LABEL device" \ + "/dev/$devname" $DEVICE_TYPE_DISK 1 \ + "" "" "" "" "$capacity" + retval=$? + + # Detect ``dangerously dedicated'' filesystems (errors ignored) + f_device_probe_disk_fs device "$devname" "$capacity" && + retval=$SUCCESS + + return $retval + ;; + msdosfs/*) + f_dprintf "Found DOS partition labeled %s" "$devname" + debug= f_device_register device "$devname" "DOS file system" \ + "/dev/$devname" $DEVICE_TYPE_DOS 1 \ + f_media_init_dos f_media_get_dos \ + f_media_shutdown_dos "" "$capacity" + return $? + ;; + ufs/*|ufsid/*) + f_dprintf "Found UFS partition labeled %s" "$devname" + debug= f_device_register device "$devname" "UFS file system" \ + "/dev/$devname" $DEVICE_TYPE_UFS 1 \ + f_media_init_ufs f_media_get_ufs \ + f_media_shutdown_ufs "" "$capacity" + return $? + ;; + ext2fs/*|ntfs/*|reiserfs/*) + return $FAILURE # No media device handlers for these labels + ;; + esac + + # Unable to classify GEOM label + return $FAILURE +} + +# f_device_probe_geom_part $var_to_set $gpart_type $devname $capacity [$magic] +# +# Given a gpart(8) partition type and a device name, register the device if it +# is a known partition type that we can handle. If $var_to_set is non-NULL, +# upon success holds the DEVICE struct name of the registered device. +# +# Returns success if the device was successfully registered, failure otherwise. +# +f_device_probe_geom_part() +{ + local __var_to_set="$1" __gpart_type="$2" __devname="$3" + local __capacity="${4:--1}" __magic="$5" + + # + # Register device based on partition type + # NB: !0 equates to `unused' bsdlabel + # + case "$__gpart_type" in + fat16|fat32) + f_dprintf "Found DOS partition named %s" "$__devname" + debug= f_device_register "$__var_to_set" \ + "$__devname" "DOS file system" \ + "/dev/$__devname" $DEVICE_TYPE_DOS 1 \ + f_media_init_dos f_media_get_dos \ + f_media_shutdown_dos "" "$__capacity" + return $? + ;; + freebsd|!0) # Commonly used inappropriately, taste for FreeBSD + [ -r "/dev/$__devname" -a ! "$__magic" ] && + __magic=$( file -bs "/dev/$__devname" 2> /dev/null ) + case "$__magic" in + *"Unix Fast File system"*) + f_dprintf "Found UFS partition named %s" "$__devname" + debug= f_device_register "$__var_to_set" \ + "$__devname" "UFS file system" \ + "/dev/$__devname" $DEVICE_TYPE_UFS 1 \ + f_media_init_ufs f_media_get_ufs \ + f_media_shutdown_ufs "" "$__capacity" + return $? + esac + return $FAILURE + ;; + freebsd-ufs) + f_dprintf "Found UFS partition named %s" "$__devname" + debug= f_device_register "$__var_to_set" \ + "$__devname" "UFS file system" \ + "/dev/$__devname" $DEVICE_TYPE_UFS 1 \ + f_media_init_ufs f_media_get_ufs \ + f_media_shutdown_ufs "" "$__capacity" + return $? + ;; + apple-*|linux-*|ms-*|netbsd-*|ntfs|vmware-*) + return $FAILURE # No device types for these + ;; + bios-*|ebr|efi|mbr|freebsd-boot|freebsd-swap) + return $FAILURE # Not a source for media + ;; + freebsd-nandfs|freebsd-vinum|freebsd-zfs) + return $FAILURE # Unsupported as media source + ;; + esac + + return $FAILURE # Unknown partition type +} + +# f_device_probe_disk_fs $var_to_set $devname [$capacity [$magic]] +# +# Given a device name, taste it and register the device if it is a so-called +# ``dangerously dedicated'' file system written without a partition table. +# Tasting is done using file(1) (specifically `file -bs') but if $magic is +# present and non-NULL it is used instead. If $var_to_set is non-NULL, upon +# success holds the DEVICE struct name of the registered device. # -# Fetch the device type (type), description (desc), or maximum number of -# devices to scan for (max) associated with device $name and $type. If $type is -# either NULL, missing, or set to $DEVICE_TYPE_ANY then only $name is used. +# Returns success if the device was successfully registered, failure otherwise. +# +f_device_probe_disk_fs() +{ + local __var_to_set="$1" __devname="$2" __capacity="${3:--1}" + local __magic="$4" + + [ -r "/dev/${__devname#/dev/}" -a ! "$__magic" ] && + __magic=$( file -bs "/dev/$__devname" 2> /dev/null ) + + case "$__magic" in + *"ISO 9660"*) + f_dprintf "Found CDROM device for disk %s" "$__devname" + debug= f_device_register "$__var_to_set" \ + "$__devname" "ISO9660 file system" \ + "/dev/$__devname" $DEVICE_TYPE_CDROM 1 \ + f_media_init_cdrom f_media_get_cdrom \ + f_media_shutdown_cdrom "" "$__capacity" + return $? + ;; + *"Unix Fast File system"*) + f_dprintf "Found UFS device for disk %s" "$__devname" + debug= f_device_register "$__var_to_set" \ + "$__devname" "UFS file system" \ + "/dev/$__devname" $DEVICE_TYPE_UFS 1 \ + f_media_init_ufs f_media_get_ufs \ + f_media_shutdown_ufs "" "$__capacity" + return $? + ;; + *"FAT (12 bit)"*|*"FAT (16 bit)"*|*"FAT (32 bit)"*) + f_dprintf "Found DOS device for disk %s" "$__devname" + debug= f_device_register "$__var_to_set" \ + "$__devname" "DOS file system" \ + "/dev/$__devname" $DEVICE_TYPE_DOS 1 \ + f_media_init_dos f_media_get_dos \ + f_media_shutdown_dos "" "$__capacity" + return $? + ;; + esac + + return $FAILURE # Unknown file system type +} + +# f_device_catalog_get $type $name [$var_to_set] +# +# Fetch the struct name of the catalog device matching device $name. If $type +# is either NULL, missing, or set to $DEVICE_TYPE_ANY then only $name is used. # Returns success if a match was found, otherwise failure. # -# If $var_to_set is missing or NULL, the device name is printed to standard out +# If $var_to_set is missing or NULL, the 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_device_name_get() +f_device_catalog_get() { - local __type="$1" __name="$2" __prop="$3" __var_to_set="$4" - local __dev __devtype __n=0 + local __type="$1" __name="$2" __var_to_set="$3" + local __dname= - # Return failure if no $name or $prop is an unknown property + # Return failure if no $name [ "$__name" ] || return $FAILURE - case "$__prop" in type|desc|max) : good ;; - *) return $FAILURE; esac + + # Disable debugging to keep debug output light + local debug= # # 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= + local __left="${__name%%[0-9]*}" __right="${__name#*[0-9]}" if [ "$__left" != "$__name" ]; then # Chop leading digits from right 'til we hit first non-digit while :; do @@ -478,45 +829,58 @@ f_device_name_get() fi [ "$__type" = "$DEVICE_TYPE_ANY" ] && __type= - for __dev in $DEVICE_NAMES; do - __n=$(( $__n + 1 )) - [ "$__dev" = "$__name" -o "$__dev" = "$__dname" ] || continue - f_getvar _device_type$__n __devtype - [ "${__type:-$__devtype}" = "$__devtype" ] || continue - f_getvar _device_$__prop$__n $__var_to_set + local __dev __dev_name __dev_type + for __dev in $DEVICE_CATALOG; do + catalog_device_$__dev get name __dev_name + [ "$__dev_name" = "$__name" -o "$__dev_name" = "$__dname" ] || + continue + catalog_device_$__dev get type __dev_type + [ "${__type:-$__dev_type}" = "$__dev_type" ] || continue + if [ "$__var_to_set" ]; then + setvar "$__var_to_set" $__dev + else + echo $__dev + fi return $? done + + [ "$__var_to_set" ] && setvar "$__var_to_set" "" return $FAILURE } -# f_device_name_set $type $name $desc [$max] +# f_device_catalog_set $type $name $desc # -# Store a description (desc) and [optionally] maximum number of devices to scan -# for (max) in-association with device $type and $name. Returns success unless -# $name is NULL or missing. Use the f_device_name_get() routine with the same -# $name and optionally $type to retrieve one of type, desc, or max properties. +# Store a description (desc) in-association with device $type and $name. +# Returns success unless $name is NULL or missing. Use f_device_catalog_get() +# routine with the same $name and optionally $type to retrieve catalog device +# structure (see CATALOG_DEVICE struct definition in GLOBALS section). # -f_device_name_set() +f_device_catalog_set() { - local type="$1" name="$2" desc="$3" max="$4" - local dev devtype n=0 found= + local type="$1" name="$2" desc="$3" + local struct dev dev_type found= + [ "$name" ] || return $FAILURE - for dev in $DEVICE_NAMES; do - n=$(( $n + 1 )) - [ "$dev" = "$name" ] || continue - if f_getvar _device_type$n devtype; then - # Allow multiple entries with same name but diff type - [ "$devtype" = "$type" ] || continue - fi - found=1 && break - done - if [ ! "$found" ]; then - DEVICE_NAMES="$DEVICE_NAMES $name" - n=$(( $n + 1 )) + + # Disable debugging to keep debug output light + local debug= + + f_str2varname "$name" struct + if [ ! "$DEVICE_CATALOG_APPEND_ONLY" ]; then + for dev in $DEVICE_CATALOG; do + [ "$dev" = "$struct" ] || continue + found=1 break + done fi - setvar _device_type$n "$type" - setvar _device_desc$n "$desc" - [ "${4+set}" ] && setvar _device_max$n "$max" + if [ "$found" ]; then + f_struct_free "catalog_device_$struct" + else + DEVICE_CATALOG="$DEVICE_CATALOG $struct" + fi + f_struct_new CATALOG_DEVICE "catalog_device_$struct" || return $FAILURE + catalog_device_$struct set type "$type" + catalog_device_$struct set name "$name" + catalog_device_$struct set desc "$desc" return $SUCCESS } @@ -540,8 +904,8 @@ f_device_desc() [ "$__var_to_set" ] && { setvar "$__var_to_set" "" || return; } # - # Return sysctl MIB dev.NAME.UNIT.%desc if it exists, - # otherwise fall through to below static list. + # Return sysctl MIB dev.NAME.UNIT.%desc if it exists, otherwise fall + # through to further alternate methods. # if f_have sysctl; then __devname="${__name%%[0-9]*}" @@ -561,54 +925,11 @@ 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 )) - debug= f_getvar _device_type$__n __devtype - [ "${__type:-$__devtype}" = "$__devtype" ] || continue - if [ "$__devtype" = "$DEVICE_TYPE_NETWORK" ]; then - __devname=$( f_substr "$__name" 0 ${#__dev} ) - [ "$__devname" = "$__dev" ] || continue - else - [ "$__dev" = "$__name" -o "$__dev" = "$__dname" ] || - continue - fi - debug= f_getvar _device_desc$__n $__var_to_set - return $? - done + # Look up device in catalog for default description + local __catalog_struct + debug= f_device_catalog_get "$__type" "$__name" __catalog_struct + debug= f_struct "catalog_device_$__catalog_struct" get \ + desc "$__var_to_set" && return $SUCCESS # # Sensible fall-backs for specific types @@ -617,7 +938,7 @@ f_device_desc() $DEVICE_TYPE_CDROM) __cp="<unknown cdrom device type>" ;; $DEVICE_TYPE_DISK) __cp="<unknown disk device type>" ;; $DEVICE_TYPE_FLOPPY) __cp="<unknown floppy device type>" ;; - $DEVICE_TYPE_USB) __cp="<unknown usb storage device type>" ;; + $DEVICE_TYPE_USB) __cp="<unknown USB storage device type>" ;; $DEVICE_TYPE_NETWORK) __cp="<unknown network interface type>" ;; *) __cp="<unknown device type>" @@ -642,14 +963,14 @@ f_device_is_ethernet() local dev="$1" type flags # Make sure we have an actual device by that name - f_struct "device_$dev" || return $FAILURE + f_struct "$dev" || return $FAILURE # Make sure that the device is a network device - device_$dev get type type + $dev get type type [ "$type" = "$DEVICE_TYPE_NETWORK" ] || return $FAILURE # Make sure that the media flags indicate that it is Ethernet - device_$dev get flags flags + $dev get flags flags [ $(( ${flags:-0} & $IF_ETHERNET )) -eq $IF_ETHERNET ] } @@ -663,14 +984,14 @@ f_device_is_wireless() local dev="$1" type flags # Make sure we have an actual device by that name - f_struct "device_$dev" || return $FAILURE + f_struct "$dev" || return $FAILURE # Make sure that the device is a network device - device_$dev get type type + $dev get type type [ "$type" = "$DEVICE_TYPE_NETWORK" ] || return $FAILURE - # Make sure that the media flags indicate that it is Ethernet - device_$dev get flags flags + # Make sure that the media flags indicate that it is 802.11 wireless + $dev get flags flags [ $(( ${flags:-0} & $IF_WIRELESS )) -eq $IF_WIRELESS ] } @@ -684,13 +1005,13 @@ f_device_is_active() local dev="$1" type flags=0 # Make sure we have an actual device by that name - f_struct "device_$dev" || return $FAILURE + f_struct "$dev" || return $FAILURE - device_$dev get type type + $dev get type type case "$type" in $DEVICE_TYPE_NETWORK) # Make sure that the media flags indicate that it is active - device_$dev get flags flags + $dev get flags flags [ $(( ${flags:-0} & $IF_ACTIVE )) -eq $IF_ACTIVE ] ;; *) @@ -698,49 +1019,42 @@ f_device_is_active() esac } -# f_device_rescan -# -# Rescan all devices, after closing previous set - convenience function. -# -f_device_rescan() -{ - f_device_reset - f_device_get_all -} - -# f_device_rescan_network -# -# Rescan all network devices, after closing previous set - for convenience. -# -f_device_rescan_network() -{ - f_device_reset_network - f_device_get_all_network -} - -# f_device_find $name [$type [$var_to_set]] +# f_device_find [-1] $name [$type [$var_to_set]] # # Find one or more registered devices by name, type, or both. Returns a space- # separated list of devices matching the search criterion. # +# If `-1' option flag is given, only the first matching device is returned. +# # If $var_to_set is missing or NULL, the device 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_device_find() { + local OPTIND OPTARG flag only_one= + while getopts 1 flag; do + case "$flag" in + 1) only_one=1 ;; + esac + done + shift $(( $OPTIND - 1 )) + local __name="$1" __type="${2:-$DEVICE_TYPE_ANY}" __var_to_set="$3" - local __dev __devname __devtype __found= - for __dev in $DEVICES; do - device_$__dev get name __devname - device_$__dev get type __devtype + local __n=1 __devname __devtype __found= + while [ $__n -le $NDEVICES ]; do + device_$__n get name __devname + device_$__n get type __devtype if [ "$__name" = "$__devname" -o ! "$__name" ] && [ "$__type" = "$DEVICE_TYPE_ANY" -o \ "$__type" = "$__devtype" ] then - __found="$__found $__dev" + __found="$__found device_$__n" + [ "$only_one" ] && break fi + __n=$(( $__n + 1 )) done + if [ "$__var_to_set" ]; then setvar "$__var_to_set" "${__found# }" else @@ -749,38 +1063,100 @@ f_device_find() [ "$__found" ] # Return status } -# f_device_init $name +# f_device_init $device # -# Initialize a device by evaluating its `init' function. +# Initialize a device by evaluating its `init' function. The $device argument +# is a DEVICE struct name. # f_device_init() { - local name="$1" init_func - device_$name get init init_func || return $? - ${init_func:-:} $name + local device="$1" init_func + f_struct "$device" || return $? + $device get init init_func + ${init_func:-:} "$device" } -# f_device_get $name $file [$probe] +# f_device_get $device $file [$probe] # # Read $file by evaluating the device's `get' function. The file is commonly # produced on standard output (but it truly depends on the function called). +# The $device argument is a DEVICE struct name. # f_device_get() { - local name="$1" file="$2" probe="$3" get_func - device_$name get get get_func || return $? - ${get_func:-:} $name "$file" ${3+"$probe"} + local device="$1" file="$2" probe="$3" get_func + f_struct "$device" || return $? + $device get get get_func + ${get_func:-:} "$device" "$file" ${3+"$probe"} } -# f_device_shutdown $name +# f_device_shutdown $device # -# Shutdown a device by evaluating its `shutdown' function. +# Shutdown a device by evaluating its `shutdown' function. The $device argument +# is a DEVICE struct name. # f_device_shutdown() { - local name="$1" shutdown_func - device_$name get shutdown shutdown_func || return $? - ${shutdown_func:-:} $name + local device="$1" shutdown_func + f_struct "$device" || return $? + $device get shutdown shutdown_func + ${shutdown_func:-:} "$device" +} + +# f_devices_sort_by $property $var_to_get [$var_to_set] +# +# Take list of devices from $var_to_get (separated by whitespace, newline +# included) and sort them by $property (e.g., `name'). The sorted list of +# DEVICE struct names is returned on standard output separated by whitespace +# (newline to be specific) unless $var_to_set is present and non-NULL. +# +# This function is a two-parter. Below is the awk(1) portion of the function, +# afterward is the sh(1) function which utilizes the below awk script. +# +f_device_sort_by_awk=' +# Variables that should be defined on the invocation line: +# -v prop="property" +function asorti(src, dest) +{ + for (i in src) dest[++nitems] = i + for (i = 1; i <= nitems; k = i++) { + idx = dest[i] + while ((k > 0) && (dest[k] > idx)) { + dest[k+1] = dest[k]; k-- + } + dest[k+1] = idx + } + return nitems +} +{ + split($0, devs, FS) + for (d in devs) { + name = ENVIRON["_struct_value_" devs[d] "_" prop] + devices[name] = devs[d] + } +} +END { + nitems = asorti(devices, devices_sorted) + for (i = 1; i <= nitems; i++) print devices[devices_sorted[i]] +} +' +f_device_sort_by() +{ + local __property="${1:-name}" __var_to_get="$2" __var_to_set="$3" + + f_isset "$__var_to_get" || return $FAILURE + + local __dev + for __dev in $( f_getvar "$__var_to_get" ); do + export _struct_value_${__dev}_$__property + done + + local __cp + setvar "${__var_to_set:-__cp}" "$( + f_getvar "$__var_to_get" | + awk -v prop="$__property" "$f_device_sort_by_awk" + )" + [ "$__var_to_set" ] || echo "$__cp" } # f_device_menu $title $prompt $hline $device_type [$helpfile] @@ -795,20 +1171,20 @@ f_device_menu() local prompt="$2" hline="$3" type="$4" helpfile="$5" - local dev devtype devs= - for dev in $DEVICES; do - device_$dev get type devtype || continue - [ "$devtype" = "$type" ] || continue - devs="$devs $dev" - done - [ "$devs" ] || return $DIALOG_CANCEL + local devs + f_device_find "" "$type" devs || return $DIALOG_CANCEL - local desc menu_list= + local name desc menu_list= + f_device_sort_by name devs devs for dev in $devs; do - device_$dev get desc desc + $dev get name name + $dev get desc desc + f_shell_escape "$name" name f_shell_escape "$desc" desc - menu_list="$menu_list '$dev' '$desc'" + menu_list="$menu_list + '$name' '$desc'" # END-QUOTE done + menu_list="${menu_list#$NL}" local height width rows eval f_dialog_menu_size height width rows \ @@ -827,6 +1203,7 @@ f_device_menu() mtag=$( eval $DIALOG \ --title \"\$title\" \ --backtitle \"\$btitle\" \ + --hline \"\$hline\" \ --ok-label \"\$msg_ok\" \ --cancel-label \"\$msg_cancel\" \ ${helpfile:+ \ @@ -851,165 +1228,158 @@ f_device_menu() [ "$errexit" ] && set -e if [ $retval -eq $DIALOG_OK ]; then - # Clean up the output of [X]dialog(1) and return it + # Clean up the output of [X]dialog(1) f_dialog_data_sanitize mtag - echo "$mtag" >&2 + + # Map the user's choice back to a struct name + local index device + index=$( eval f_dialog_menutag2index \"\$mtag\" $menu_list ) + device=$( set -- $devs; eval echo \${$index} ) + + echo "$device" >&2 fi return $retval } -# f_device_capacity $device [$var_to_set] # -# Return the capacity of $device in bytes. +# Short-hand # -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 +f_cdrom() { f_device_catalog_set $DEVICE_TYPE_CDROM "$1" "$2"; } +f_disk() { f_device_catalog_set $DEVICE_TYPE_DISK "$1" "$2"; } +f_floppy() { f_device_catalog_set $DEVICE_TYPE_FLOPPY "$1" "$2"; } +f_usb() { f_device_catalog_set $DEVICE_TYPE_USB "$1" "$2"; } +f_network() { f_device_catalog_set $DEVICE_TYPE_NETWORK "$1" "$2"; } - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "$__bytes" - else - echo "$__bytes" - fi -} +############################################################ MAIN # -# Short-hand +# The below classifications allow us to re-group the GEOM devices from the +# `DEV' GEOM class appropriately while providing fall-back descriptions both +# for making the below code more maintainable and handling the rare case the +# GEOM device lacks a description. # -f_cdrom() { f_device_name_set $DEVICE_TYPE_CDROM "$1" "$2" "$3"; } -f_disk() { f_device_name_set $DEVICE_TYPE_DISK "$1" "$2" "$3"; } -f_floppy() { f_device_name_set $DEVICE_TYPE_FLOPPY "$1" "$2" "$3"; } -f_serial() { f_device_name_set $DEVICE_TYPE_NETWORK "$1" "$2" "$3"; } -f_usb() { f_device_name_set $DEVICE_TYPE_USB "$1" "$2" "$3"; } -f_network() { f_device_name_set $DEVICE_TYPE_NETWORK "$1" "$2"; } - -############################################################ MAIN -# CDROM, Disk, Floppy, Serial, and USB devices/names -f_cdrom "cd%d" "SCSI CDROM drive" 4 -f_cdrom "mcd%d" "Mitsumi (old model) CDROM drive" 4 -f_cdrom "scd%d" "Sony CDROM drive - CDU31/33A type" 4 -f_disk "aacd%d" "Adaptec FSA RAID array" 4 -f_disk "ada%d" "ATA/SATA disk device" 16 -f_disk "amrd%d" "AMI MegaRAID drive" 4 -f_disk "da%d" "SCSI disk device" 16 -f_disk "idad%d" "Compaq RAID array" 4 -f_disk "ipsd%d" "IBM ServeRAID RAID array" 4 -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 +DEVICE_CATALOG_APPEND_ONLY=1 # Make initial loading faster + +# CDROM, Disk, Floppy, and USB devices/names +f_cdrom "cd%d" "SCSI CDROM drive" +f_cdrom "mcd%d" "Mitsumi (old model) CDROM drive" +f_cdrom "scd%d" "Sony CDROM drive - CDU31/33A type" +f_disk "aacd%d" "Adaptec FSA RAID array" +f_disk "ada%d" "ATA/SATA disk device" +f_disk "amrd%d" "AMI MegaRAID drive" +f_disk "da%d" "SCSI disk device" +f_disk "idad%d" "Compaq RAID array" +f_disk "ipsd%d" "IBM ServeRAID RAID array" +f_disk "md%d" "md(4) disk device" +f_disk "mfid%d" "LSI MegaRAID SAS array" +f_disk "mlxd%d" "Mylex RAID disk" +f_disk "twed%d" "3ware ATA RAID array" +f_disk "vtbd%d" "VirtIO Block Device" +f_floppy "fd%d" "Floppy Drive unit A" +f_usb "da%da" "USB Mass Storage Device" # Network interfaces/names -f_network "ae" "Attansic/Atheros L2 Fast Ethernet" -f_network "age" "Attansic/Atheros L1 Gigabit Ethernet" -f_network "alc" "Atheros AR8131/AR8132 PCIe Ethernet" -f_network "ale" "Atheros AR8121/AR8113/AR8114 PCIe Ethernet" -f_network "an" "Aironet 4500/4800 802.11 wireless adapter" -f_network "ath" "Atheros IEEE 802.11 wireless adapter" -f_network "aue" "ADMtek USB Ethernet adapter" -f_network "axe" "ASIX Electronics USB Ethernet adapter" -f_network "bce" "Broadcom NetXtreme II Gigabit Ethernet card" -f_network "bfe" "Broadcom BCM440x PCI Ethernet card" -f_network "bge" "Broadcom BCM570x PCI Gigabit Ethernet card" -f_network "bm" "Apple BMAC Built-in Ethernet" -f_network "bwn" "Broadcom BCM43xx IEEE 802.11 wireless adapter" -f_network "cas" "Sun Cassini/Cassini+ or NS DP83065 Saturn Ethernet" -f_network "cc3i" "SDL HSSI sync serial PCI card" -f_network "cue" "CATC USB Ethernet adapter" -f_network "cxgb" "Chelsio T3 10Gb Ethernet card" -f_network "dc" "DEC/Intel 21143 (and clones) PCI Fast Ethernet card" -f_network "de" "DEC DE435 PCI NIC or other DC21040-AA based card" -f_network "disc" "Software discard network interface" -f_network "ed" "Novell NE1000/2000; 3C503; NE2000-compatible PCMCIA" -f_network "el" "3Com 3C501 Ethernet card" -f_network "em" "Intel(R) PRO/1000 Ethernet card" -f_network "en" "Efficient Networks ATM PCI card" -f_network "ep" "3Com 3C509 Ethernet card/3C589 PCMCIA" -f_network "et" "Agere ET1310 based PCI Express Gigabit Ethernet card" -f_network "ex" "Intel EtherExpress Pro/10 Ethernet card" -f_network "fe" "Fujitsu MB86960A/MB86965A Ethernet card" -f_network "fpa" "DEC DEFPA PCI FDDI card" -f_network "fwe" "FireWire Ethernet emulation" -f_network "fwip" "IP over FireWire" -f_network "fxp" "Intel EtherExpress Pro/100B PCI Fast Ethernet card" -f_network "gem" "Apple GMAC or Sun ERI/GEM Ethernet adapter" -f_network "hme" "Sun HME (Happy Meal Ethernet) Ethernet adapter" -f_network "ie" "AT&T StarLAN 10 and EN100; 3Com 3C507; NI5210" -f_network "igb" "Intel(R) PRO/1000 PCI Express Gigabit Ethernet card" -f_network "ipw" "Intel PRO/Wireless 2100 IEEE 802.11 adapter" -f_network "iwi" "Intel PRO/Wireless 2200BG/2225BG/2915ABG adapter" -f_network "iwn" "Intel Wireless WiFi Link 4965AGN IEEE 802.11n adapter" -f_network "ixgbe" "Intel(R) PRO/10Gb Ethernet card" -f_network "ixgb" "Intel(R) PRO/10Gb Ethernet card" -f_network "ix" "Intel Etherexpress Ethernet card" - # Maintain sequential order of above(3): ixgbe ixgb ix -f_network "jme" "JMicron JMC250 Gigabit/JMC260 Fast Ethernet" -f_network "kue" "Kawasaki LSI USB Ethernet adapter" -f_network "le" "AMD Am7900 LANCE or Am79C9xx PCnet Ethernet adapter" -f_network "lge" "Level 1 LXT1001 Gigabit Ethernet card" -f_network "lnc" "Lance/PCnet (Isolan/Novell NE2100/NE32-VL) Ethernet" -f_network "lo" "Loop-back (local) network interface" -f_network "lp" "Parallel Port IP (PLIP) peer connection" -f_network "malo" "Marvell Libertas 88W8335 802.11 wireless adapter" -f_network "msk" "Marvell/SysKonnect Yukon II Gigabit Ethernet" -f_network "mxge" "Myricom Myri10GE 10Gb Ethernet card" -f_network "nfe" "NVIDIA nForce MCP Ethernet" -f_network "nge" "NatSemi PCI Gigabit Ethernet card" -f_network "ng" "Vimage netgraph(4) bridged Ethernet device" - # Maintain sequential order of above(2): nge ng -f_network "nve" "NVIDIA nForce MCP Ethernet" -f_network "nxge" "Neterion Xframe 10GbE Server/Storage adapter" -f_network "pcn" "AMD Am79c79x PCI Ethernet card" -f_network "plip" "Parallel Port IP (PLIP) peer connection" -f_network "ral" "Ralink Technology IEEE 802.11 wireless adapter" -f_network "ray" "Raytheon Raylink 802.11 wireless adapter" -f_network "re" "RealTek 8139C+/8169/8169S/8110S PCI Ethernet adapter" -f_network "rl" "RealTek 8129/8139 PCI Ethernet card" -f_network "rue" "RealTek USB Ethernet card" -f_network "rum" "Ralink Technology USB IEEE 802.11 wireless adapter" -f_network "sf" "Adaptec AIC-6915 PCI Ethernet card" -f_network "sge" "Silicon Integrated Systems SiS190/191 Ethernet" -f_network "sis" "SiS 900/SiS 7016 PCI Ethernet card" -f_network "sk" "SysKonnect PCI Gigabit Ethernet card" -f_network "snc" "SONIC Ethernet card" -f_network "sn" "SMC/Megahertz Ethernet card" - # Maintain sequential order of above(2): snc sn -f_network "sr" "SDL T1/E1 sync serial PCI card" -f_network "ste" "Sundance ST201 PCI Ethernet card" -f_network "stge" "Sundance/Tamarack TC9021 Gigabit Ethernet" -f_network "ti" "Alteon Networks PCI Gigabit Ethernet card" -f_network "tl" "Texas Instruments ThunderLAN PCI Ethernet card" -f_network "txp" "3Com 3cR990 Ethernet card" -f_network "tx" "SMC 9432TX Ethernet card" - # Maintain sequential order of above(2): txp tx -f_network "uath" "Atheros AR5005UG and AR5005UX USB wireless adapter" -f_network "upgt" "Conexant/Intersil PrismGT USB wireless adapter" -f_network "ural" "Ralink Technology RT2500USB 802.11 wireless adapter" -f_network "urtw" "Realtek 8187L USB wireless adapter" -f_network "vge" "VIA VT612x PCI Gigabit Ethernet card" -f_network "vlan" "IEEE 802.1Q VLAN network interface" -f_network "vr" "VIA VT3043/VT86C100A Rhine PCI Ethernet card" -f_network "vx" "3COM 3c590 / 3c595 Ethernet card" -f_network "wb" "Winbond W89C840F PCI Ethernet card" -f_network "wi" "Lucent WaveLAN/IEEE 802.11 wireless adapter" -f_network "wpi" "Intel 3945ABG IEEE 802.11 wireless adapter" -f_network "wx" "Intel Gigabit Ethernet (82452) card" -f_network "xe" "Xircom/Intel EtherExpress Pro100/16 Ethernet card" -f_network "xl" "3COM 3c90x / 3c90xB PCI Ethernet card" -f_network "zyd" "ZyDAS ZD1211/ZD1211B USB 802.11 wireless adapter" - -f_count NDEVICES $DEVICE_NAMES -f_dprintf "%s: Initialized %u known device names/descriptions." device.subr \ - $NDEVICES +f_network "ae%d" "Attansic/Atheros L2 Fast Ethernet" +f_network "age%d" "Attansic/Atheros L1 Gigabit Ethernet" +f_network "alc%d" "Atheros AR8131/AR8132 PCIe Ethernet" +f_network "ale%d" "Atheros AR8121/AR8113/AR8114 PCIe Ethernet" +f_network "an%d" "Aironet 4500/4800 802.11 wireless adapter" +f_network "ath%d" "Atheros IEEE 802.11 wireless adapter" +f_network "aue%d" "ADMtek USB Ethernet adapter" +f_network "axe%d" "ASIX Electronics USB Ethernet adapter" +f_network "bce%d" "Broadcom NetXtreme II Gigabit Ethernet card" +f_network "bfe%d" "Broadcom BCM440x PCI Ethernet card" +f_network "bge%d" "Broadcom BCM570x PCI Gigabit Ethernet card" +f_network "bm%d" "Apple BMAC Built-in Ethernet" +f_network "bwn%d" "Broadcom BCM43xx IEEE 802.11 wireless adapter" +f_network "cas%d" "Sun Cassini/Cassini+ or NS DP83065 Saturn Ethernet" +f_network "cc3i%d" "SDL HSSI sync serial PCI card" +f_network "cue%d" "CATC USB Ethernet adapter" +f_network "cxgb%d" "Chelsio T3 10Gb Ethernet card" +f_network "dc%d" "DEC/Intel 21143 (and clones) PCI Fast Ethernet card" +f_network "de%d" "DEC DE435 PCI NIC or other DC21040-AA based card" +f_network "disc%d" "Software discard network interface" +f_network "ed%d" "Novell NE1000/2000; 3C503; NE2000-compatible PCMCIA" +f_network "el%d" "3Com 3C501 Ethernet card" +f_network "em%d" "Intel(R) PRO/1000 Ethernet card" +f_network "en%d" "Efficient Networks ATM PCI card" +f_network "ep%d" "3Com 3C509 Ethernet card/3C589 PCMCIA" +f_network "et%d" "Agere ET1310 based PCI Express Gigabit Ethernet card" +f_network "ex%d" "Intel EtherExpress Pro/10 Ethernet card" +f_network "fe%d" "Fujitsu MB86960A/MB86965A Ethernet card" +f_network "fpa%d" "DEC DEFPA PCI FDDI card" +f_network "fwe%d" "FireWire Ethernet emulation" +f_network "fwip%d" "IP over FireWire" +f_network "fxp%d" "Intel EtherExpress Pro/100B PCI Fast Ethernet card" +f_network "gem%d" "Apple GMAC or Sun ERI/GEM Ethernet adapter" +f_network "hme%d" "Sun HME (Happy Meal Ethernet) Ethernet adapter" +f_network "ie%d" "AT&T StarLAN 10 and EN100; 3Com 3C507; NI5210" +f_network "igb%d" "Intel(R) PRO/1000 PCI Express Gigabit Ethernet card" +f_network "ipw%d" "Intel PRO/Wireless 2100 IEEE 802.11 adapter" +f_network "iwi%d" "Intel PRO/Wireless 2200BG/2225BG/2915ABG adapter" +f_network "iwn%d" "Intel Wireless WiFi Link 4965AGN IEEE 802.11n adapter" +f_network "ix%d" "Intel Etherexpress Ethernet card" +f_network "ixgb%d" "Intel(R) PRO/10Gb Ethernet card" +f_network "ixgbe%d" "Intel(R) PRO/10Gb Ethernet card" +f_network "jme%d" "JMicron JMC250 Gigabit/JMC260 Fast Ethernet" +f_network "kue%d" "Kawasaki LSI USB Ethernet adapter" +f_network "le%d" "AMD Am7900 LANCE or Am79C9xx PCnet Ethernet adapter" +f_network "lge%d" "Level 1 LXT1001 Gigabit Ethernet card" +f_network "lnc%d" "Lance/PCnet (Isolan/Novell NE2100/NE32-VL) Ethernet" +f_network "lo%d" "Loop-back (local) network interface" +f_network "lp%d" "Parallel Port IP (PLIP) peer connection" +f_network "malo%d" "Marvell Libertas 88W8335 802.11 wireless adapter" +f_network "msk%d" "Marvell/SysKonnect Yukon II Gigabit Ethernet" +f_network "mxge%d" "Myricom Myri10GE 10Gb Ethernet card" +f_network "nfe%d" "NVIDIA nForce MCP Ethernet" +f_network "ng%d" "Vimage netgraph(4) bridged Ethernet device" +f_network "nge%d" "NatSemi PCI Gigabit Ethernet card" +f_network "nve%d" "NVIDIA nForce MCP Ethernet" +f_network "nxge%d" "Neterion Xframe 10GbE Server/Storage adapter" +f_network "pcn%d" "AMD Am79c79x PCI Ethernet card" +f_network "plip%d" "Parallel Port IP (PLIP) peer connection" +f_network "ral%d" "Ralink Technology IEEE 802.11 wireless adapter" +f_network "ray%d" "Raytheon Raylink 802.11 wireless adapter" +f_network "re%d" "RealTek 8139C+/8169/8169S/8110S PCI Ethernet adapter" +f_network "rl%d" "RealTek 8129/8139 PCI Ethernet card" +f_network "rue%d" "RealTek USB Ethernet card" +f_network "rum%d" "Ralink Technology USB IEEE 802.11 wireless adapter" +f_network "sf%d" "Adaptec AIC-6915 PCI Ethernet card" +f_network "sge%d" "Silicon Integrated Systems SiS190/191 Ethernet" +f_network "sis%d" "SiS 900/SiS 7016 PCI Ethernet card" +f_network "sk%d" "SysKonnect PCI Gigabit Ethernet card" +f_network "sn%d" "SMC/Megahertz Ethernet card" +f_network "snc%d" "SONIC Ethernet card" +f_network "sr%d" "SDL T1/E1 sync serial PCI card" +f_network "ste%d" "Sundance ST201 PCI Ethernet card" +f_network "stge%d" "Sundance/Tamarack TC9021 Gigabit Ethernet" +f_network "ti%d" "Alteon Networks PCI Gigabit Ethernet card" +f_network "tl%d" "Texas Instruments ThunderLAN PCI Ethernet card" +f_network "tx%d" "SMC 9432TX Ethernet card" +f_network "txp%d" "3Com 3cR990 Ethernet card" +f_network "uath%d" "Atheros AR5005UG and AR5005UX USB wireless adapter" +f_network "upgt%d" "Conexant/Intersil PrismGT USB wireless adapter" +f_network "ural%d" "Ralink Technology RT2500USB 802.11 wireless adapter" +f_network "urtw%d" "Realtek 8187L USB wireless adapter" +f_network "vge%d" "VIA VT612x PCI Gigabit Ethernet card" +f_network "vlan%d" "IEEE 802.1Q VLAN network interface" +f_network "vr%d" "VIA VT3043/VT86C100A Rhine PCI Ethernet card" +f_network "vx%d" "3COM 3c590 / 3c595 Ethernet card" +f_network "wb%d" "Winbond W89C840F PCI Ethernet card" +f_network "wi%d" "Lucent WaveLAN/IEEE 802.11 wireless adapter" +f_network "wpi%d" "Intel 3945ABG IEEE 802.11 wireless adapter" +f_network "wx%d" "Intel Gigabit Ethernet (82452) card" +f_network "xe%d" "Xircom/Intel EtherExpress Pro100/16 Ethernet card" +f_network "xl%d" "3COM 3c90x / 3c90xB PCI Ethernet card" +f_network "zyd%d" "ZyDAS ZD1211/ZD1211B USB 802.11 wireless adapter" + +DEVICE_CATALOG_APPEND_ONLY= # Additional loading modifies existing devices + +f_count NCATALOG_DEVICES $DEVICE_CATALOG +f_dprintf "%s: Initialized device catalog with %u names/descriptions." \ + device.subr $NCATALOG_DEVICES # # Scan for the above devices unless requeted otherwise diff --git a/usr.sbin/bsdconfig/share/geom.subr b/usr.sbin/bsdconfig/share/geom.subr new file mode 100644 index 0000000..19ed784 --- /dev/null +++ b/usr.sbin/bsdconfig/share/geom.subr @@ -0,0 +1,430 @@ +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 heirarchy 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 requeted 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 diff --git a/usr.sbin/bsdconfig/share/media/cdrom.subr b/usr.sbin/bsdconfig/share/media/cdrom.subr index f14021e..bbbd638 100644 --- a/usr.sbin/bsdconfig/share/media/cdrom.subr +++ b/usr.sbin/bsdconfig/share/media/cdrom.subr @@ -63,26 +63,20 @@ f_media_set_cdrom() if [ ${ndevs:=0} -eq 0 ]; then f_interactive && f_show_msg "$msg_no_cd_dvd_devices_found" return $FAILURE - elif [ $ndevs -gt 1 ]; then + elif [ $ndevs -eq 1 ]; then + f_struct_copy $devs device_media + else + local dev local title="$msg_choose_a_cd_dvd_type" local prompt="$msg_please_select_a_cd_dvd_drive" - local hline="" + local hline= - local dev retval dev=$( f_device_menu \ "$title" "$prompt" "$hline" $DEVICE_TYPE_CDROM \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) - retval=$? - [ "$dev" ] || return $FAILURE - - f_device_find "$dev" $DEVICE_TYPE_CDROM devs - [ "$devs" ] || return $FAILURE - dev="${devs%%[$IFS]*}" + 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) || + return $FAILURE - f_struct_copy device_$dev device_media - [ $retval -eq $SUCCESS ] || return $FAILURE - else - f_struct_copy device_$devs device_media + f_struct_copy "$dev" device_media fi f_struct device_media || return $FAILURE @@ -98,7 +92,7 @@ f_media_init_cdrom() local funcname=f_media_init_cdrom local dev="$1" devname err - device_$dev get devname devname || return $FAILURE + f_struct "$dev" get devname devname || return $FAILURE f_dprintf "Init routine called for CDROM device. devname=[%s]" \ "$devname" @@ -154,9 +148,11 @@ f_media_init_cdrom() f_media_get_cdrom() { local dev="$1" file="$2" probe_type="$3" + local name + $dev get name name f_dprintf "f_media_get_cdrom: dev=[%s] file=[%s] probe_type=%s" \ - "$dev" "$file" "$probe_type" + "$name" "$file" "$probe_type" f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type" } @@ -178,7 +174,7 @@ f_media_shutdown_cdrom() fi if ! f_eval_catch -dk err $funcname umount \ - 'umount -f "%s"' "$MOUNPOINT" + 'umount -f "%s"' "$MOUNTPOINT" then err="${err#umount: }"; err="${err#*: }" f_show_msg "$msg_could_not_unmount_the_cdrom_dvd" \ @@ -195,9 +191,15 @@ f_media_shutdown_cdrom() f_media_eject_cdrom() { local funcname=f_media_eject_cdrom - local dev="$1" devname err - device_$dev get name devname || return $SUCCESS - case "$devname" in /dev/iso9660/*) return $SUCCESS; esac + local dev="$1" name devname err + + f_struct "$dev" || return $SUCCESS + $dev get name name || return $SUCCESS + $dev get devname devname || return $SUCCESS + + # Don't eject labels + case "$name" in */*) return $SUCCESS; esac + f_dprintf "Ejecting CDROM/DVD at %s" "$devname" if ! f_eval_catch -dk err $funcname cdcontrol \ 'cdcontrol -f "%s" eject' "$devname" diff --git a/usr.sbin/bsdconfig/share/media/common.subr b/usr.sbin/bsdconfig/share/media/common.subr index aac2cdd..7a6ddaa 100644 --- a/usr.sbin/bsdconfig/share/media/common.subr +++ b/usr.sbin/bsdconfig/share/media/common.subr @@ -61,7 +61,7 @@ f_media_open() { # Verify and initialize device media if-defined f_struct device_media && f_media_verify && - f_device_init media + f_device_init device_media } || return $FAILURE } @@ -74,7 +74,7 @@ f_media_close() { f_dprintf "f_media_close: Shutting down media device" f_struct device_media && - f_device_shutdown media + f_device_shutdown device_media f_struct_free device_media } diff --git a/usr.sbin/bsdconfig/share/media/directory.subr b/usr.sbin/bsdconfig/share/media/directory.subr index 3f46293..004cb74 100644 --- a/usr.sbin/bsdconfig/share/media/directory.subr +++ b/usr.sbin/bsdconfig/share/media/directory.subr @@ -90,7 +90,7 @@ f_media_init_directory() { local dev="$1" path - device_$dev get private path || return $FAILURE + $dev get private path || return $FAILURE f_dprintf "Init routine called for Directory device. path=[%s]" \ "$path" @@ -125,11 +125,13 @@ f_media_init_directory() f_media_get_directory() { local dev="$1" file="$2" probe_type="$3" path + local name + $dev get name name f_dprintf "f_media_get_directory: dev=[%s] file=[%s] probe_type=%s" \ - "$dev" "$file" "$probe_type" + "$name" "$file" "$probe_type" - device_$dev get private path + $dev get private path f_media_generic_get "$path" "$file" "$probe_type" } diff --git a/usr.sbin/bsdconfig/share/media/dos.subr b/usr.sbin/bsdconfig/share/media/dos.subr index e8e6aa6..df91aeb 100644 --- a/usr.sbin/bsdconfig/share/media/dos.subr +++ b/usr.sbin/bsdconfig/share/media/dos.subr @@ -61,26 +61,20 @@ f_media_set_dos() if [ ${ndevs:=0} -eq 0 ]; then f_show_msg "$msg_no_dos_primary_partitions_found" return $FAILURE - elif [ $ndevs -gt 1 ]; then + elif [ $ndevs -eq 1 ]; then + f_struct_copy $devs device_media + else + local dev local title="$msg_choose_a_dos_partition" local prompt="$msg_please_select_dos_partition" - local hline="" + local hline= - local dev retval dev=$( f_device_menu \ "$title" "$prompt" "$hline" $DEVICE_TYPE_DOS \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) - retval=$? - [ "$dev" ] || return $FAILURE - - f_device_find "$dev" $DEVICE_TYPE_DOS devs - [ "$devs" ] || return $FAILURE - dev="${devs%%[$IFS]*}" + 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) || + return $FAILURE - f_struct_copy device_$dev device_media - [ $retval -eq $SUCCESS ] || return $FAILURE - else - f_struct_copy device_$devs device_media + f_struct_copy "$dev" device_media fi f_struct device_media || return $FAILURE @@ -96,7 +90,7 @@ f_media_init_dos() local funcname=f_media_init_dos local dev="$1" devname err - device_$dev get devname devname || return $FAILURE + $dev get devname devname || return $FAILURE f_dprintf "Init routine called for DOS device. devname=[%s]" \ "$devname" @@ -132,9 +126,11 @@ f_media_init_dos() f_media_get_dos() { local dev="$1" file="$2" probe_type="$3" + local name + $dev get name name f_dprintf "f_media_get_dos: dev=[%s] file=[%s] probe_type=%s" \ - "$dev" "$file" "$probe_type" + "$name" "$file" "$probe_type" f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type" } diff --git a/usr.sbin/bsdconfig/share/media/floppy.subr b/usr.sbin/bsdconfig/share/media/floppy.subr index e0e2df4..bf402e5 100644 --- a/usr.sbin/bsdconfig/share/media/floppy.subr +++ b/usr.sbin/bsdconfig/share/media/floppy.subr @@ -62,26 +62,20 @@ f_media_set_floppy() if [ ${ndevs:=0} -eq 0 ]; then f_interactive && f_show_msg "$msg_no_floppy_devices_found" return $FAILURE - elif [ $ndevs -gt 1 ]; then + elif [ $ndevs -eq 1 ]; then + f_struct_copy $devs device_media + else + local dev local title="$msg_choose_a_floppy_drive" local prompt="$msg_please_select_a_floppy_drive" - local hline="" + local hline= - local dev retval dev=$( f_device_menu \ "$title" "$prompt" "$hline" $DEVICE_TYPE_FLOPPY \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) - retval=$? - [ "$dev" ] || return $FAILURE - - f_device_find "$dev" $DEVICE_TYPE_FLOPPY devs - [ "$devs" ] || return $FAILURE - dev="${devs%%[$IFS]*}" + 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) || + return $FAILURE - f_struct_copy device_$dev device_media - [ $retval -eq $SUCCESS ] || return $FAILURE - else - f_struct_copy device_$devs device_media + f_struct_copy "$dev" device_media fi f_struct device_media && @@ -101,7 +95,7 @@ f_media_init_floppy() local funcname=f_media_init_floppy local dev="$1" devname err - device_$dev get devname devname || return $FAILURE + $dev get devname devname || return $FAILURE f_dprintf "Init floppy called for %s distribution. devname=[%s]" \ "${FLOPPY_DISTWANTED:-some}" "$devname" @@ -111,7 +105,7 @@ f_media_init_floppy() fi local mp - device_$dev get private mp + $dev get private mp if [ ! -e "${mp:=$MOUNTPOINT}" ] && ! f_quietly mkdir -p "$mp"; then f_show_msg "$msg_unable_to_make_directory_mountpoint" \ "$mp" "$devname" @@ -120,7 +114,7 @@ f_media_init_floppy() if f_interactive; then local desc - device_$dev get desc desc + $dev get desc desc if [ "$FLOPPY_DISTWANTED" ]; then f_show_msg "$msg_please_insert_floppy_in_drive" "$desc" else @@ -138,7 +132,7 @@ f_media_init_floppy() }; then err="${err#mount: }"; err="${err#*: }" local name - device_$dev get name name + $dev get name name f_show_msg "$msg_error_mounting_floppy_device" \ "$name" "$devname" "$mp" "$err" return $FAILURE @@ -159,9 +153,11 @@ f_media_get_floppy() { local funcname=f_media_get_floppy local dev="$1" file="$2" probe_type="$3" + local name + $dev get name name f_dprintf "f_media_get_floppy: dev=[%s] file=[%s] probe_type=%s" \ - "$dev" "$file" "$probe_type" + "$name" "$file" "$probe_type" # # floppies don't use f_media_generic_get() because it's too expensive @@ -169,7 +165,7 @@ f_media_get_floppy() # right or give up with floppies. # local mp - device_$dev get private mp + $dev get private mp local fp="${mp:=$MOUNTPOINT}/$file" if ! [ -f "$fp" -a -r "$fp" ]; then local nretries=4 @@ -213,14 +209,14 @@ f_media_shutdown_floppy() [ "$FLOPPY_MOUNTED" ] || return $FAILURE - device_$dev get private mp + $dev get private mp if f_eval_catch -d $funcname umount \ 'umount -f "%s"' "${mp:=$MOUNTPOINT}" then FLOPPY_MOUNTED= if f_interactive && [ "$_systemState" != "fixit" ]; then local desc - device_$dev get desc desc + $dev get desc desc f_show_msg "$msg_you_may_remove_the_floppy" "$desc" fi fi diff --git a/usr.sbin/bsdconfig/share/media/ftp.subr b/usr.sbin/bsdconfig/share/media/ftp.subr index 7f5256a3..a249a01 100644 --- a/usr.sbin/bsdconfig/share/media/ftp.subr +++ b/usr.sbin/bsdconfig/share/media/ftp.subr @@ -328,16 +328,17 @@ f_media_set_ftp() ! f_dialog_yesno "$msg_youve_already_done_the_network_configuration" then f_struct device_network && - f_device_shutdown network + f_device_shutdown device_network if ! f_device_select_tcp; then unset $VAR_FTP_PATH return $FAILURE fi - local dev - f_getvar $VAR_NETWORK_DEVICE dev - f_struct_copy "device_$dev" device_network + local dev if + f_getvar $VAR_NETWORK_DEVICE if + f_device_find -1 "$if" $DEVICE_TYPE_NETWORK dev + f_struct_copy "$dev" device_network fi - if ! f_device_init network; then + if ! f_device_init device_network; then f_dprintf "f_media_set_ftp: %s" "$msg_net_device_init_failed" unset $VAR_FTP_PATH return $FAILURE @@ -420,7 +421,7 @@ f_media_set_ftp() if ! f_quietly f_host_lookup "$hostname"; then f_show_msg "$msg_cannot_resolve_hostname" "$hostname" f_struct device_network && - f_device_shutdown network + f_device_shutdown device_network f_struct_free device_network unset $VAR_FTP_PATH return $FAILURE @@ -436,7 +437,7 @@ f_media_set_ftp() device_ftp set init f_media_init_ftp device_ftp set get f_media_get_ftp device_ftp set shutdown f_media_shutdown_ftp - device_ftp set private network + device_ftp set private device_network f_struct_copy device_ftp device_media f_struct_free device_ftp @@ -503,8 +504,9 @@ f_media_set_ftp_userpass() f_device_network_up() { local dev="$1" netDev - f_struct device_$dev || return $FAILURE - device_$dev get private netDev || return $SUCCESS # No net == happy net + f_struct "$dev" || return $FAILURE + $dev get private netDev || return $SUCCESS # No net == happy net +debug=1 f_dprintf "netDev=[$netDev]" f_device_init $netDev } @@ -515,8 +517,8 @@ f_device_network_up() f_device_network_down() { local dev="$1" netDev - f_struct device_$dev || return $FAILURE - device_$dev get private netDev || return $SUCCESS + f_struct "$dev" || return $FAILURE + $dev get private netDev || return $SUCCESS f_device_shutdown $netDev } @@ -576,9 +578,9 @@ f_device_network_down() f_media_init_ftp() { local dev="$1" - local url - device_$dev get name url + + $dev get name url f_dprintf "Init routine called for FTP device. url=[%s]" "$url" if [ "$FTP_INITIALIZED" ]; then @@ -724,7 +726,6 @@ f_media_init_ftp() local fdir if fdir=$( echo "$rx" | awk ' - BEGIN { found = 0 } /^Remote directory: / { sub(/^[^:]*:[[:space:]]*/, "") if ($0 == "/") next diff --git a/usr.sbin/bsdconfig/share/media/http.subr b/usr.sbin/bsdconfig/share/media/http.subr index 23c146c..6d6aa10 100644 --- a/usr.sbin/bsdconfig/share/media/http.subr +++ b/usr.sbin/bsdconfig/share/media/http.subr @@ -215,16 +215,17 @@ f_media_set_http() ! f_dialog_yesno "$msg_youve_already_done_the_network_configuration" then f_struct device_network && - f_device_shutdown network + f_device_shutdown device_network if ! f_device_select_tcp; then unset $VAR_HTTP_PATH return $FAILURE fi - local dev - f_getvar $VAR_NETWORK_DEVICE dev - f_struct_copy "device_$dev" device_network + local dev if + f_getvar $VAR_NETWORK_DEVICE if + f_device_find -1 "$if" $DEVICE_TYPE_NETWORK dev + f_struct_copy "$dev" device_network fi - if ! f_device_init network; then + if ! f_device_init device_network; then f_dprintf "f_media_set_http: %s" "$msg_net_device_init_failed" unset $VAR_HTTP_PATH return $FAILURE @@ -307,7 +308,7 @@ f_media_set_http() if ! f_quietly f_host_lookup "$hostname"; then f_show_msg "$msg_cannot_resolve_hostname" "$hostname" f_struct device_network && - f_device_shutdown network + f_device_shutdown device_network f_struct_free device_network unset $VAR_HTTP_PATH return $FAILURE @@ -323,7 +324,7 @@ f_media_set_http() device_http set init f_media_init_http device_http set get f_media_get_http device_http set shutdown f_media_shutdown_http - device_http set private network + device_http set private device_network f_struct_copy device_http device_media f_struct_free device_http @@ -565,9 +566,11 @@ f_media_init_http() f_media_get_http() { local dev="$1" file="$2" probe_type="$3" hosts= + local name + $dev get name name f_dprintf "f_media_get_http: dev=[%s] file=[%s] probe_type=%s" \ - "$dev" "$file" "$probe_type" + "$name" "$file" "$probe_type" local http_host http_port f_getvar $VAR_HTTP_HOST http_host diff --git a/usr.sbin/bsdconfig/share/media/nfs.subr b/usr.sbin/bsdconfig/share/media/nfs.subr index 33b37c8..d83661f 100644 --- a/usr.sbin/bsdconfig/share/media/nfs.subr +++ b/usr.sbin/bsdconfig/share/media/nfs.subr @@ -93,13 +93,14 @@ f_media_set_nfs() ! f_dialog_yesno "$msg_youve_already_done_the_network_configuration" then f_struct device_network && - f_device_shutdown network + f_device_shutdown device_network f_device_select_tcp || return $FAILURE - local dev - f_getvar $VAR_NETWORK_DEVICE dev - f_struct_copy "device_$dev" device_network + local dev if + f_getvar $VAR_NETWORK_DEVICE if + f_device_find -1 "$if" $DEVICE_TYPE_NETWORK dev + f_struct_copy "$dev" device_network fi - f_device_init network || + f_device_init device_network || f_dprintf "%s: $msg_net_device_init_failed\n" f_media_set_nfs local hostname="${nfs%%:*}" @@ -112,7 +113,7 @@ f_media_set_nfs() if ! f_quietly f_host_lookup "$hostname"; then f_show_msg "$msg_cannot_resolve_hostname" "$hostname" f_struct device_network && - f_device_shutdown network + f_device_shutdown device_network f_struct_free device_network unset $VAR_NFS_PATH return $FAILURE @@ -157,7 +158,7 @@ f_media_init_nfs() local funcname=f_media_init_nfs local dev="$1" name err - device_$dev get name name || return $FAILURE + $dev get name name || return $FAILURE f_dprintf "Init routine called for NFS device. name=[%s]" \ "$name" @@ -166,7 +167,7 @@ f_media_init_nfs() return $SUCCESS fi - if ! f_device_init network; then + if ! f_device_init device_network; then f_dprintf "f_media_init_nfs: %s" "$msg_net_device_init_failed" return $FAILURE fi @@ -198,7 +199,7 @@ f_media_init_nfs() f_show_msg "$msg_error_mounting_device" \ "$name" "$MOUNTPOINT" "$err" f_struct device_network && - f_device_shutdown network + f_device_shutdown device_network return $FAILURE fi NFS_MOUNTED=1 @@ -218,9 +219,11 @@ f_media_init_nfs() f_media_get_nfs() { local dev="$1" file="$2" probe_type="$3" + local name + $dev get name name f_dprintf "f_media_get_nfs: dev=[%s] file=[%s] probe_type=%s" \ - "$dev" "$file" "$probe_type" + "$name" "$file" "$probe_type" f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type" } diff --git a/usr.sbin/bsdconfig/share/media/tcpip.subr b/usr.sbin/bsdconfig/share/media/tcpip.subr index ea7350d8..42c6e20 100644 --- a/usr.sbin/bsdconfig/share/media/tcpip.subr +++ b/usr.sbin/bsdconfig/share/media/tcpip.subr @@ -169,7 +169,7 @@ f_inet_atoi() { local __addr="$1" __var_to_set="$2" __num=0 if f_validate_ipaddr "$__addr"; then - IFS=. + local IFS=. set -- $__addr __num=$(( ($1 << 24) + ($2 << 16) + ($3 << 8) + $4 )) fi @@ -204,8 +204,7 @@ f_validate_ipaddr() # Track number of octets for error checking local noctets=0 - local oldIFS="$IFS" - local IFS="." # Split on `dot' + local oldIFS="$IFS" IFS="." # Split on `dot' for octet in $ip; do # Return error if the octet is null [ "$octet" ] || return 2 @@ -1137,15 +1136,16 @@ f_host_lookup() # f_device_dialog_tcp() { - local dev="$1" cp n + local dev="$1" devname cp n local use_dhcp="" use_rtsol="" local _ipaddr _netmask _extras [ "$dev" ] || return $DIALOG_CANCEL + f_struct "$dev" get name devname || return $DIALOG_CANCEL # Initialize vars from previous device values local private - device_$dev get private private + $dev get private private if [ "$private" ] && f_struct "$private"; then $private get ipaddr _ipaddr $private get netmask _netmask @@ -1183,17 +1183,17 @@ f_device_dialog_tcp() f_quietly sysctl net.inet6.ip6.forwarding=0 f_quietly sysctl net.inet6.ip6.accept_rtadv=1 - f_quietly ifconfig $dev up + f_quietly ifconfig $devname up i=$( sysctl -n net.inet6.ip6.dad_count ) sleep $(( $i + 1 )) f_quietly mkdir -p /var/run f_dialog_info "$msg_scanning_for_ra_servers" - if f_quietly rtsol $dev; then + if f_quietly rtsol $devname; then i=$( sysctl -n net.inet6.ip6.dad_count ) sleep $(( $i + 1 )) - f_rtsol_get_info $dev + f_rtsol_get_info $devname use_rtsol=1 else use_rtsol= @@ -1212,7 +1212,7 @@ f_device_dialog_tcp() ! f_isset $VAR_TRY_DHCP && f_dialog_noyes "$msg_try_dhcp_configuration" }; then - f_quietly ifconfig $dev delete + f_quietly ifconfig $devname delete f_quietly mkdir -p /var/db f_quietly mkdir -p /var/run f_quietly mkdir -p /tmp @@ -1222,17 +1222,17 @@ f_device_dialog_tcp() ( # Execute in sub-shell to allow/catch Ctrl-C trap 'exit $FAILURE' SIGINT if [ "$USE_XDIALOG" ]; then - f_quietly dhclient $dev | + f_quietly dhclient $devname | f_xdialog_info "$msg" else f_dialog_info "$msg" - f_quietly dhclient $dev + f_quietly dhclient $devname fi ) local retval=$? trap 'f_interrupt' SIGINT if [ $retval -eq $SUCCESS ]; then - f_dhcp_get_info $dev + f_dhcp_get_info $devname use_dhcp=1 else use_dhcp= @@ -1253,7 +1253,7 @@ f_device_dialog_tcp() if [ ! "$_ipaddr" ]; then if f_getvar $VAR_IPADDR cp; then _ipaddr="$cp" - elif f_getvar ${dev}_$VAR_IPADDR cp; then + elif f_getvar ${devname}_$VAR_IPADDR cp; then _ipaddr="$cp" fi fi @@ -1262,7 +1262,7 @@ f_device_dialog_tcp() if [ ! "$_netmask" ]; then if f_getvar $VAR_NETMASK cp; then _netmask="$cp" - elif f_getvar ${dev}_$VAR_NETMASK cp; then + elif f_getvar ${devname}_$VAR_NETMASK cp; then _netmask="$cp" fi fi @@ -1271,7 +1271,7 @@ f_device_dialog_tcp() if [ ! "$_extras" ]; then if f_getvar $VAR_EXTRAS cp; then _extras="$cp" - elif f_getvar ${dev}_$VAR_EXTRAS cp; then + elif f_getvar ${devname}_$VAR_EXTRAS cp; then _extras="$cp" fi fi @@ -1295,8 +1295,8 @@ f_device_dialog_tcp() [ "$_gateway" ] || f_route_get_default _gateway [ ! "$_nameserver" ] && f_resolv_conf_nameservers cp && _nameserver=${cp%%[$IFS]*} - [ "$_ipaddr" ] || f_ifconfig_inet $dev _ipaddr - [ "$_netmask" ] || f_ifconfig_netmask $dev _netmask + [ "$_ipaddr" ] || f_ifconfig_inet $devname _ipaddr + [ "$_netmask" ] || f_ifconfig_netmask $devname _netmask # If non-interactive, jump over dialog section and into config section if f_netinteractive || f_interactive || [ ! "$_hostname" ] @@ -1309,7 +1309,7 @@ f_device_dialog_tcp() local extras_help="$tcplayout_extras_help" # Modify the help line for PLIP config - [ "${dev#plip}" != "$dev" ] && + [ "${devname#plip}" != "$devname" ] && extras_help="$tcplayout_extras_help_for_plip" f_getvar $VAR_IPV6ADDR cp && [ "$cp" ] && @@ -1318,7 +1318,8 @@ f_device_dialog_tcp() if [ ! "$USE_XDIALOG" ]; then local prompt="$msg_dialog_mixedform_navigation_help" # Calculate center position for displaying device label - local devlabel="$msg_configuration_for_interface $dev" + local devlabel="$msg_configuration_for_interface" + devlabel="$devlabel $devname" local width=54 local n=$(( $width/2 - (${#devlabel} + 4)/2 - 2 )) @@ -1504,7 +1505,7 @@ f_device_dialog_tcp() f_dprintf "Creating struct DEVICE_INFO devinfo_%s" "$dev" f_struct_new DEVICE_INFO devinfo_$dev - device_$dev set private devinfo_$dev + $dev set private devinfo_$dev devinfo_$dev set ipaddr $_ipaddr devinfo_$dev set netmask $_netmask @@ -1518,7 +1519,7 @@ f_device_dialog_tcp() else cp="inet $_ipaddr netmask $_netmask${extras:+ $extras}" fi - setvar $VAR_IFCONFIG$dev "$cp" + setvar $VAR_IFCONFIG$devname "$cp" fi [ "$use_rtsol" ] && setvar $VAR_IPV6_ENABLE "YES" @@ -1591,7 +1592,7 @@ f_device_scan_tcp() # f_device_select_tcp() { - local devs dev cnt network_dev + local devs dev cnt if network_dev f_getvar $VAR_NETWORK_DEVICE network_dev f_dprintf "f_device_select_tcp: %s=[%s]" \ @@ -1609,23 +1610,18 @@ f_device_select_tcp() while [ "$network_dev" ]; do case "$network_dev" in - *,*) dev="${network_dev%%,*}" + *,*) if="${network_dev%%,*}" network_dev="${network_dev#*,}" ;; - *) dev="$network_dev" + *) if="$network_dev" network_dev= esac - f_device_find "$dev" $DEVICE_TYPE_NETWORK devs - f_count cnt $devs - - if [ ${cnt:=0} -gt 0 ]; then - dev="${devs%%[$IFS]*}" - f_device_dialog_tcp $dev - if [ $? -eq $DIALOG_OK ]; then - setvar $VAR_NETWORK_DEVICE $dev - return $DIALOG_OK - fi + f_device_find -1 "$if" $DEVICE_TYPE_NETWORK dev + f_device_dialog_tcp $dev + if [ $? -eq $DIALOG_OK ]; then + setvar $VAR_NETWORK_DEVICE $if + return $DIALOG_OK fi done @@ -1637,6 +1633,7 @@ f_device_select_tcp() f_device_find "" $DEVICE_TYPE_NETWORK devs f_count cnt $devs dev="${devs%%[$IFS]*}" + $dev get name if f_quietly f_getvar NETWORK_CONFIGURED # for debugging info if ! f_running_as_init && @@ -1645,7 +1642,7 @@ f_device_select_tcp() trap 'f_interrupt' SIGINT if f_dialog_yesno "$msg_assume_network_is_already_configured" then - setvar $VAR_NETWORK_DEVICE $dev + setvar $VAR_NETWORK_DEVICE $if return $DIALOG_OK fi fi @@ -1657,7 +1654,7 @@ f_device_select_tcp() elif [ $cnt -eq 1 ]; then f_device_dialog_tcp $dev retval=$? - [ $retval -eq $DIALOG_OK ] && setvar $VAR_NETWORK_DEVICE $dev + [ $retval -eq $DIALOG_OK ] && setvar $VAR_NETWORK_DEVICE $if else local title="$msg_network_interface_information_required" local prompt="$msg_please_select_ethernet_device_to_configure" @@ -1666,19 +1663,14 @@ f_device_select_tcp() dev=$( f_device_menu \ "$title" "$prompt" "$hline" $DEVICE_TYPE_NETWORK \ "$NETWORK_DEVICE_HELPFILE" \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) - retval=$? - [ "$dev" ] || return $DIALOG_CANCEL - - f_device_find "$dev" $DEVICE_TYPE_NETWORK devs - [ "$devs" ] || return $DIALOG_CANCEL - dev="${devs%%[$IFS]*}" + 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) || + return $DIALOG_CANCEL f_device_dialog_tcp $dev retval=$? if [ $retval -eq $DIALOG_OK ]; then - f_struct_copy device_$dev device_network - setvar $VAR_NETWORK_DEVICE network + f_struct_copy "$dev" device_network + setvar $VAR_NETWORK_DEVICE device_network else f_struct_free device_network fi @@ -1706,7 +1698,7 @@ f_dialog_menu_select_tcp() device_network get name name && f_yesno "$msg_would_you_like_to_bring_interface_up" "$name" then - if ! f_device_init network; then + if ! f_device_init device_network; then f_show_msg "$msg_initialization_of_device_failed" \ "$name" fi diff --git a/usr.sbin/bsdconfig/share/media/ufs.subr b/usr.sbin/bsdconfig/share/media/ufs.subr index a16b53d..27e2f27 100644 --- a/usr.sbin/bsdconfig/share/media/ufs.subr +++ b/usr.sbin/bsdconfig/share/media/ufs.subr @@ -89,22 +89,20 @@ f_media_set_ufs() f_struct_copy device_ufs device_media f_struct_free device_ufs - elif [ $ndevs -gt 1 ]; then + elif [ $ndevs -eq 1 ]; then + f_struct_copy $devs device_media + else + local dev local title="$msg_choose_a_ufs_partition" local prompt="$msg_please_select_ufs_partition" local hline="" - local dev retval dev=$( f_device_menu \ "$title" "$prompt" "$hline" $DEVICE_TYPE_UFS \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) - retval=$? - [ "$dev" ] || return $FAILURE + 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) || + return $FAILURE - f_struct_copy device_$dev device_media - [ $retval -eq $SUCCESS ] || return $FAILURE - else - f_struct_copy device_$devs device_media + f_struct_copy "$dev" device_media fi f_struct device_media || return $FAILURE @@ -120,7 +118,7 @@ f_media_init_ufs() local funcname=f_media_init_ufs local dev="$1" devname err - device_$dev get devname devname || return $FAILURE + $dev get devname devname || return $FAILURE f_dprintf "Init routine called for UFS device. devname=[%s]" \ "$devname" @@ -162,9 +160,11 @@ f_media_init_ufs() f_media_get_ufs() { local dev="$1" file="$2" probe_type="$3" + local name + $dev get name name f_dprintf "f_media_get_ufs: dev=[%s] file=[%s] probe_type=%s" \ - "$dev" "$file" "$probe_type" + "$name" "$file" "$probe_type" f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type" } diff --git a/usr.sbin/bsdconfig/share/media/usb.subr b/usr.sbin/bsdconfig/share/media/usb.subr index 39384fa..5ee9bc0 100644 --- a/usr.sbin/bsdconfig/share/media/usb.subr +++ b/usr.sbin/bsdconfig/share/media/usb.subr @@ -62,26 +62,20 @@ f_media_set_usb() if [ ${ndevs:=0} -eq 0 ]; then f_show_msg "$msg_no_usb_devices_found" return $FAILURE - elif [ $ndevs -gt 1 ]; then + elif [ $ndevs -eq 1 ]; then + f_struct_copy $devs device_media + else + local dev local title="$msg_choose_a_usb_drive" local prompt="$msg_please_select_a_usb_drive" - local hline="" + local hline= - local dev retval dev=$( f_device_menu \ "$title" "$prompt" "$hline" $DEVICE_TYPE_USB \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) - retval=$? - [ "$dev" ] || return $FAILURE - - f_device_find "$dev" $DEVICE_TYPE_USB devs - [ "$devs" ] || return $FAILURE - dev="${devs%%[$IFS]*}" + 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) || + return $FAILURE - f_struct_copy device_$dev device_media - [ $retval -eq $SUCCESS ] || return $FAILURE - else - f_struct_copy device_$devs device_media + f_struct_copy "$dev" device_media fi f_struct device_media && @@ -106,7 +100,7 @@ f_media_init_usb() local funcname=f_media_init_usb local dev="$1" devname err - device_$dev get devname devname || return $FAILURE + $dev get devname devname || return $FAILURE f_dprintf "Init routine called for USB device. devname=[%s]" \ "$devname" @@ -143,9 +137,11 @@ f_media_init_usb() f_media_get_usb() { local dev="$1" file="$2" probe_type="$3" + local name + $dev get name name f_dprintf "f_media_get_usb: dev=[%s] file=[%s] probe_type=%s" \ - "$dev" "$file" "$probe_type" + "$name" "$file" "$probe_type" f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type" } diff --git a/usr.sbin/bsdconfig/share/packages/index.subr b/usr.sbin/bsdconfig/share/packages/index.subr index f0c1725..9586501 100755 --- a/usr.sbin/bsdconfig/share/packages/index.subr +++ b/usr.sbin/bsdconfig/share/packages/index.subr @@ -95,7 +95,7 @@ f_index_initialize() f_media_verify || return $FAILURE # Does it move when you kick it? - f_device_init media || return $FAILURE + f_device_init device_media || return $FAILURE f_show_info "$msg_attempting_to_update_repository_catalogue" @@ -130,7 +130,7 @@ f_index_initialize() f_dprintf "PACKAGESITE=[%s]" "$PACKAGESITE" if ! f_eval_catch $__funcname pkg "pkg update"; then f_show_err "$msg_unable_to_update_pkg_from_selected_media" - f_device_shutdown media + f_device_shutdown device_media return $FAILURE fi @@ -146,7 +146,7 @@ f_index_initialize() local __sqlite_digest if ! __sqlite_digest=$( md5 < "$SQLITE_REPO" 2> /dev/null ); then f_show_err "$msg_no_pkg_database_found" - f_device_shutdown media + f_device_shutdown device_media return $FAILURE fi @@ -208,7 +208,7 @@ f_index_initialize() } }' )"; then f_show_err "$msg_unable_to_pkg_rquery_package_dependencies" - f_device_shutdown media + f_device_shutdown device_media return $FAILURE fi @@ -225,7 +225,7 @@ f_index_initialize() } }' )"; then f_show_err "$msg_unable_to_pkg_rquery_package_dependencies" - f_device_shutdown media + f_device_shutdown device_media return $FAILURE fi diff --git a/usr.sbin/bsdconfig/share/packages/packages.subr b/usr.sbin/bsdconfig/share/packages/packages.subr index 36c1172..6fc936f 100755 --- a/usr.sbin/bsdconfig/share/packages/packages.subr +++ b/usr.sbin/bsdconfig/share/packages/packages.subr @@ -838,7 +838,7 @@ f_package_add() { # Verify and initialize device media if-defined f_media_verify && - f_device_init media && + f_device_init device_media && f_index_initialize packages/INDEX } || return $FAILURE @@ -923,7 +923,7 @@ f_package_add() # Done with the deps? Try to load the real m'coy. # - f_package_extract media "$name" "$depended" + f_package_extract device_media "$name" "$depended" retval=$? if [ $retval -ne $SUCCESS ]; then status=$(( $status | $retval )) @@ -944,9 +944,11 @@ f_package_extract() { local funcname=f_package_extract local device="$1" name="$2" depended="$3" + local devname= + $device get name devname f_dprintf "$funcname: device=[%s] name=[%s] depended=[%s]" \ - "$device" "$name" "$depended" + "$devname" "$name" "$depended" # Check to make sure it's not already there local varpkg mark= @@ -971,7 +973,7 @@ f_package_extract() f_quietly mkdir -p -m 1777 "$tmpdir" local path device_type - device_$device get type device_type + $device get type device_type case "$name" in */*) path="$name" ;; *) @@ -1000,7 +1002,7 @@ f_package_extract() fi done [ "$found" ] && f_dprintf "$funcname: found path=[%s] dev=[%s]" \ - "$path" "$device" + "$path" "$devname" local alert=f_show_msg no_confirm= f_getvar $VAR_NO_CONFIRM no_confirm @@ -1008,15 +1010,13 @@ f_package_extract() if [ ! "$found" ]; then f_dprintf "$funcname: No such %s file on %s device" \ - "$path" "$device" + "$path" "$devname" $alert "$msg_unable_to_fetch_package_from_selected_media" \ "$name" [ "$no_confirm" ] && sleep 2 return $FAILURE fi - local devname= - f_struct device_$device get name devname if [ "$depended" ]; then f_show_info "$msg_adding_package_as_a_dependency_from_media" \ "$name" "$devname" @@ -1064,7 +1064,7 @@ f_package_delete() { # Verify and initialize device media if-defined f_media_verify && - f_device_init media && + f_device_init device_media && f_index_initialize packages/INDEX } || return $FAILURE diff --git a/usr.sbin/bsdconfig/share/struct.subr b/usr.sbin/bsdconfig/share/struct.subr index fc4f711..78c785f 100644 --- a/usr.sbin/bsdconfig/share/struct.subr +++ b/usr.sbin/bsdconfig/share/struct.subr @@ -132,7 +132,7 @@ f_struct() local __name="$1" __action="$2" __property="$3" case $# in 0) return $FAILURE ;; - 1) f_have $__name ;; + 1) f_have "$__name" ;; *) case "$__action" in get) local __var_to_set="$4" f_getvar "_struct_value_${__name}_$__property" "$__var_to_set" |