1ab2043b8SDevin Teskeif [ ! "$_TIMEZONE_ZONES_SUBR" ]; then _TIMEZONE_ZONES_SUBR=1 2ab2043b8SDevin Teske# 3ab2043b8SDevin Teske# Copyright (c) 2011-2012 Devin Teske 4f8ea072aSDevin Teske# All rights reserved. 5ab2043b8SDevin Teske# 6ab2043b8SDevin Teske# Redistribution and use in source and binary forms, with or without 7ab2043b8SDevin Teske# modification, are permitted provided that the following conditions 8ab2043b8SDevin Teske# are met: 9ab2043b8SDevin Teske# 1. Redistributions of source code must retain the above copyright 10ab2043b8SDevin Teske# notice, this list of conditions and the following disclaimer. 11ab2043b8SDevin Teske# 2. Redistributions in binary form must reproduce the above copyright 12ab2043b8SDevin Teske# notice, this list of conditions and the following disclaimer in the 13ab2043b8SDevin Teske# documentation and/or other materials provided with the distribution. 14ab2043b8SDevin Teske# 15ab2043b8SDevin Teske# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 168e37a7c8SDevin Teske# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17ab2043b8SDevin Teske# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18ab2043b8SDevin Teske# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19ab2043b8SDevin Teske# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 208e37a7c8SDevin Teske# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21ab2043b8SDevin Teske# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22ab2043b8SDevin Teske# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23ab2043b8SDevin Teske# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24ab2043b8SDevin Teske# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25ab2043b8SDevin Teske# SUCH DAMAGE. 26ab2043b8SDevin Teske# 27ab2043b8SDevin Teske# 28ab2043b8SDevin Teske############################################################ INCLUDES 29ab2043b8SDevin Teske 30ab2043b8SDevin TeskeBSDCFG_SHARE="/usr/share/bsdconfig" 31ab2043b8SDevin Teske. $BSDCFG_SHARE/common.subr || exit 1 3256961fd7SDevin Teskef_dprintf "%s: loading includes..." timezone/zones.subr 33ab2043b8SDevin Teskef_include $BSDCFG_SHARE/dialog.subr 34*d4ae33f0SDevin Teskef_include $BSDCFG_SHARE/strings.subr 35ab2043b8SDevin Teskef_include $BSDCFG_SHARE/timezone/continents.subr 36ab2043b8SDevin Teske 37ab2043b8SDevin TeskeBSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="090.timezone" 38ab2043b8SDevin Teskef_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr 39ab2043b8SDevin Teske 40ab2043b8SDevin Teske############################################################ CONFIGURATION 41ab2043b8SDevin Teske 42ab2043b8SDevin Teske# 43ab2043b8SDevin Teske# Standard pathnames 44ab2043b8SDevin Teske# 45ab2043b8SDevin Teske_PATH_ZONETAB="/usr/share/zoneinfo/zone.tab" 46ab2043b8SDevin Teske_PATH_ZONEINFO="/usr/share/zoneinfo" 47ab2043b8SDevin Teske_PATH_LOCALTIME="/etc/localtime" 48ab2043b8SDevin Teske_PATH_DB="/var/db/zoneinfo" 49ab2043b8SDevin Teske 50ab2043b8SDevin Teske# 51ab2043b8SDevin Teske# Export required i18n messages for awk(1) ENVIRON visibility 52ab2043b8SDevin Teske# 53ab2043b8SDevin Teskeexport msg_conflicting_zone_definition 54ab2043b8SDevin Teskeexport msg_country_code_invalid 55ab2043b8SDevin Teskeexport msg_country_code_unknown 56ab2043b8SDevin Teskeexport msg_invalid_country_code 57ab2043b8SDevin Teskeexport msg_invalid_format 58ab2043b8SDevin Teskeexport msg_invalid_region 59ab2043b8SDevin Teskeexport msg_invalid_zone_name 60ab2043b8SDevin Teskeexport msg_zone_multiply_defined 61ab2043b8SDevin Teskeexport msg_zone_must_have_description 62ab2043b8SDevin Teske 63ab2043b8SDevin Teske############################################################ FUNCTIONS 64ab2043b8SDevin Teske 65ab2043b8SDevin Teske# f_read_zones 66ab2043b8SDevin Teske# 67ab2043b8SDevin Teske# Read the zone descriptions database in _PATH_ZONETAB: 68ab2043b8SDevin Teske# /usr/share/zoneinfo/zone.tab on all OSes 69ab2043b8SDevin Teske# 70ab2043b8SDevin Teske# The format of this file (on all OSes) is: 71ab2043b8SDevin Teske# code coordinates TZ comments 72ab2043b8SDevin Teske# 73ab2043b8SDevin Teske# With each of the following elements (described below) being separated by a 74ab2043b8SDevin Teske# single tab character: 75ab2043b8SDevin Teske# 76ab2043b8SDevin Teske# code 77ab2043b8SDevin Teske# The ISO 3166 2-character country code. 78ab2043b8SDevin Teske# coordinates 79ab2043b8SDevin Teske# Latitude and logitude of the zone's principal location in ISO 80ab2043b8SDevin Teske# 6709 sign-degrees-minutes-seconds format, either +-DDMM+-DDDMM 81ab2043b8SDevin Teske# or +-DDMMSS+-DDDMMSS, first latitude (+ is north), then long- 82ab2043b8SDevin Teske# itude (+ is east). 83ab2043b8SDevin Teske# TZ 84ab2043b8SDevin Teske# Zone name used in value of TZ environment variable. 85ab2043b8SDevin Teske# comments 86ab2043b8SDevin Teske# Comments; present if and only if the country has multiple rows. 87ab2043b8SDevin Teske# 88ab2043b8SDevin Teske# Required variables [from continents.subr]: 89ab2043b8SDevin Teske# 90ab2043b8SDevin Teske# CONTINENTS 91ab2043b8SDevin Teske# Space-separated list of continents. 92ab2043b8SDevin Teske# continent_*_name 93ab2043b8SDevin Teske# Directory element in _PATH_ZONEINFO for the continent 94ab2043b8SDevin Teske# represented by *. 95ab2043b8SDevin Teske# 96ab2043b8SDevin Teske# Required variables [created by f_read_iso3166_table from iso3166.subr]: 97ab2043b8SDevin Teske# 98ab2043b8SDevin Teske# country_CODE_name 99ab2043b8SDevin Teske# Country name of the country represented by CODE, the 2- 100ab2043b8SDevin Teske# character country code. 101ab2043b8SDevin Teske# 102ab2043b8SDevin Teske# Variables created by this function: 103ab2043b8SDevin Teske# 104ab2043b8SDevin Teske# country_CODE_nzones 105ab2043b8SDevin Teske# Either set to `-1' to indicate that the 2-character country 106ab2043b8SDevin Teske# code has only a single zone associated with it (and therefore 107ab2043b8SDevin Teske# you should query the `country_CODE_*' environment variables), 108ab2043b8SDevin Teske# or set to `0' or higher to indicate how many zones are assoc- 109ab2043b8SDevin Teske# iated with the given country code. When multiple zones are 110ab2043b8SDevin Teske# configured for a single code, you should instead query the 111ab2043b8SDevin Teske# `country_CODE_*_N' environment variables (e.g., `echo 112ab2043b8SDevin Teske# $country_AQ_descr_1' prints the description of the first 113ab2043b8SDevin Teske# timezone in Antarctica). 114ab2043b8SDevin Teske# country_CODE_filename 115ab2043b8SDevin Teske# The ``filename'' portion of the TZ value that appears after the 116ab2043b8SDevin Teske# `/' (e.g., `Hong_Kong' from `Asia/Hong_Kong' or `Isle_of_Man' 117ab2043b8SDevin Teske# from `Europe/Isle_of_Man'). 118ab2043b8SDevin Teske# country_CODE_cont 119ab2043b8SDevin Teske# The ``continent'' portion of the TZ value that appears before 120ab2043b8SDevin Teske# the `/' (e.g., `Asia' from `Asia/Hong_Kong' or `Europe' from 121ab2043b8SDevin Teske# `Europe/Isle_of_Man'). 122ab2043b8SDevin Teske# country_CODE_descr 123ab2043b8SDevin Teske# The comments associated with the ISO 3166 code entry (if any). 124ab2043b8SDevin Teske# 125ab2043b8SDevin Teske# NOTE: CODE is the 2-character country code. 126ab2043b8SDevin Teske# 127ab2043b8SDevin Teske# This function is a two-parter. Below is the awk(1) portion of the function, 128ab2043b8SDevin Teske# afterward is the sh(1) function which utilizes the below awk script. 129ab2043b8SDevin Teske# 130ab2043b8SDevin Teskef_read_zones_awk=' 131ab2043b8SDevin Teske# Variables that should be defined on the invocation line: 132ab2043b8SDevin Teske# -v progname="progname" 133ab2043b8SDevin Teske# 134ab2043b8SDevin TeskeBEGIN { 135ab2043b8SDevin Teske lineno = 0 136ab2043b8SDevin Teske failed = 0 137ab2043b8SDevin Teske 138ab2043b8SDevin Teske # 139ab2043b8SDevin Teske # Initialize continents array/map (name => id) 140ab2043b8SDevin Teske # 141ab2043b8SDevin Teske split(ENVIRON["CONTINENTS"], array, /[[:space:]]+/) 142ab2043b8SDevin Teske for (item in array) 143ab2043b8SDevin Teske { 144ab2043b8SDevin Teske cont = array[item] 145ab2043b8SDevin Teske if (!cont) continue 146ab2043b8SDevin Teske name = ENVIRON["continent_" cont "_name"] 147ab2043b8SDevin Teske continents[name] = cont 148ab2043b8SDevin Teske } 149ab2043b8SDevin Teske} 150ab2043b8SDevin Teskefunction die(fmt, argc, argv) 151ab2043b8SDevin Teske{ 152ab2043b8SDevin Teske printf "f_die 1 \"%%s: %s\" \"%s\"", fmt, progname 153ab2043b8SDevin Teske for (n = 1; n <= argc; n++) 154ab2043b8SDevin Teske printf " \"%s\"", argv[n] 155ab2043b8SDevin Teske print "" 156ab2043b8SDevin Teske failed++ 157ab2043b8SDevin Teske exit 1 158ab2043b8SDevin Teske} 159ab2043b8SDevin Teskefunction find_continent(name) 160ab2043b8SDevin Teske{ 161ab2043b8SDevin Teske return continents[name] 162ab2043b8SDevin Teske} 163ab2043b8SDevin Teskefunction add_zone_to_country(lineno, tlc, descr, file, cont) 164ab2043b8SDevin Teske{ 165ab2043b8SDevin Teske # 166ab2043b8SDevin Teske # Validate the two-character country code 167ab2043b8SDevin Teske # 168ab2043b8SDevin Teske if (!match(tlc, /^[A-Z][A-Z]$/)) 169ab2043b8SDevin Teske { 170ab2043b8SDevin Teske argv[1] = FILENAME 171ab2043b8SDevin Teske argv[2] = lineno 172ab2043b8SDevin Teske argv[3] = tlc 173ab2043b8SDevin Teske die(ENVRION["msg_country_code_invalid"], 3, argv) 174ab2043b8SDevin Teske } 175ab2043b8SDevin Teske if (!ENVIRON["country_" tlc "_name"]) 176ab2043b8SDevin Teske { 177ab2043b8SDevin Teske argv[1] = FILENAME 178ab2043b8SDevin Teske argv[2] = lineno 179ab2043b8SDevin Teske argv[3] = tlc 180ab2043b8SDevin Teske die(ENVIRON["msg_country_code_unknown"], 3, argv) 181ab2043b8SDevin Teske } 182ab2043b8SDevin Teske 183ab2043b8SDevin Teske # 184ab2043b8SDevin Teske # Add Zone to an array that we will parse at the end 185ab2043b8SDevin Teske # 186ab2043b8SDevin Teske if (length(descr) > 0) 187ab2043b8SDevin Teske { 188ab2043b8SDevin Teske if (country_nzones[tlc] < 0) 189ab2043b8SDevin Teske { 190ab2043b8SDevin Teske argv[1] = FILENAME 191ab2043b8SDevin Teske argv[2] = lineno 192ab2043b8SDevin Teske die(ENVIRON["msg_conflicting_zone_definition"], 2, argv) 193ab2043b8SDevin Teske } 194ab2043b8SDevin Teske 195ab2043b8SDevin Teske n = ++country_nzones[tlc] 196ab2043b8SDevin Teske country_cont[tlc,n] = cont 197ab2043b8SDevin Teske country_filename[tlc,n] = file 198ab2043b8SDevin Teske country_descr[tlc,n] = descr 199ab2043b8SDevin Teske } 200ab2043b8SDevin Teske else 201ab2043b8SDevin Teske { 202ab2043b8SDevin Teske if (country_nzones[tlc] > 0) 203ab2043b8SDevin Teske { 204ab2043b8SDevin Teske argv[1] = FILENAME 205ab2043b8SDevin Teske argv[2] = lineno 206ab2043b8SDevin Teske die(ENVIRON["msg_zone_must_have_description"], 2, argv) 207ab2043b8SDevin Teske } 208ab2043b8SDevin Teske if (country_nzones[tlc] < 0) 209ab2043b8SDevin Teske { 210ab2043b8SDevin Teske argv[1] = FILENAME 211ab2043b8SDevin Teske argv[2] = lineno 212ab2043b8SDevin Teske die(ENVIRON["msg_zone_multiply_defined"], 2, argv) 213ab2043b8SDevin Teske } 214ab2043b8SDevin Teske 215ab2043b8SDevin Teske country_nzones[tlc] = -1 216ab2043b8SDevin Teske country_cont[tlc] = cont 217ab2043b8SDevin Teske country_filename[tlc] = file 218ab2043b8SDevin Teske } 219ab2043b8SDevin Teske} 220ab2043b8SDevin Teskefunction print_country_code(tlc) 221ab2043b8SDevin Teske{ 222ab2043b8SDevin Teske nz = country_nzones[tlc] 223ab2043b8SDevin Teske 224ab2043b8SDevin Teske printf "country_%s_nzones=%d\n", tlc, nz 225ab2043b8SDevin Teske printf "export country_%s_nzones\n", tlc 226ab2043b8SDevin Teske 227ab2043b8SDevin Teske if (nz < 0) 228ab2043b8SDevin Teske { 229ab2043b8SDevin Teske printf "country_%s_cont=\"%s\"\n", tlc, country_cont[tlc] 230ab2043b8SDevin Teske printf "export country_%s_cont\n", tlc 231ab2043b8SDevin Teske printf "country_%s_filename=\"%s\"\n", 232ab2043b8SDevin Teske tlc, country_filename[tlc] 233ab2043b8SDevin Teske } 234ab2043b8SDevin Teske else 235ab2043b8SDevin Teske { 236ab2043b8SDevin Teske n = 0 237ab2043b8SDevin Teske while ( ++n <= nz ) 238ab2043b8SDevin Teske { 239ab2043b8SDevin Teske printf "country_%s_cont_%d=\"%s\"\n", 240ab2043b8SDevin Teske tlc, n, country_cont[tlc,n] 241ab2043b8SDevin Teske printf "export country_%s_cont_%d\n", tlc, n 242ab2043b8SDevin Teske printf "country_%s_filename_%d=\"%s\"\n", 243ab2043b8SDevin Teske tlc, n, country_filename[tlc,n] 244ab2043b8SDevin Teske printf "country_%s_descr_%d=\"%s\"\n", 245ab2043b8SDevin Teske tlc, n, country_descr[tlc,n] 246ab2043b8SDevin Teske } 247ab2043b8SDevin Teske } 248ab2043b8SDevin Teske} 249ab2043b8SDevin Teske/^#/ { 250ab2043b8SDevin Teske lineno++ 251ab2043b8SDevin Teske next 252ab2043b8SDevin Teske} 253ab2043b8SDevin Teske!/^#/ { 254ab2043b8SDevin Teske lineno++ 255ab2043b8SDevin Teske 256ab2043b8SDevin Teske # 257ab2043b8SDevin Teske # Split the current record (on TAB) into an array 258ab2043b8SDevin Teske # 259ab2043b8SDevin Teske if (split($0, line, /\t/) < 2) 260ab2043b8SDevin Teske { 261ab2043b8SDevin Teske argv[1] = FILENAME 262ab2043b8SDevin Teske argv[2] = lineno 263ab2043b8SDevin Teske die(ENVIRON["msg_invalid_format"], 2, argv) 264ab2043b8SDevin Teske } 265ab2043b8SDevin Teske 266ab2043b8SDevin Teske # Get the ISO3166-1 (Alpha 1) 2-letter country code 267ab2043b8SDevin Teske tlc = line[1] 268ab2043b8SDevin Teske 269ab2043b8SDevin Teske # 270ab2043b8SDevin Teske # Validate the two-character country code 271ab2043b8SDevin Teske # 272ab2043b8SDevin Teske if (length(tlc) != 2) 273ab2043b8SDevin Teske { 274ab2043b8SDevin Teske argv[1] = FILENAME 275ab2043b8SDevin Teske argv[2] = lineno 276ab2043b8SDevin Teske argv[3] = tlc 277ab2043b8SDevin Teske die(ENVIRON["msg_invalid_country_code"], 3, argv) 278ab2043b8SDevin Teske } 279ab2043b8SDevin Teske 280ab2043b8SDevin Teske # Get the TZ field 281ab2043b8SDevin Teske tz = line[3] 282ab2043b8SDevin Teske 283ab2043b8SDevin Teske # 284ab2043b8SDevin Teske # Validate the TZ field 285ab2043b8SDevin Teske # 286ab2043b8SDevin Teske if (!match(tz, "/")) 287ab2043b8SDevin Teske { 288ab2043b8SDevin Teske argv[1] = FILENAME 289ab2043b8SDevin Teske argv[2] = lineno 290ab2043b8SDevin Teske argv[3] = tz 291ab2043b8SDevin Teske die(ENVIRON["msg_invalid_zone_name"], 3, argv) 292ab2043b8SDevin Teske } 293ab2043b8SDevin Teske 294ab2043b8SDevin Teske # 295ab2043b8SDevin Teske # Get the continent portion of the TZ field 296ab2043b8SDevin Teske # 297ab2043b8SDevin Teske contbuf = tz 298ab2043b8SDevin Teske sub("/.*$", "", contbuf) 299ab2043b8SDevin Teske 300ab2043b8SDevin Teske # 301ab2043b8SDevin Teske # Validate the continent 302ab2043b8SDevin Teske # 303ab2043b8SDevin Teske cont = find_continent(contbuf) 304ab2043b8SDevin Teske if (!cont) 305ab2043b8SDevin Teske { 306ab2043b8SDevin Teske argv[1] = FILENAME 307ab2043b8SDevin Teske argv[2] = lineno 308ab2043b8SDevin Teske argv[3] = contbuf 309ab2043b8SDevin Teske die(ENVIRON["msg_invalid_region"], 3, argv) 310ab2043b8SDevin Teske } 311ab2043b8SDevin Teske 312ab2043b8SDevin Teske # 313ab2043b8SDevin Teske # Get the filename portion of the TZ field 314ab2043b8SDevin Teske # 315ab2043b8SDevin Teske filename = tz 316ab2043b8SDevin Teske sub("^[^/]*/", "", filename) 317ab2043b8SDevin Teske 318ab2043b8SDevin Teske # 319ab2043b8SDevin Teske # Calculate the substr start-position of the comment 320ab2043b8SDevin Teske # 321ab2043b8SDevin Teske descr_start = 0 322ab2043b8SDevin Teske n = 4 323ab2043b8SDevin Teske while (--n) 324ab2043b8SDevin Teske descr_start += length(line[n]) + 1 325ab2043b8SDevin Teske 326ab2043b8SDevin Teske # Get the comment field 327ab2043b8SDevin Teske descr = substr($0, descr_start + 1) 328ab2043b8SDevin Teske 329ab2043b8SDevin Teske add_zone_to_country(lineno, tlc, descr, filename, cont) 330ab2043b8SDevin Teske} 331ab2043b8SDevin TeskeEND { 332ab2043b8SDevin Teske if (failed) exit failed 333ab2043b8SDevin Teske for (tlc in country_nzones) 334ab2043b8SDevin Teske print_country_code(tlc) 335ab2043b8SDevin Teske} 336ab2043b8SDevin Teske' 337ab2043b8SDevin Teskef_read_zones() 338ab2043b8SDevin Teske{ 339ab2043b8SDevin Teske eval $( awk -v progname="$pgm" \ 340ab2043b8SDevin Teske "$f_read_zones_awk" \ 341ab2043b8SDevin Teske "$_PATH_ZONETAB" ) 342ab2043b8SDevin Teske} 343ab2043b8SDevin Teske 344ab2043b8SDevin Teske# f_install_zoneinfo_file $filename 345ab2043b8SDevin Teske# 346ab2043b8SDevin Teske# Installs a zone file to _PATH_LOCALTIME. 347ab2043b8SDevin Teske# 348ab2043b8SDevin Teskef_install_zoneinfo_file() 349ab2043b8SDevin Teske{ 350*d4ae33f0SDevin Teske local funcname=f_install_zoneinfo_file 351ab2043b8SDevin Teske local zoneinfo_file="$1" 352*d4ae33f0SDevin Teske local copymode title msg height width 353ab2043b8SDevin Teske 354ab2043b8SDevin Teske if [ -L "$_PATH_LOCALTIME" ]; then 355ab2043b8SDevin Teske copymode= 356ab2043b8SDevin Teske elif [ ! -e "$_PATH_LOCALTIME" ]; then 357ab2043b8SDevin Teske # Nothing there yet... 358ab2043b8SDevin Teske copymode=1 359ab2043b8SDevin Teske else 360ab2043b8SDevin Teske copymode=1 361ab2043b8SDevin Teske fi 362ab2043b8SDevin Teske 363ab2043b8SDevin Teske if [ "$VERBOSE" ]; then 364ab2043b8SDevin Teske if [ ! "$zoneinfo_file" ]; then 365*d4ae33f0SDevin Teske f_sprintf msg "$msg_removing_file" "$_PATH_LOCALTIME" 366ab2043b8SDevin Teske elif [ "$copymode" ]; then 367*d4ae33f0SDevin Teske f_sprintf msg "$msg_copying_file" \ 368*d4ae33f0SDevin Teske "$zoneinfo_file" "$_PATH_LOCALTIME" 369ab2043b8SDevin Teske else 370*d4ae33f0SDevin Teske f_sprintf msg "$msg_creating_symlink" \ 371*d4ae33f0SDevin Teske "$_PATH_LOCALTIME" "$zoneinfo_file" 372ab2043b8SDevin Teske fi 373ab2043b8SDevin Teske if [ "$USEDIALOG" ]; then 374ab2043b8SDevin Teske f_dialog_title "$msg_info" 375b4dc08d4SDevin Teske f_dialog_msgbox "$msg" 376ab2043b8SDevin Teske f_dialog_title_restore 377ab2043b8SDevin Teske else 378ab2043b8SDevin Teske printf "%s\n" "$msg" 379ab2043b8SDevin Teske fi 380ab2043b8SDevin Teske fi 381ab2043b8SDevin Teske 3829cd8fcc6SDevin Teske [ "$REALLYDOIT" ] || return $SUCCESS 3839cd8fcc6SDevin Teske 384*d4ae33f0SDevin Teske local catch_args="-de" 385*d4ae33f0SDevin Teske [ "$USEDIALOG" ] && catch_args= 386ab2043b8SDevin Teske 387*d4ae33f0SDevin Teske if [ ! "$zoneinfo_file" ]; then 388*d4ae33f0SDevin Teske f_eval_catch $catch_args $funcname rm \ 389*d4ae33f0SDevin Teske 'rm -f "%s"' "$_PATH_LOCALTIME" || return $FAILURE 390*d4ae33f0SDevin Teske f_eval_catch $catch_args $funcname rm \ 391*d4ae33f0SDevin Teske 'rm -f "%s"' "$_PATH_DB" || return $FAILURE 392ab2043b8SDevin Teske 393ab2043b8SDevin Teske if [ "$VERBOSE" ]; then 394*d4ae33f0SDevin Teske f_sprintf msg "$msg_removed_file" "$_PATH_LOCALTIME" 395ab2043b8SDevin Teske if [ "$USEDIALOG" ]; then 396b4dc08d4SDevin Teske f_dialog_title "$msg_done" 397b4dc08d4SDevin Teske f_dialog_msgbox "$msg" 398b4dc08d4SDevin Teske f_dialog_title_restore 399ab2043b8SDevin Teske else 400ab2043b8SDevin Teske printf "%s\n" "$msg" 401ab2043b8SDevin Teske fi 402ab2043b8SDevin Teske fi 403ab2043b8SDevin Teske return $SUCCESS 404ab2043b8SDevin Teske fi # ! zoneinfo_file 405ab2043b8SDevin Teske 406ab2043b8SDevin Teske if [ "$copymode" ]; then 407*d4ae33f0SDevin Teske f_eval_catch $catch_args $funcname rm \ 408*d4ae33f0SDevin Teske 'rm -f "%s"' "$_PATH_LOCALTIME" || return $FAILURE 409*d4ae33f0SDevin Teske f_eval_catch $catch_args $funcname sh \ 410*d4ae33f0SDevin Teske 'umask 222 && :> "%s"' "$_PATH_LOCALTIME" || 411ab2043b8SDevin Teske return $FAILURE 412*d4ae33f0SDevin Teske f_eval_catch $catch_args $funcname sh \ 413*d4ae33f0SDevin Teske 'cat "%s" > "%s"' \ 414*d4ae33f0SDevin Teske "$zoneinfo_file" "$_PATH_LOCALTIME" || return $FAILURE 415ab2043b8SDevin Teske else 416*d4ae33f0SDevin Teske f_eval_catch $catch_args $funcname sh \ 417*d4ae33f0SDevin Teske '( :< "%s" )' "$zoneinfo_file" || return $FAILURE 418*d4ae33f0SDevin Teske f_eval_catch $catch_args $funcname rm \ 419*d4ae33f0SDevin Teske 'rm -f "%s"' "$_PATH_LOCALTIME" || return $FAILURE 420*d4ae33f0SDevin Teske f_eval_catch $catch_args $funcname ln \ 421*d4ae33f0SDevin Teske 'ln -s "%s" "%s"' \ 422*d4ae33f0SDevin Teske "$zoneinfo_file" "$_PATH_LOCALTIME" || return $FAILURE 423ab2043b8SDevin Teske fi # copymode 424ab2043b8SDevin Teske 425ab2043b8SDevin Teske if [ "$VERBOSE" ]; then 426ab2043b8SDevin Teske if [ "$copymode" ]; then 427*d4ae33f0SDevin Teske f_sprintf msg "$msg_copied_timezone_file" \ 428*d4ae33f0SDevin Teske "$zoneinfo_file" "$_PATH_LOCALTIME" 429ab2043b8SDevin Teske else 430*d4ae33f0SDevin Teske f_sprintf msg "$msg_created_symlink" \ 431*d4ae33f0SDevin Teske "$_PATH_LOCALTIME" "$zoneinfo_file" 432ab2043b8SDevin Teske fi 433ab2043b8SDevin Teske if [ "$USEDIALOG" ]; then 434b4dc08d4SDevin Teske f_dialog_title "$msg_done" 435b4dc08d4SDevin Teske f_dialog_msgbox "$msg" 436b4dc08d4SDevin Teske f_dialog_title_restore 437ab2043b8SDevin Teske else 438ab2043b8SDevin Teske printf "%s\n" "$msg" 439ab2043b8SDevin Teske fi 440ab2043b8SDevin Teske fi 441ab2043b8SDevin Teske 442ab2043b8SDevin Teske return $SUCCESS 443ab2043b8SDevin Teske} 444ab2043b8SDevin Teske 445ab2043b8SDevin Teske# f_install_zoneinfo $zoneinfo 446ab2043b8SDevin Teske# 447ab2043b8SDevin Teske# Install a zoneinfo file relative to _PATH_ZONEINFO. The given $zoneinfo 448ab2043b8SDevin Teske# will be written to _PATH_DB (usable later with the `-r' flag). 449ab2043b8SDevin Teske# 450ab2043b8SDevin Teskef_install_zoneinfo() 451ab2043b8SDevin Teske{ 452ab2043b8SDevin Teske local zoneinfo="$1" 453ab2043b8SDevin Teske local rv 454ab2043b8SDevin Teske 455ab2043b8SDevin Teske f_install_zoneinfo_file "$_PATH_ZONEINFO/$zoneinfo" 456ab2043b8SDevin Teske rv=$? 457ab2043b8SDevin Teske 458ab2043b8SDevin Teske # Save knowledge for later 459ab2043b8SDevin Teske if [ "$REALLYDOIT" -a $rv -eq $SUCCESS ]; then 460437f6520SDevin Teske if true 2> /dev/null > "$_PATH_DB"; then 461ab2043b8SDevin Teske cat <<-EOF > "$_PATH_DB" 462ab2043b8SDevin Teske $zoneinfo 463ab2043b8SDevin Teske EOF 464ab2043b8SDevin Teske fi 465ab2043b8SDevin Teske fi 466ab2043b8SDevin Teske 467ab2043b8SDevin Teske return $rv 468ab2043b8SDevin Teske} 469ab2043b8SDevin Teske 470ab2043b8SDevin Teske# f_confirm_zone $filename 471ab2043b8SDevin Teske# 472ab2043b8SDevin Teske# Prompt the user to confirm the new timezone data. The first (and only) 473ab2043b8SDevin Teske# argument should be the pathname to the zoneinfo file, either absolute or 474ab2043b8SDevin Teske# relative to `/usr/share/zoneinfo' (e.g., "America/Los_Angeles"). 475ab2043b8SDevin Teske# 476ab2043b8SDevin Teske# The return status is 0 if "Yes" is chosen, 1 if "No", and 255 if Esc is 477ab2043b8SDevin Teske# pressed (see dialog(1) for additional details). 478ab2043b8SDevin Teske# 479ab2043b8SDevin Teskef_confirm_zone() 480ab2043b8SDevin Teske{ 481ab2043b8SDevin Teske local filename="$1" 482ab2043b8SDevin Teske f_dialog_title "$msg_confirmation" 483ab2043b8SDevin Teske local title="$DIALOG_TITLE" btitle="$DIALOG_BACKTITLE" 484ab2043b8SDevin Teske f_dialog_title_restore 485ab2043b8SDevin Teske local tm_zone="$( TZ="$filename" date +%Z )" 486*d4ae33f0SDevin Teske local prompt # Calculated below 487ab2043b8SDevin Teske local height=5 width=72 488ab2043b8SDevin Teske 489*d4ae33f0SDevin Teske f_sprintf prompt "$msg_look_reasonable" "$tm_zone" 490ab2043b8SDevin Teske if [ "$USE_XDIALOG" ]; then 491ab2043b8SDevin Teske height=$(( $height + 4 )) 492ab2043b8SDevin Teske $DIALOG \ 493ab2043b8SDevin Teske --title "$title" \ 494ab2043b8SDevin Teske --backtitle "$btitle" \ 495ab2043b8SDevin Teske --ok-label "$msg_yes" \ 496ab2043b8SDevin Teske --cancel-label "$msg_no" \ 497ab2043b8SDevin Teske --yesno "$prompt" $height $width 498ab2043b8SDevin Teske else 499ab2043b8SDevin Teske $DIALOG \ 500ab2043b8SDevin Teske --title "$title" \ 501ab2043b8SDevin Teske --backtitle "$btitle" \ 502ab2043b8SDevin Teske --yes-label "$msg_yes" \ 503ab2043b8SDevin Teske --no-label "$msg_no" \ 504ab2043b8SDevin Teske --yesno "$prompt" $height $width 505ab2043b8SDevin Teske fi 506ab2043b8SDevin Teske} 507ab2043b8SDevin Teske 508ab2043b8SDevin Teske# f_set_zone_utc 509ab2043b8SDevin Teske# 510ab2043b8SDevin Teske# Resets to the UTC timezone. 511ab2043b8SDevin Teske# 512ab2043b8SDevin Teskef_set_zone_utc() 513ab2043b8SDevin Teske{ 514ab2043b8SDevin Teske f_confirm_zone "" || return $FAILURE 515ab2043b8SDevin Teske f_install_zoneinfo_file "" 516ab2043b8SDevin Teske} 517ab2043b8SDevin Teske 51856961fd7SDevin Teske############################################################ MAIN 51956961fd7SDevin Teske 52056961fd7SDevin Teskef_dprintf "%s: Successfully loaded." timezone/zones.subr 52156961fd7SDevin Teske 522ab2043b8SDevin Teskefi # ! $_TIMEZONE_ZONES_SUBR 523