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