From 14ea22e96c0b6fce54e2451c69c96c429177b62c Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sun, 15 Feb 1998 19:31:34 +0000 Subject: Update. 1998-02-15 Ulrich Drepper * nss/nsswitch.c (__nss_lookup): Return 1 if this was the last module. * nss/getXXent_r.c: If no more module is found don't try to call setXXent functions but leave unsuccessfully. * malloc/obstack.h: Cleanups. * sysdeps/wordsize-32/stdint.h: New file. * sysdeps/wordsize-64/stdint.h: New file. * sysdeps/generic/stdint.h: New file. * sysdeps/wordsize-32/inttypes.h: Adopt to use stdint.h. * sysdeps/wordsize-64/inttypes.h: Likewise. * stdlib/Makefile (headers): Add stdint.h. 1998-02-03 Paul Eggert * malloc/obstack.h (PTR_INT_TYPE): Use __PTRDIFF_TYPE__ if available. 1998-02-13 17:59 Zack Weinberg * timezone: New directory. * time/README, time/africa, time/antarctica, time/asia, time/australasia, time/backward, time/checktab.awk, time/etcetera, time/europe, time/factory, time/ialloc.c, time/iso3166.tab, time/leapseconds, time/northamerica, time/pacificnew, time/private.h, time/scheck.c, time/solar87, time/solar88, time/solar89, time/southamerica, time/systemv, time/test-tz.c, time/tzfile.h, time/tzselect.ksh, time/yearistype, time/zdump.c, time/zic.c, time/zone.tab: Moved to timezone. * time/tzfile.c: Include tzfile.h from timezone subdir. * time/tzset.c: Likewise. * time/Makefile: Cut out all code relating to timezones... * timezone/Makefile: ...and paste it in here. * Makefile (subdirs): Add timezone. 1998-02-13 18:45 H.J. Lu * libc.map (_sys_nerr): Added. * sysdeps/unix/sysv/linux/errlist.c (_sys_nerr): Make it versioned symbol. 1998-02-15 17:16 Ulrich Drepper * sysdeps/unix/sysv/linux/bits/socket.h: Define PF_KEY and pseudo_AF_KEY instead of pseudo_PF_KEY and AF_KEY. Reported by Craig Metz . 1998-01-22 Andreas Schwab * nss/nss_files/files-parse.c (LOOKUP_NAME_CASE): Use __strcasecmp instead of strcasecmp. * nss/nss_files/files-alias.c (get_next_alias): Likewise. * wctype/wctype.h (_ISwbit): Avoid warning with gcc before 2.8. 1998-02-15 16:55 Ulrich Drepper * socket/sys/socket.h (setsockopt): Make OPTVAL parameter const. Patch by Dean Gaudet . 1998-02-15 16:53 Ulrich Drepper * sysdeps/generic/Dist: Add getresgid.c and getresuid.c. 1998-02-15 10:49 Zack Weinberg * sysdeps/unix/sysv/linux/poll.c: If compiled against a kernel with no poll syscall, just include the BSD version. * sysdeps/unix/sysv/linux/getresuid.c: If compiled against a kernel without the syscall, include the stub version. * sysdeps/unix/sysv/linux/getresgid.c: Likewise. * sysdeps/generic/getresuid.c: New file. * sysdeps/generic/getresgid.c: New file. 1998-02-15 Ulrich Drepper * stdio-common/vfscanf.c: Correct last change a bit. --- timezone/tzselect.ksh | 289 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 289 insertions(+) create mode 100644 timezone/tzselect.ksh (limited to 'timezone/tzselect.ksh') diff --git a/timezone/tzselect.ksh b/timezone/tzselect.ksh new file mode 100644 index 0000000000..031cda1de6 --- /dev/null +++ b/timezone/tzselect.ksh @@ -0,0 +1,289 @@ +#! @KSH@ +# Ask the user about the time zone, and output the resulting TZ value to stdout. +# Interact with the user via stderr and stdin. + +# Contributed by Paul Eggert . + +# Porting notes: +# +# This script requires several features of the Korn shell. +# If your host lacks the Korn shell, +# you can use either of the following free programs instead: +# +# Bourne-Again shell (bash) +# +# +# Public domain ksh +# +# +# This script also uses several features of modern awk programs. +# If your host lacks awk, or has an old awk that does not conform to Posix.2, +# you can use either of the following free programs instead: +# +# GNU awk (gawk) +# +# +# mawk +# + + +# Specify default values for environment variables if they are unset. +: ${AWK=awk} +: ${TZDIR=@TZDIR@} + +# Check for awk Posix compliance. +($AWK -v x=y 'BEGIN { exit 123 }') /dev/null 2>&1 +[ $? = 123 ] || { + echo >&2 "$0: Sorry, your \`$AWK' program is not Posix compatible." + exit 1 +} + +# Make sure the tables are readable. +TZ_COUNTRY_TABLE=$TZDIR/iso3166.tab +TZ_ZONE_TABLE=$TZDIR/zone.tab +for f in $TZ_COUNTRY_TABLE $TZ_ZONE_TABLE +do + <$f || { + echo >&2 "$0: time zone files are not set up correctly" + exit 1 + } +done + +newline=' +' +IFS=$newline + + +# Work around a bug in bash 1.14.7 and earlier, where $PS3 is sent to stdout. +case $(echo 1 | (select x in x; do break; done) 2>/dev/null) in +?*) PS3= +esac + + +# Begin the main loop. We come back here if the user wants to retry. +while + + echo >&2 'Please identify a location' \ + 'so that time zone rules can be set correctly.' + + continent= + country= + region= + + + # Ask the user for continent or ocean. + + echo >&2 'Please select a continent or ocean.' + + select continent in \ + Africa \ + Americas \ + Antarctica \ + 'Arctic Ocean' \ + Asia \ + 'Atlantic Ocean' \ + Australia \ + Europe \ + 'Indian Ocean' \ + 'Pacific Ocean' \ + 'none - I want to specify the time zone using the Posix TZ format.' + do + case $continent in + '') + echo >&2 'Please enter a number in range.';; + ?*) + case $continent in + Americas) continent=America;; + *' '*) continent=$(expr "$continent" : '\([^ ]*\)') + esac + break + esac + done + case $continent in + '') + exit 1;; + none) + # Ask the user for a Posix TZ string. Check that it conforms. + while + echo >&2 'Please enter the desired value' \ + 'of the TZ environment variable.' + echo >&2 'For example, GST-10 is a zone named GST' \ + 'that is 10 hours ahead (east) of UTC.' + read TZ + $AWK -v TZ="$TZ" 'BEGIN { + tzname = "[^-+,0-9][^-+,0-9][^-+,0-9]+" + time = "[0-2]?[0-9](:[0-5][0-9](:[0-5][0-9])?)?" + offset = "[-+]?" time + date = "(J?[0-9]+|M[0-9]+\.[0-9]+\.[0-9]+)" + datetime = "," date "(/" time ")?" + tzpattern = "^(:.*|" tzname offset "(" tzname \ + "(" offset ")?(" datetime datetime ")?)?)$" + if (TZ ~ tzpattern) exit 1 + exit 0 + }' + do + echo >&2 "\`$TZ' is not a conforming" \ + 'Posix time zone string.' + done + TZ_for_date=$TZ;; + *) + # Get list of names of countries in the continent or ocean. + countries=$($AWK -F'\t' \ + -v continent="$continent" \ + -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \ + ' + /^#/ { next } + $3 ~ ("^" continent "/") { + if (!cc_seen[$1]++) cc_list[++ccs] = $1 + } + END { + while (getline &2 'Please select a country.' + select country in $countries + do + case $country in + '') echo >&2 'Please enter a number in range.';; + ?*) break + esac + done + + case $country in + '') exit 1 + esac;; + *) + country=$countries + esac + + + # Get list of names of time zone rule regions in the country. + regions=$($AWK -F'\t' \ + -v country="$country" \ + -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \ + ' + BEGIN { + cc = country + while (getline &2 'Please select one of the following' \ + 'time zone regions.' + select region in $regions + do + case $region in + '') echo >&2 'Please enter a number in range.';; + ?*) break + esac + done + case $region in + '') exit 1 + esac;; + *) + region=$regions + esac + + # Determine TZ from country and region. + TZ=$($AWK -F'\t' \ + -v country="$country" \ + -v region="$region" \ + -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \ + ' + BEGIN { + cc = country + while (getline &2 "$0: time zone files are not set up correctly" + exit 1 + } + esac + + + # Use the proposed TZ to output the current date relative to UTC. + # Loop until they agree in seconds. + # Give up after 8 unsuccessful tries. + + extra_info= + for i in 1 2 3 4 5 6 7 8 + do + TZdate=$(LANG=C TZ="$TZ_for_date" date) + UTdate=$(LANG=C TZ=UTC0 date) + TZsec=$(expr "$TZdate" : '.*:\([0-5][0-9]\)') + UTsec=$(expr "$UTdate" : '.*:\([0-5][0-9]\)') + case $TZsec in + $UTsec) + extra_info=" +Local time is now: $TZdate. +Universal Time is now: $UTdate." + break + esac + done + + + # Output TZ info and ask the user to confirm. + + echo >&2 "" + echo >&2 "The following information has been given:" + echo >&2 "" + case $country+$region in + ?*+?*) echo >&2 " $country$newline $region";; + ?*+) echo >&2 " $country";; + +) echo >&2 " TZ='$TZ'" + esac + echo >&2 "" + echo >&2 "Therefore TZ='$TZ' will be used.$extra_info" + echo >&2 "Is the above information OK?" + + ok= + select ok in Yes No + do + case $ok in + '') echo >&2 'Please enter 1 for Yes, or 2 for No.';; + ?*) break + esac + done + case $ok in + '') exit 1;; + Yes) break + esac +do : +done + +# Output the answer. +echo "$TZ" -- cgit 1.4.1