Index: head/usr.sbin/bsdconfig/timezone/share/continents.subr =================================================================== --- head/usr.sbin/bsdconfig/timezone/share/continents.subr (revision 278488) +++ head/usr.sbin/bsdconfig/timezone/share/continents.subr (revision 278489) @@ -1,143 +1,166 @@ if [ ! "$_TIMEZONE_CONTINENTS_SUBR" ]; then _TIMEZONE_CONTINENTS_SUBR=1 # -# Copyright (c) 2011-2012 Devin Teske +# Copyright (c) 2011-2015 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..." timezone/continents.subr BSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="090.timezone" f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr ############################################################ CONFIGURATION # # List of worldly continents/oceans (export'ed for awk(1) ENVIRON visibility) # export CONTINENTS=" africa america antarctica arctic asia atlantic australia europe indian pacific utc " # # Directory name of each continent/ocean (in _PATH_ZONEINFO) # export continent_africa_name="Africa" export continent_america_name="America" export continent_antarctica_name="Antarctica" export continent_arctic_name="Arctic" export continent_asia_name="Asia" export continent_atlantic_name="Atlantic" export continent_australia_name="Australia" export continent_europe_name="Europe" export continent_indian_name="Indian" export continent_pacific_name="Pacific" export continent_utc_name="UTC" # # Export i18n menu texts of continents/oceans for awk(1) ENVIRON visibility # NOTE: These are defined in messages.subr included above. # export continent_africa_title export continent_america_title export continent_antarctica_title export continent_arctic_title export continent_asia_title export continent_atlantic_title export continent_australia_title export continent_europe_title export continent_indian_title export continent_pacific_title export continent_utc_title ############################################################ FUNCTIONS -# f_continent $cont $property +# f_continent $cont $property [$var_to_set] # # Returns a single property of a given continent. Available properties are: # # name Directory name of continent/ocean as it appears in # _PATH_ZONEINFO. # title Menu text of this continent/ocean to be displayed in the # continent-selection menu. # nitems Number of submenu items associated with this # continent/ocean. # tlc_N 2-character country code of the Nth submenu item associated # with this continent displayed in the country-selection menu # (which appears after continent selection). # menu_list Menu-list of regions for this continent. # +# If $var_to_set is missing or NULL, the value of $var_to_get is printed to +# standard output for capturing in a sub-shell (which is less-recommended +# because of performance degredation; for example, when called in a loop). +# f_continent() { - local cont="$1" property="$2" - eval echo \"\${continent_${cont}_$property}\" + f_getvar "continent_${1}_$2" $3 } -# f_find_continent $title +# f_find_continent $title [$var_to_set] # # Returns continent identifier given continent title. # +# If $var_to_set is missing or NULL, the value of $var_to_get is printed to +# standard output for capturing in a sub-shell (which is less-recommended +# because of performance degredation; for example, when called in a loop). +# f_find_continent() { - local cont - for cont in $CONTINENTS; do - if [ "$1" = "$( f_continent $cont title )" ]; then - echo "$cont" + local __cont __title + for __cont in $CONTINENTS; do + f_continent $__cont title __title + if [ "$1" = "$__title" ]; then + if [ "$2" ]; then + setvar "$2" $__cont + else + echo "$__cont" + fi return $SUCCESS fi done return $FAILURE } -# f_OCEANP $cont +# f_OCEANP $cont [$var_to_set] # # Returns "1" if the first argument is an ocean, otherwise NULL. # +# If $var_to_set is missing or NULL, the value of $var_to_get is printed to +# standard output for capturing in a sub-shell (which is less-recommended +# because of performance degredation; for example, when called in a loop). +# f_OCEANP() { case "$1" in arctic|atlantic|indian|pacific) - echo 1 + if [ "$2" ]; then + setvar "$2" 1 + else + echo 1 + fi + ;; + *) + [ "$2" ] && setvar "$2" "" esac } ############################################################ MAIN f_dprintf "%s: Successfully loaded." timezone/continents.subr fi # ! $_TIMEZONE_CONTINENTS_SUBR Index: head/usr.sbin/bsdconfig/timezone/share/countries.subr =================================================================== --- head/usr.sbin/bsdconfig/timezone/share/countries.subr (revision 278488) +++ head/usr.sbin/bsdconfig/timezone/share/countries.subr (revision 278489) @@ -1,80 +1,105 @@ if [ ! "$_TIMEZONE_COUNTRIES_SUBR" ]; then _TIMEZONE_COUNTRIES_SUBR=1 # -# Copyright (c) 2011-2012 Devin Teske +# Copyright (c) 2011-2015 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$ +# +############################################################ FUNCTIONS -# f_country $code $property +# f_country $code $property [$var_to_set] # # Returns a single property of a given country. Available properties are: # # name Name of the country as read from _PATH_ISO3166. # nzones Number of zones within the country (-1 if country has # only a single zone). # filename The filename portion of the TZ field (after the `/') as # read from _PATH_ZONETAB. # cont The principal continent in which the country lies (appears # before the `/' in the TZ field of _PATH_ZONETAB). # filename_N Like filename, but for the Nth zone when the country has # multiple zones (nzones > 0). # cont_N Like cont, but for the Nth zone when the country has # multiple zones (nzones > 0). # descr_N Like name, but for the Nth zone when the country has # multiple zones (nzones > 0) # +# If $var_to_set is missing or NULL, the value of $var_to_get is printed to +# standard output for capturing in a sub-shell (which is less-recommended +# because of performance degredation; for example, when called in a loop). +# f_country() { - local code="$1" property="$2" - eval echo \"\${country_${code}_$property}\" + f_getvar "country_${1}_$2" $3 } # f_sort_countries # # Sorts alphabetically the 2-character country codes listed in $COUNTRIES based # on the name of each country. # # 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_sort_countries_awk=' +function _asorti(src, dest) { - split($0, array, /[[:space:]]+/) + k = nitems = 0 + 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 +} +BEGIN { + split(ENVIRON["COUNTRIES"], array, /[[:space:]]+/) for (item in array) { tlc = array[item] - print ENVIRON["country_" tlc "_name"] " " tlc + name = ENVIRON["country_" tlc "_name"] + countries[name] = tlc } + n = _asorti(countries, sorted_countries) + for (i = 1; i <= n; i++) + print countries[sorted_countries[i]] + exit } ' f_sort_countries() { - COUNTRIES=$( echo "$COUNTRIES" | awk "$f_sort_countries_awk" | - sort | awk '{print $NF}' ) - export COUNTRIES + export COUNTRIES # for awk(1) ENVIRON[] visibility + COUNTRIES=$( awk "$f_sort_countries_awk" ) + export COUNTRIES # Pedantic } + +############################################################ MAIN f_dprintf "%s: Successfully loaded." timezone/countries.subr fi # ! $_TIMEZONE_COUNTRIES_SUBR Index: head/usr.sbin/bsdconfig/timezone/timezone =================================================================== --- head/usr.sbin/bsdconfig/timezone/timezone (revision 278488) +++ head/usr.sbin/bsdconfig/timezone/timezone (revision 278489) @@ -1,457 +1,457 @@ #!/bin/sh #- -# Copyright (c) 2011-2013 Devin Teske +# Copyright (c) 2011-2015 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..." "$0" f_include $BSDCFG_SHARE/dialog.subr f_include $BSDCFG_SHARE/mustberoot.subr f_include $BSDCFG_SHARE/strings.subr f_include $BSDCFG_SHARE/timezone/continents.subr f_include $BSDCFG_SHARE/timezone/countries.subr f_include $BSDCFG_SHARE/timezone/iso3166.subr f_include $BSDCFG_SHARE/timezone/menus.subr f_include $BSDCFG_SHARE/timezone/zones.subr BSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="090.timezone" f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr f_index_menusel_keyword $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" ipgm && pgm="${ipgm:-$pgm}" ############################################################ CONFIGURATION # # Standard pathnames # _PATH_DB="/var/db/zoneinfo" _PATH_WALL_CMOS_CLOCK="/etc/wall_cmos_clock" ############################################################ GLOBALS # # Options # REALLYDOIT=1 REINSTALL= USEDIALOG=1 SKIPUTC= # See MAIN VERBOSE= TZ_OR_FAIL= CHROOTENV= # # Dummy vars (populated dynamically) # COUNTRIES= # list of 2-character country codes created by f_read_iso3166_table ############################################################ FUNCTIONS # dialog_menu_main # # Display the dialog(1)-based application main menu. # dialog_menu_main() { local title="$DIALOG_TITLE" local btitle="$DIALOG_BACKTITLE" local prompt="$msg_select_region" local defaultitem= # Calculated below local hline= local height width rows eval f_dialog_menu_size height width rows \ \"\$title\" \ \"\$btitle\" \ \"\$prompt\" \ \"\$hline\" \ $continent_menu_list # Obtain default-item from previously stored selection f_dialog_default_fetch defaultitem local menu_choice menu_choice=$( eval $DIALOG \ --title \"\$title\" \ --backtitle \"\$btitle\" \ --hline \"\$hline\" \ --ok-label \"\$msg_ok\" \ --cancel-label \"\$msg_cancel\" \ --default-item \"\$defaultitem\" \ --menu \"\$prompt\" \ $height $width $rows \ $continent_menu_list \ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) local retval=$? f_dialog_data_sanitize menu_choice f_dialog_menutag_store "$menu_choice" f_dialog_default_store "$menu_choice" return $retval } ############################################################ MAIN # Skip initial question regarding UTC v. Wall-Clock time if run in VM [ "$( sysctl -n kern.vm_guest 2> /dev/null )" = "none" ] || SKIPUTC=1 # Incorporate rc-file if it exists [ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc" # # Process command-line arguments # while getopts C:ehnrsv$GETOPTS_STDARGS flag; do case "$flag" in C) CHROOTENV="$OPTARG" ;; e) TZ_OR_FAIL=1 ;; n) REALLYDOIT= ;; r) REINSTALL=1 USEDIALOG= ;; s) SKIPUTC=1 ;; v) VERBOSE=1 ;; h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm" ;; esac done shift $(( $OPTIND - 1 )) # # Initialize # f_dialog_title "$msg_time_zone" f_dialog_backtitle "${ipgm:+bsdconfig }$pgm" f_mustberoot_init # # Process `-C chroot_directory' command-line argument # if [ "$CHROOTENV" ]; then _PATH_ZONETAB="$CHROOTENV$_PATH_ZONETAB" _PATH_ISO3166="$CHROOTENV$_PATH_ISO3166" _PATH_ZONEINFO="$CHROOTENV$_PATH_ZONEINFO" _PATH_LOCALTIME="$CHROOTENV$_PATH_LOCALTIME" _PATH_DB="$CHROOTENV$_PATH_DB" _PATH_WALL_CMOS_CLOCK="$CHROOTENV$_PATH_WALL_CMOS_CLOCK" fi # # Process `-r' command-line option # if [ "$REINSTALL" ]; then [ -f "$_PATH_DB" -a -r "$_PATH_DB" ] || f_die 1 "$msg_cannot_open_for_reading" "$_PATH_DB" f_eval_catch -dk zoneinfo "$0" cat 'cat "%s"' "$_PATH_DB" || f_die 1 "$msg_error_reading" "$_PATH_DB" [ "$zoneinfo" ] || f_die 1 "$msg_unable_to_determine_name_from_db" "$_PATH_DB" f_install_zoneinfo "$zoneinfo" exit $? fi # # If the arguments on the command-line do not specify a file, # then interpret it as a zoneinfo name # if [ $# -ge 1 ]; then zoneinfo="$1" if [ ! -f "$zoneinfo" ]; then USEDIALOG= f_install_zoneinfo "$zoneinfo" exit $? fi # FALLTHROUGH fi # # Process the UTC option # if [ "$_PATH_WALL_CMOS_CLOCK" -a ! "$SKIPUTC" ]; then f_dialog_title "$msg_select_local_or_utc" title="$DIALOG_TITLE" btitle="$DIALOG_BACKTITLE" f_dialog_title_restore msg="$msg_is_machine_clock_utc" if [ "$USE_XDIALOG" ]; then defaultno="default-no" height=10 width=77 else defaultno="defaultno" height=7 width=73 fi if [ "$USE_XDIALOG" ]; then $DIALOG \ --title "$title" \ --backtitle "$btitle" \ --$defaultno \ --ok-label "$msg_yes" \ --cancel-label "$msg_no" \ --yesno "$msg" $height $width result=$? else $DIALOG \ --title "$title" \ --backtitle "$btitle" \ --$defaultno \ --yes-label "$msg_yes" \ --no-label "$msg_no" \ --yesno "$msg" $height $width result=$? fi if [ $result -eq $DIALOG_OK ]; then # User chose YES [ "$REALLYDOIT" ] && f_quietly rm -f "$_PATH_WALL_CMOS_CLOCK" else # User chose NO, pressed ESC (or Ctrl-C), or closed box [ "$REALLYDOIT" ] && ( umask 222 && :> "$_PATH_WALL_CMOS_CLOCK" ) fi fi # # Process optional default zone argument # if [ $# -ge 1 ]; then default="$1" f_dialog_title "$msg_default_zone_provided" f_sprintf msg "\n$msg_use_default_zone" "$default" hline= f_dialog_yesno "$msg" "$hline" result=$? f_dialog_title_restore if [ $result -eq $DIALOG_OK ]; then # User chose YES f_install_zoneinfo_file "$default" result=$? [ ! "$USE_XDIALOG" ] && f_dialog_clear exit $result fi [ ! "$USE_XDIALOG" ] && f_dialog_clear fi # # Override the user-supplied umask # umask 022 # # Read databases and perform initialization # f_read_iso3166_table # creates $COUNTRIES and $country_*_name f_read_zones # creates $country_*_{descr,cont,filename} f_sort_countries # sorts the countries listed for each continent f_make_menus # creates $continent_menu_list and $continent_*_menu_list # # Launch application main menu # -defaultctry="" -defaultzone="" +defaultctry= +defaultzone= NEED_CONTINENT=1 NEED_COUNTRY=1 while :; do if [ "$NEED_CONTINENT" ]; then dialog_menu_main # prompt the user to select a continent/ocean retval=$? f_dialog_menutag_fetch mtag if [ $retval -ne $DIALOG_OK ]; then [ "$TZ_OR_FAIL" ] && f_die exit $SUCCESS fi NEED_CONTINENT= continent=$( eval f_dialog_menutag2item \"\$mtag\" \ $continent_menu_list ) - cont=$( f_find_continent "$continent" ) - cont_title=$( f_continent $cont title ) - nitems=$( f_continent $cont nitems ) - isocean=$( f_OCEANP $cont ) + f_find_continent "$continent" cont + f_continent $cont title cont_title + f_continent $cont nitems nitems + f_OCEANP $cont isocean fi if [ "$NEED_COUNTRY" ]; then if [ "$cont_title" = "$continent_utc_title" ]; then if f_set_zone_utc; then break else NEED_CONTINENT=1 continue fi fi # # Short cut -- if there's only one country, don't post a menu. # if [ $nitems -eq 1 ]; then tag=1 else # # It's amazing how much good grammar really matters... # if [ ! "$isocean" ]; then f_sprintf title "$msg_country_title" \ "$cont_title" f_dialog_title "$title" title="$DIALOG_TITLE" btitle="$DIALOG_BACKTITLE" f_dialog_title_restore prompt="$msg_select_country" else f_sprintf title "$msg_island_and_group_title" \ "$cont_title" f_dialog_title "$title" title="$DIALOG_TITLE" btitle="$DIALOG_BACKTITLE" f_dialog_title_restore prompt="$msg_select_island_or_group" fi # # Calculate size of menu # - menu_list=$( f_continent $cont menu_list ) + f_continent $cont menu_list menu_list eval f_dialog_menu_size height width rows \ \"\$title\" \ \"\$btitle\" \ \"\$prompt\" \ \"\" \ $menu_list # # Launch the country selection menu # tag=$( eval $DIALOG \ --title \"\$title\" \ --backtitle \"\$btitle\" \ --ok-label \"\$msg_ok\" \ --cancel-label \"\$msg_cancel\" \ --default-item \"\$defaultctry\" \ --menu \"\$prompt\" \ $height $width $rows \ $menu_list \ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) retval=$? f_dialog_data_sanitize tag defaultctry="$tag" if [ $retval -ne $DIALOG_OK ]; then NEED_CONTINENT=1 continue # back to main menu fi fi # Get the country code from the user's selection - tlc=$( f_continent $cont tlc_$tag ) + f_continent $cont tlc_$tag tlc NEED_COUNTRY= fi # # If the selection has only one zone (nzones == -1), # just set it. # - nzones=$( f_country $tlc nzones ) + f_country $tlc nzones nzones if [ $nzones -lt 0 ]; then - real_cont=$( f_country $tlc cont ) - real_continent=$( f_continent $real_cont name ) - name=$( f_country $tlc name ) - filename=$( f_country $tlc filename ) + f_country $tlc cont real_cont + f_continent $real_cont name real_continent + f_country $tlc name name + f_country $tlc filename filename if ! f_confirm_zone "$real_continent/$filename"; then [ $nitems -eq 1 ] && NEED_CONTINENT=1 NEED_COUNTRY=1 continue fi else - f_sprintf title "$msg_country_time_zones" \ - "$( f_country $tlc name )" + f_country $tlc name name + f_sprintf title "$msg_country_time_zones" "$name" f_dialog_title "$title" title="$DIALOG_TITLE" btitle="$DIALOG_BACKTITLE" f_dialog_title_restore prompt="$msg_select_zone" - menu_list=$( f_country $tlc menu_list ) + f_country $tlc menu_list menu_list eval f_dialog_menu_size height width rows \ \"\$title\" \"\$btitle\" \"\$prompt\" \"\" $menu_list # # Launch the zone selection menu # NOTE: This is as deep as we go # n=$( eval $DIALOG \ --title \"\$title\" \ --backtitle \"\$btitle\" \ --ok-label \"\$msg_ok\" \ --cancel-label \"\$msg_cancel\" \ --default-item \"\$defaultzone\" \ --menu \"\$prompt\" \ $height $width $rows \ $menu_list \ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) retval=$? f_dialog_data_sanitize n defaultzone="$n" if [ $retval -ne $DIALOG_OK ]; then [ $nitems -eq 1 ] && NEED_CONTINENT=1 NEED_COUNTRY=1 continue fi - real_cont=$( f_country $tlc cont_$n ) - real_continent=$( f_continent $real_cont name ) - name=$( f_country $tlc name ) - filename=$( f_country $tlc filename_$n ) + f_country $tlc cont_$n real_cont + f_continent $real_cont name real_continent + f_country $tlc name name + f_country $tlc filename_$n filename f_confirm_zone "$real_continent/$filename" || continue fi [ $retval -eq $DIALOG_OK ] || continue # back to main menu if ! f_install_zoneinfo "$real_continent/$filename"; then [ $nzones -lt 0 ] && NEED_COUNTRY=1 else break fi done ################################################################################ # END ################################################################################