diff --git a/ChangeLog b/ChangeLog index 130d064408..d7fed11e61 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,178 @@ +Wed Nov 27 06:10:10 1996 Ulrich Drepper + + * Makefile: Fix typo. + + * configure: Require autoconf-2.11. + + * elf/dl-deps.c: Terminate duplicate list. + + * libio/libio.h: Add prototypes for _IO_seekoff and _IO_seekpos. + * libio/strfile.h: Update from current libg++. + * libio/strops.c: Likewise. + + * login/Makefile (routines): Update after correction of reentrant + interface. + * login/endutent.c: Removed. + * login/endutent_r.c: Likewise. + * login/pututline.c: Likewise. + * login/pututline_r.c: Likewise. + * login/setutent.c: Likewise. + * login/setutent_r.c: Likewise. + * login/getutent.c: Update for new interface. + * login/getutent_r.c: Likewise. + * login/getutid.c: Likewise. + * login/getutid_r.c: Likewise. + * login/getutline.c: Likewise. + * login/getutline_r.c: Likewise. + * login/login.c: Likewise. + * login/logout.c: Likewise. + * login/logwtmp.c: Likewise. + * login/utmp.h: Likewise. + * sysdeps/unix/getlogin.c: Likewise. + * sysdeps/unix/getlogin_r.c: Likewise. + * login/utmp-private.h: New private header. + * login/utmp_db.c: Stub DB backend for utmp handler. + * login/utmp_file.c: File backend for utmp handler. + * sysdeps/gnu/utmpbits.h (struct utmp): Add some more fields. + (enum utlogin): List of record types. + (struct exit_status): Record to align with other implementations. + + * sysdeps/generic/paths.h: Add _PATH_UTMP_DB. + * sysdeps/unix/sysv/linux/paths.h: Likewise. + + * sysdeps/generic/pty.c: Use getgrnam_r instead of getgrnam. + + * sysdeps/stub/getlogin.c: Update copyright. + * sysdeps/stub/getlogin_r.c: Likewise. + + * nss/getXXbyYY_r.c: Use -1l for error-pointer value instead of -1. + * nss/getXXent_r.c: Likewise. + * nss/nsswitch.c: Likewise. + + * posix/Makefile (headers): Add wait.h. + * posix/wait.h: New file. + + * posix/sys/types.h: Always define intN_t types. + + * stdio-common/Makefile: Update copyright. + Use -Wno-format flag for scanf4.c and scanf7.c. + + * stdlib/stdlib.h: Reformat. + + * time/africa: Update from ADO tzdata1996m. + * time/antarctica: Likewise. + * time/asia: Likewise. + * time/australia: Likewise. + * time/etcetera: Likewise. + * time/europe: Likewise. + * time/northamerica: Likewise. + * time/southamerica: Likewise. + * time/zone.tab: Likewise. + +Fri Nov 22 19:34:12 1996 Andreas Schwab + + * sysdeps/posix/getcwd.c (__getcwd): After resizing the buffer + move the current contents to the end and relocate file name + pointer to upper half of the buffer. + +Sun Nov 24 04:56:19 1996 Ulrich Drepper + + * time/africa: Update from ADO tzdata1996m. + * time/antarctica: Likewise. + * time/asia: Likewise. + * time/australia: Likewise. + * time/etcetera: Likewise. + * time/europe: Likewise. + * time/nothamerica: Likewise. + * time/southameria: Likewise. + * time/zone.tab: Likewise. + + * sysdeps/unix/sysv/linux/sys/serial.h: New file. + * sysdeps/unix/sysv/linux/Makefile [$(subdir)=misc] (sysdep_headers): + Add sys/serial.h. + * sysdeps/unix/sysv/linux/Dist: Add sys/serial.h. + + * posix/wait.h: New file. + * posix/Makefile (headers): Add wait.h. + +Sat Nov 23 17:27:52 1996 Roland McGrath + + * Makeconfig ($(common-objpfx)soversions.mk): Use regular + expression instead of shell pattern matching. + * shlib-versions: Change to regular expressions. + +Sat Nov 23 13:24:55 1996 Ulrich Drepper + + * io/stat.c: Add section from libgcc to copyright comment + to allow this file to be statically linked in applications. + * io/fstat.c: Likewise. + * io/lstat.c: Likewise. + * io/mknod.c: Likewise. + +Fri Nov 22 15:14:23 1996 Ulrich Drepper + + * csu/initfini.c: Add section from libgcc to copyright comment + to allow this file to be statically linked in applications. + + * malloc/obstack.h [!_LIBC && !HAVE_STRING_H]: Define memcpy if + not already defined. + (obstack_grow, obstack_grow0): Correct placement of braces. + + * gnu-versions.h (_GNU_OBSTACK_INTERFACE_VERSION): Define to 2. + * malloc/obstack.c (OBSTACK_INTERFACE_VERSION): Define to 2. + +Thu Nov 21 19:54:51 1996 Andreas Schwab + + * Makerules (make-link): Simplify by changing directory only if + not using rellns-sh; check whether we really have symbolic links. + + * rellns-sh: Fix the case of $(dirname $2) being a prefix of + $(dirname $1); use status of ln for exit code; make more robust + against multiple slashes in a row. + +Thu Nov 21 13:05:21 1996 Thomas Bushnell, n/BSG + + * configure.in (after AC_CANONICAL_HOST): mutate *-*-gnu* names + into *-*-gnu-gnu*. + * shlib-versions (gnu versions): Recognize *-*-gnu-gnu* instead of + the three-part name, to distinguish correctly from *-*-linux-gnu*. + + * sysdeps/mach/hurd/Makefile ($(libdir)/libc.so): Depend on + $(rpcuserlibs). + + * sysdeps/mach/hurd/Makefile (install-others): Add + $(libdir)/libc_p.a. + ($(libdir)/libc_p.a): New rule. + * sysdeps/mach/hurd/libc_p-ldscript: New file. + * sysdeps/mach/hurd/Dist: Add libc_p-ldscript. + +Wed Nov 20 20:28:21 1996 Richard Henderson + + * Makerules (make-link): Use $(shell) to find rellns-sh before we cd. + * time/Makefile: Likewise. + + * sysdeps/alpha/elf/Makefile: New file. Build crtbegin.o & crtend.o. + * sysdeps/alpha/elf/Dist: New file. + * sysdeps/alpha/elf/crtbegin.S, sysdeps/alpha/elf/crtend.S: New files. + The bits currently distributed with GCC fail in two ways -- they don't + understand multiple .got subsections and the extents of the lists are + dynamicly bound meaning that the application's lists get executed + multiple times and the library's lists never get executed. + +Wed Nov 20 00:42:45 1996 Andreas Schwab + + * stdlib/strtod.c: Fix previous change. + +Wed Nov 20 22:07:58 1996 Andreas Jaeger + + * time/Makefile ($(installed-localtime-file)): Use $(..) to find + rellns-sh script. + +Wed Nov 20 12:50:54 1996 Ulrich Drepper + + * stdio-common/Makefile: Add CFLAGS-scanf7.c to prevent warning. + Likesie for scanf4.c + Wed Nov 20 02:04:11 1996 Ulrich Drepper * sysdeps/unix/sysv/linux/sigsuspend.c: Make sigsuspend a weak diff --git a/Makeconfig b/Makeconfig index 0a338e12e2..1c25ace156 100644 --- a/Makeconfig +++ b/Makeconfig @@ -523,9 +523,10 @@ $(common-objpfx)soversions.mk: $(..)shlib-versions $(..)Makeconfig \ (file="$(wildcard $(patsubst %,$(..)%/shlib-versions,$(add-ons))) \ $(..)shlib-versions"; \ for f in $$file; do \ - sed 's/#.*$$//' $$f | while read conf versions; do \ - test -n "$$versions" || continue; \ - case '$(config-machine)-$(config-vendor)-$(config-os)' in $$conf)\ + sed 's/#.*$$//' $$f | while read conf versions; do \ + test -n "$$versions" && \ + test `expr '$(config-machine)-$(config-vendor)-$(config-os)' \ + : "$$conf"` != 0 || continue; \ for v in $$versions; do \ lib=`echo $$v | sed 's/=.*$$//'`; \ if eval "test -z \"\$$vers_lib$$lib\""; then \ @@ -536,9 +537,10 @@ $(common-objpfx)soversions.mk: $(..)shlib-versions $(..)Makeconfig \ echo "all-sonames+=$$lib.so\$$($$lib.so-version)";;\ *) echo "$$lib.so-version=$$number"; \ echo "all-sonames+=\$$($$lib.so-version)";; \ - esac; \ + esac; \ fi; \ - done ;; esac; done; \ + done; \ + done; \ done;) > $@T; exit 0 mv -f $@T $@ diff --git a/Makefile b/Makefile index 41fe4c3536..1ab8945736 100644 --- a/Makefile +++ b/Makefile @@ -176,7 +176,7 @@ $(includedir)/stubs.h: subdir_install else $(INSTALL_DATA) $(objpfx)stubs.h $@; fi rm -f $(objpfx)stubs.h -ifeq (yes, $(build-shared)) +ifeq (yes,$(build-shared)) # Like stubs.h the gnu/lib-names.h header is not used while building the # libc itself. So we generate it while installing. diff --git a/Makerules b/Makerules index 6a8638f6e9..19ec2410d8 100644 --- a/Makerules +++ b/Makerules @@ -600,16 +600,24 @@ versioned := $(strip $(foreach so,$(install-lib.so),\ $(addprefix $(slibdir)/,$(filter-out $(versioned),$(install-lib.so))): \ $(slibdir)/%.so: $(objpfx)%.so; $(do-install-program) +ifneq ($(findstring -s,$(LN_S)),) define make-link -here=`pwd`; cd $(@D); \ -rm -f $(@F).new; \ +rm -f $@.new; \ if test '$(@D)' = '$(&2; exit 1; } fi echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:706: checking host system type" >&5 +echo "configure:708: checking host system type" >&5 host_alias=$host case "$host_alias" in @@ -722,6 +724,20 @@ host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$ac_t""$host" 1>&6 + +# The way shlib-versions is used to generate soversions.mk uses a +# fairly simplistic model for name recognition that can't distinguish +# i486-pc-linux-gnu fully from i486-pc-gnu. So we mutate a $host_os +# of `gnu*' here to be `gnu-gnu*' just so that shlib-versions can +# tell. This doesn't get used much beyond that, so it's fairly safe. +case "$host_os" in +linux*) + ;; +gnu*) + host_os=`echo $host_os | sed -e 's/gnu/gnu-gnu/'` + ;; +esac + # We keep the original values in `$config_*' and never modify them, so we # can write them unchanged into config.make. Everything else uses # $machine, $vendor, and $os, and changes them whenever convenient. @@ -768,7 +784,7 @@ esac # This can take a while to compute. sysdep_dir=$srcdir/sysdeps echo $ac_n "checking sysdep dirs""... $ac_c" 1>&6 -echo "configure:772: checking sysdep dirs" >&5 +echo "configure:788: checking sysdep dirs" >&5 # Make sco3.2v4 become sco3.2.4 and sunos4.1.1_U1 become sunos4.1.1.U1. os="`echo $os | sed 's/\([0-9A-Z]\)[v_]\([0-9A-Z]\)/\1.\2/g'`" @@ -969,7 +985,7 @@ echo "$ac_t""sysdeps/generic sysdeps/stub" 1>&6 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:973: checking for a BSD compatible install" >&5 +echo "configure:989: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1020,10 +1036,10 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' if test "$INSTALL" = "${srcdir}/install-sh -c"; then # The makefiles need to use a different form to find it in $srcdir. - INSTALL="$(..)./install-sh -c" + INSTALL='$(..)./install-sh -c' fi echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 -echo "configure:1027: checking whether ln -s works" >&5 +echo "configure:1043: checking whether ln -s works" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1048,7 +1064,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1052: checking for $ac_word" >&5 +echo "configure:1068: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_MSGFMT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1079,7 +1095,7 @@ test -n "$MSGFMT" || MSGFMT=":" echo $ac_n "checking build system type""... $ac_c" 1>&6 -echo "configure:1083: checking build system type" >&5 +echo "configure:1099: checking build system type" >&5 build_alias=$build case "$build_alias" in @@ -1105,7 +1121,7 @@ fi # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1109: checking for $ac_word" >&5 +echo "configure:1125: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1137,7 +1153,7 @@ if test $host != $build; then # Extract the first word of "gcc cc", so it can be a program name with args. set dummy gcc cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1141: checking for $ac_word" >&5 +echo "configure:1157: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_BUILD_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1164,7 +1180,7 @@ fi fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:1168: checking how to run the C preprocessor" >&5 +echo "configure:1184: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -1179,13 +1195,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1189: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1205: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -1196,13 +1212,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1206: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1222: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -1227,7 +1243,7 @@ echo "$ac_t""$CPP" 1>&6 # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1231: checking for $ac_word" >&5 +echo "configure:1247: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1258,7 +1274,7 @@ fi # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1262: checking for $ac_word" >&5 +echo "configure:1278: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1289,7 +1305,7 @@ if test -n "$ac_tool_prefix"; then # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1293: checking for $ac_word" >&5 +echo "configure:1309: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1324,7 +1340,7 @@ fi # Extract the first word of "bash", so it can be a program name with args. set dummy bash; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1328: checking for $ac_word" >&5 +echo "configure:1344: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_BASH'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1361,7 +1377,7 @@ fi echo $ac_n "checking for signed size_t type""... $ac_c" 1>&6 -echo "configure:1365: checking for signed size_t type" >&5 +echo "configure:1381: checking for signed size_t type" >&5 if eval "test \"`echo '$''{'libc_cv_signed_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1385,12 +1401,12 @@ EOF fi echo $ac_n "checking for libc-friendly stddef.h""... $ac_c" 1>&6 -echo "configure:1389: checking for libc-friendly stddef.h" >&5 +echo "configure:1405: checking for libc-friendly stddef.h" >&5 if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1425: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* libc_cv_friendly_stddef=yes else @@ -1425,7 +1441,7 @@ override stddef.h = # The installed seems to be libc-friendly." fi echo $ac_n "checking whether we need to use -P to assemble .S files""... $ac_c" 1>&6 -echo "configure:1429: checking whether we need to use -P to assemble .S files" >&5 +echo "configure:1445: checking whether we need to use -P to assemble .S files" >&5 if eval "test \"`echo '$''{'libc_cv_need_minus_P'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1448,7 +1464,7 @@ asm-CPPFLAGS = -P # The assembler can't grok cpp's # line directives." fi echo $ac_n "checking for assembler global-symbol directive""... $ac_c" 1>&6 -echo "configure:1452: checking for assembler global-symbol directive" >&5 +echo "configure:1468: checking for assembler global-symbol directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_global_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1478,7 +1494,7 @@ EOF fi echo $ac_n "checking for .set assembler directive""... $ac_c" 1>&6 -echo "configure:1482: checking for .set assembler directive" >&5 +echo "configure:1498: checking for .set assembler directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_set_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1513,12 +1529,12 @@ fi if test $elf != yes; then echo $ac_n "checking for .init and .fini sections""... $ac_c" 1>&6 -echo "configure:1517: checking for .init and .fini sections" >&5 +echo "configure:1533: checking for .init and .fini sections" >&5 if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1547: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* libc_cv_have_initfini=yes else @@ -1553,19 +1569,19 @@ if test $elf = yes; then libc_cv_asm_underscores=no else echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6 -echo "configure:1557: checking for _ prefix on C symbol names" >&5 +echo "configure:1573: checking for _ prefix on C symbol names" >&5 if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1585: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* libc_cv_asm_underscores=yes else @@ -1593,7 +1609,7 @@ if test $elf = yes; then libc_cv_asm_weakext_directive=no else echo $ac_n "checking for assembler .weak directive""... $ac_c" 1>&6 -echo "configure:1597: checking for assembler .weak directive" >&5 +echo "configure:1613: checking for assembler .weak directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_weak_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1616,7 +1632,7 @@ echo "$ac_t""$libc_cv_asm_weak_directive" 1>&6 if test $libc_cv_asm_weak_directive = no; then echo $ac_n "checking for assembler .weakext directive""... $ac_c" 1>&6 -echo "configure:1620: checking for assembler .weakext directive" >&5 +echo "configure:1636: checking for assembler .weakext directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_weakext_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1653,7 +1669,7 @@ EOF fi echo $ac_n "checking for ld --no-whole-archive""... $ac_c" 1>&6 -echo "configure:1657: checking for ld --no-whole-archive" >&5 +echo "configure:1673: checking for ld --no-whole-archive" >&5 if eval "test \"`echo '$''{'libc_cv_ld_no_whole_archive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1664,7 +1680,7 @@ __throw () {} EOF if { ac_try='${CC-cc} $CFLAGS -nostdlib -nostartfiles -Wl,--no-whole-archive - -o conftest conftest.c'; { (eval echo configure:1668: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + -o conftest conftest.c'; { (eval echo configure:1684: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_ld_no_whole_archive=yes else libc_cv_ld_no_whole_archive=no @@ -1675,7 +1691,7 @@ fi echo "$ac_t""$libc_cv_ld_no_whole_archive" 1>&6 echo $ac_n "checking for gcc -fno-exceptions""... $ac_c" 1>&6 -echo "configure:1679: checking for gcc -fno-exceptions" >&5 +echo "configure:1695: checking for gcc -fno-exceptions" >&5 if eval "test \"`echo '$''{'libc_cv_gcc_no_exceptions'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1686,7 +1702,7 @@ __throw () {} EOF if { ac_try='${CC-cc} $CFLAGS -nostdlib -nostartfiles -fno-exceptions - -o conftest conftest.c'; { (eval echo configure:1690: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + -o conftest conftest.c'; { (eval echo configure:1706: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_gcc_no_exceptions=yes else libc_cv_gcc_no_exceptions=no @@ -1738,7 +1754,7 @@ if test "$uname" = generic; then fi echo $ac_n "checking OS release for uname""... $ac_c" 1>&6 -echo "configure:1742: checking OS release for uname" >&5 +echo "configure:1758: checking OS release for uname" >&5 if eval "test \"`echo '$''{'libc_cv_uname_release'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1760,7 +1776,7 @@ echo "$ac_t""$libc_cv_uname_release" 1>&6 uname_release="$libc_cv_uname_release" echo $ac_n "checking OS version for uname""... $ac_c" 1>&6 -echo "configure:1764: checking OS version for uname" >&5 +echo "configure:1780: checking OS version for uname" >&5 if eval "test \"`echo '$''{'libc_cv_uname_version'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1782,7 +1798,7 @@ else fi echo $ac_n "checking stdio selection""... $ac_c" 1>&6 -echo "configure:1786: checking stdio selection" >&5 +echo "configure:1802: checking stdio selection" >&5 case $stdio in libio) cat >> confdefs.h <<\EOF @@ -1910,7 +1926,7 @@ do echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.10.3" + echo "$CONFIG_STATUS generated by autoconf version 2.11" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; @@ -1999,10 +2015,10 @@ cat >> $CONFIG_STATUS <<\EOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. ac_file=1 # Number of current file. -ac_inc=90 # Lines per file. ac_beg=1 # First line for current file. -ac_end=$ac_inc # Line after last line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. ac_more_lines=: ac_sed_cmds="" while $ac_more_lines; do @@ -2022,7 +2038,7 @@ while $ac_more_lines; do fi ac_file=`expr $ac_file + 1` ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_inc` + ac_end=`expr $ac_end + $ac_max_sed_cmds` fi done if test -z "$ac_sed_cmds"; then @@ -2154,8 +2170,6 @@ EOF # Break up conftest.vals because some shells have a limit on # the size of here documents, and old seds have small limits too. -# Maximum number of lines to put in a single here document. -ac_max_here_lines=12 rm -f conftest.tail while : diff --git a/configure.in b/configure.in index ec2b5a1e3a..4a3f663cb5 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,6 @@ Dnl Process this file with autoconf to produce a configure script. AC_REVISION([$CVSid$]) -AC_PREREQ(2.10.2)dnl dnl Minimum Autoconf version required. +AC_PREREQ(2.11)dnl dnl Minimum Autoconf version required. AC_INIT(features.h) AC_CONFIG_HEADER(config.h) @@ -85,6 +85,20 @@ if test x"$add_ons" != x; then fi AC_CANONICAL_HOST + +# The way shlib-versions is used to generate soversions.mk uses a +# fairly simplistic model for name recognition that can't distinguish +# i486-pc-linux-gnu fully from i486-pc-gnu. So we mutate a $host_os +# of `gnu*' here to be `gnu-gnu*' just so that shlib-versions can +# tell. This doesn't get used much beyond that, so it's fairly safe. +case "$host_os" in +linux*) + ;; +gnu*) + host_os=`echo $host_os | sed -e 's/gnu/gnu-gnu/'` + ;; +esac + # We keep the original values in `$config_*' and never modify them, so we # can write them unchanged into config.make. Everything else uses # $machine, $vendor, and $os, and changes them whenever convenient. @@ -332,7 +346,7 @@ AC_MSG_RESULT(sysdeps/generic sysdeps/stub) AC_PROG_INSTALL if test "$INSTALL" = "${srcdir}/install-sh -c"; then # The makefiles need to use a different form to find it in $srcdir. - INSTALL="$(..)./install-sh -c" + INSTALL='$(..)./install-sh -c' fi AC_PROG_LN_S AC_CHECK_PROGS(MSGFMT, msgfmt gmsgfmt, :) diff --git a/csu/initfini.c b/csu/initfini.c index f816e08169..dc78e84c2d 100644 --- a/csu/initfini.c +++ b/csu/initfini.c @@ -1,21 +1,30 @@ /* Special .init and .fini section support. -Copyright (C) 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + Copyright (C) 1995, 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it + and/or modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Library General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The Libraty General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + The GNU C Library is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty + of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ /* This file is compiled into assembly code which is then surrounded by the lines `cat > crtcommon.tmp <<\EOF_common' and `EOF_common' and thus diff --git a/elf/dl-deps.c b/elf/dl-deps.c index 115982f375..01e4f1974e 100644 --- a/elf/dl-deps.c +++ b/elf/dl-deps.c @@ -53,8 +53,9 @@ _dl_map_object_deps (struct link_map *map, preloads[nlist]->l_reserved = 1; } - /* Terminate the list. */ + /* Terminate the lists. */ head[nlist].next = NULL; + duphead.next = NULL; /* Start here for adding dependencies to the list. */ tailp = &head[nlist++]; diff --git a/gnu-versions.h b/gnu-versions.h index 15b07999dd..6cb5c70dec 100644 --- a/gnu-versions.h +++ b/gnu-versions.h @@ -44,7 +44,7 @@ remember, if any of these versions change, the libc.so major version number must change too (so avoid it)! */ -#define _GNU_OBSTACK_INTERFACE_VERSION 1 /* vs malloc/obstack.c */ +#define _GNU_OBSTACK_INTERFACE_VERSION 2 /* vs malloc/obstack.c */ #define _GNU_REGEX_INTERFACE_VERSION 1 /* vs posix/regex.c */ #define _GNU_GLOB_INTERFACE_VERSION 1 /* vs posix/glob.c */ diff --git a/io/fstat.c b/io/fstat.c index 60dd2f002d..63341555ad 100644 --- a/io/fstat.c +++ b/io/fstat.c @@ -1,20 +1,29 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + In addition to the permissions in the GNU Library General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The Libraty General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include diff --git a/io/lstat.c b/io/lstat.c index f2ab6bc7a1..84be8f7bfd 100644 --- a/io/lstat.c +++ b/io/lstat.c @@ -1,20 +1,29 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + In addition to the permissions in the GNU Library General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The Libraty General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include diff --git a/io/mknod.c b/io/mknod.c index 95ebe5a6d2..b5d51a203c 100644 --- a/io/mknod.c +++ b/io/mknod.c @@ -1,20 +1,30 @@ /* Copyright (C) 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + In addition to the permissions in the GNU Library General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The Libraty General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + #include #include diff --git a/io/stat.c b/io/stat.c index 007fdf0dd6..faadce862c 100644 --- a/io/stat.c +++ b/io/stat.c @@ -1,20 +1,29 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + In addition to the permissions in the GNU Library General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The Libraty General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include diff --git a/libio/libio.h b/libio/libio.h index 0cd6b39c24..7dd47db9fa 100644 --- a/libio/libio.h +++ b/libio/libio.h @@ -303,6 +303,9 @@ extern int _IO_vfprintf __P((_IO_FILE*, const char*, _IO_va_list)); extern _IO_ssize_t _IO_padn __P((_IO_FILE *, int, _IO_ssize_t)); extern _IO_size_t _IO_sgetn __P((_IO_FILE *, void*, _IO_size_t)); +extern _IO_fpos_t _IO_seekoff __P((_IO_FILE*, _IO_off_t, int, int)); +extern _IO_fpos_t _IO_seekpos __P((_IO_FILE*, _IO_fpos_t, int)); + extern void _IO_free_backup_area __P((_IO_FILE*)); #ifdef __cplusplus diff --git a/libio/strfile.h b/libio/strfile.h index 55783bb5c1..4934a06e3c 100644 --- a/libio/strfile.h +++ b/libio/strfile.h @@ -1,4 +1,4 @@ -/* +/* Copyright (C) 1993 Free Software Foundation This file is part of the GNU IO Library. This library is free @@ -32,8 +32,6 @@ typedef void (*_IO_free_type) __P((void*)); struct _IO_str_fields { - /* The current length is max(_len, _IO_write_ptr-_IO_write_base). */ - _IO_size_t _len; _IO_alloc_type _allocate_buffer; _IO_free_type _free_buffer; }; diff --git a/libio/strops.c b/libio/strops.c index 464063322d..8a6c56d055 100644 --- a/libio/strops.c +++ b/libio/strops.c @@ -26,7 +26,31 @@ the executable file might be covered by the GNU General Public License. */ #include "libioP.h" #include -#define LEN(fp) (((_IO_strfile*)(fp))->_s._len) +#if 0 +/* The following definitions are for exposition only. + They map the terminlogy used in the ANSI/ISO C++ draft standard + to the implementation. */ + +/* allocated: set when a dynamic array object has been allocated, and + hence should be freed by the destructor for the strstreambuf object. */ +#define ALLOCATED(FP) ((FP)->_f._IO_buf_base && DYNAMIC(FP)) + +/* constant: set when the array object has const elements, + so the output sequence cannot be written. */ +#define CONSTANT(FP) ((FP)->_f._IO_file_flags & _IO_NO_WRITES) + +/* alsize: the suggested minimum size for a dynamic array object. */ +#define ALSIZE(FP) ??? /* not stored */ + +/* palloc: points to the function to call to allocate a dynamic array object.*/ +#define PALLOC(FP) \ + ((FP)->_s._allocate_buffer == default_alloc ? 0 : (FP)->_s._allocate_buffer) + +/* pfree: points to the function to call to free a dynamic array object. */ +#define PFREE(FP) \ + ((FP)->_s._free_buffer == default_free ? 0 : (FP)->_s._free_buffer) + +#endif #ifdef TODO /* An "unbounded buffer" is when a buffer is supplied, but with no @@ -44,27 +68,17 @@ DEFUN(_IO_str_init_static, (fp, ptr, size, pstart), { /* If size is negative 'the characters are assumed to continue indefinitely.' This is kind of messy ... */ -#if 1 int s; size = 512; - /* Try increasing powers of 2, as long as we don't wrap around. - This can lose in pathological cases (ptr near the end - of the address space). A better solution might be to - adjust the size on underflow/overflow. FIXME. */ - for ( ; s = 2*size, s > 0 && ptr + s > ptr && s < 0x4000000L; ) + /* Try increasing powers of 2, as long as we don't wrap around. */ + for (; s = 2*size, s > 0 && ptr + s > ptr && s < 0x4000000L; ) size = s; - size = s; -#else - /* The following semi-portable kludge assumes that - sizeof(unsigned long) == sizeof(char*). Hence, - (unsigned long)(-1) should be the largest possible address. */ - unsigned long highest = (unsigned long)(-1); - /* Pointers are signed on some brain-damaged systems, in - which case we divide by two to get the maximum signed address. */ - if ((char*)highest < ptr) - highest >>= 1; - size = (char*)highest - ptr; -#endif + /* Try increasing size as much as we can without wrapping around. */ + for (s = size >> 1; s > 0; s >>= 1) + { + if (ptr + size + s > ptr) + size += s; + } } _IO_setb(fp, ptr, ptr+size, 0); @@ -83,7 +97,6 @@ DEFUN(_IO_str_init_static, (fp, ptr, size, pstart), fp->_IO_write_end = ptr; fp->_IO_read_end = ptr+size; } - LEN(fp) = size; /* A null _allocate_buffer function flags the strfile as being static. */ (((_IO_strfile*)(fp))->_s._allocate_buffer) = (_IO_alloc_type)0; } @@ -101,34 +114,25 @@ DEFUN(_IO_str_overflow, (fp, c), register _IO_FILE* fp AND int c) { int flush_only = c == EOF; - _IO_size_t pos = fp->_IO_write_ptr - fp->_IO_write_base; - _IO_size_t get_pos = fp->_IO_read_ptr - fp->_IO_read_base; + _IO_size_t pos; if (fp->_flags & _IO_NO_WRITES) return flush_only ? 0 : EOF; - if (pos > LEN(fp)) LEN(fp) = pos; if ((fp->_flags & _IO_TIED_PUT_GET) && !(fp->_flags & _IO_CURRENTLY_PUTTING)) { - pos = get_pos; fp->_flags |= _IO_CURRENTLY_PUTTING; - get_pos = LEN(fp); + fp->_IO_write_ptr = fp->_IO_read_ptr; + fp->_IO_read_ptr = fp->_IO_read_end; } - if (pos >= (_IO_size_t) (_IO_blen(fp) + flush_only)) + pos = fp->_IO_write_ptr - fp->_IO_write_base; + if (pos >= _IO_blen(fp) + flush_only) { if (fp->_flags & _IO_USER_BUF) /* not allowed to enlarge */ - { -#ifdef TODO - if (indefinite size) - { - fp->_IO_buf_end += 512; - } - else -#endif - return EOF; - } + return EOF; else { char *new_buf; - _IO_size_t new_size = 2 * _IO_blen(fp); + char *old_buf = fp->_IO_buf_base; + _IO_size_t new_size = 2 * _IO_blen(fp) + 100; new_buf = (char*)(*((_IO_strfile*)fp)->_s._allocate_buffer)(new_size); if (new_buf == NULL) @@ -136,31 +140,32 @@ DEFUN(_IO_str_overflow, (fp, c), /* __ferror(fp) = 1; */ return EOF; } - memcpy(new_buf, fp->_IO_buf_base, _IO_blen(fp)); -#if 0 - if (lenp == &LEN(fp)) /* use '\0'-filling */ - memset(new_buf + pos, 0, blen() - pos); -#endif if (fp->_IO_buf_base) { + memcpy(new_buf, old_buf, _IO_blen(fp)); (*((_IO_strfile*)fp)->_s._free_buffer)(fp->_IO_buf_base); /* Make sure _IO_setb won't try to delete _IO_buf_base. */ fp->_IO_buf_base = NULL; } +#if 0 + if (lenp == &LEN(fp)) /* use '\0'-filling */ + memset(new_buf + pos, 0, blen() - pos); +#endif _IO_setb(fp, new_buf, new_buf + new_size, 1); + fp->_IO_read_base = new_buf + (fp->_IO_read_base - old_buf); + fp->_IO_read_ptr = new_buf + (fp->_IO_read_ptr - old_buf); + fp->_IO_read_end = new_buf + (fp->_IO_read_end - old_buf); + fp->_IO_write_ptr = new_buf + (fp->_IO_write_ptr - old_buf); + fp->_IO_write_base = new_buf; + fp->_IO_write_end = fp->_IO_buf_end; } - fp->_IO_write_end = fp->_IO_buf_end; } - fp->_IO_write_ptr = fp->_IO_buf_base + pos; - - fp->_IO_read_base = fp->_IO_buf_base; - fp->_IO_read_ptr = fp->_IO_buf_base + get_pos; - fp->_IO_read_end = fp->_IO_buf_base + LEN(fp); - if (!flush_only) *fp->_IO_write_ptr++ = (unsigned char) c; + if (fp->_IO_write_ptr > fp->_IO_read_end) + fp->_IO_read_end = fp->_IO_write_ptr; return c; } @@ -168,28 +173,29 @@ int DEFUN(_IO_str_underflow, (fp), register _IO_FILE* fp) { - _IO_size_t ppos = fp->_IO_write_ptr - fp->_IO_write_base; - if (ppos > LEN(fp)) LEN(fp) = ppos; + if (fp->_IO_write_ptr > fp->_IO_read_end) + fp->_IO_read_end = fp->_IO_write_ptr; if ((fp->_flags & _IO_TIED_PUT_GET) && (fp->_flags & _IO_CURRENTLY_PUTTING)) { fp->_flags &= ~_IO_CURRENTLY_PUTTING; + fp->_IO_read_ptr = fp->_IO_write_ptr; fp->_IO_write_ptr = fp->_IO_write_end; } - fp->_IO_read_end = fp->_IO_read_base + LEN(fp); if (fp->_IO_read_ptr < fp->_IO_read_end) return *fp->_IO_read_ptr; else return EOF; } +/* The size of the valid part of the buffer. */ + _IO_ssize_t DEFUN(_IO_str_count, (fp), register _IO_FILE *fp) { - _IO_ssize_t put_len = fp->_IO_write_ptr - fp->_IO_write_base; - if (put_len < (_IO_ssize_t) LEN(fp)) - put_len = LEN(fp); - return put_len; + return (fp->_IO_write_ptr > fp->_IO_read_end ? fp->_IO_write_ptr + : fp->_IO_read_end) + - fp->_IO_read_base; } _IO_pos_t @@ -236,7 +242,6 @@ DEFUN(_IO_str_seekoff, (fp, offset, dir, mode), } if (offset < 0 || (_IO_ssize_t)offset > cur_size) return EOF; - LEN(fp) = cur_size; fp->_IO_write_ptr = fp->_IO_write_base + offset; new_pos = offset; } diff --git a/login/Makefile b/login/Makefile index 247ab958df..da47089b5a 100644 --- a/login/Makefile +++ b/login/Makefile @@ -12,9 +12,9 @@ # Library General Public License for more details. # You should have received a copy of the GNU Library General Public -# License along with the GNU C Library; see the file COPYING.LIB. If -# not, write to the Free Software Foundation, Inc., -# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# License along with the GNU C Library; see the file COPYING.LIB. If not, +# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. # # Sub-makefile for login portion of the library. @@ -24,9 +24,10 @@ subdir := login headers := utmp.h utmpbits.h lastlog.h pty.h -routines := setutent endutent getutent getutid getutline pututline \ - setutent_r endutent_r getutent_r getutid_r getutline_r \ - pututline_r +routines := getutent getutent_r getutid getutline getutid_r getutline_r \ + utmp_file utmp_db + +distribtue := utmp-private.h # Build the -lutil library with these extra functions. extra-libs := libutil diff --git a/login/getutent.c b/login/getutent.c index 03b49dbf7e..e9462db18d 100644 --- a/login/getutent.c +++ b/login/getutent.c @@ -1,27 +1,27 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper , 1996. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1996. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include -/* The global data defined in setutent.c. */ -extern struct utmp_data __utmp_data; +/* Local buffer to store the result. */ +static struct utmp buffer; struct utmp * @@ -29,7 +29,7 @@ getutent (void) { struct utmp *result; - if (__getutent_r (&result, &__utmp_data) < 0) + if (__getutent_r (&buffer, &result) < 0) return NULL; return result; diff --git a/login/getutent_r.c b/login/getutent_r.c index e3550017f9..df9a7977ab 100644 --- a/login/getutent_r.c +++ b/login/getutent_r.c @@ -1,51 +1,196 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper , 1996. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper + and Paul Janzen , 1996. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ -#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include +#include "utmp-private.h" +#include "../elf/link.h" -int -__getutent_r (struct utmp **utmp, struct utmp_data *utmp_data) + +/* The various backends we have. */ +static int __setutent_unknown (int reset); +static int __getutent_r_unknown (struct utmp *buffer, struct utmp **result); +static void __pututline_unknown (const struct utmp *data); +static void __endutent_unknown (void); + + +/* We have three jump tables: unknown, db, or file. */ +static struct utfuncs unknown_functions = +{ + __setutent_unknown, + __getutent_r_unknown, + NULL, + NULL, + __pututline_unknown, + __endutent_unknown, + NULL +}; + +/* Currently selected backend. */ +struct utfuncs *__libc_utmp_jump_table = &unknown_functions; + +/* The tables from the services. */ +extern struct utfuncs __libc_utmp_db_functions; +extern struct utfuncs __libc_utmp_file_functions; + + +/* We need to protect the opening of the file. */ +__libc_lock_define_initialized (, __libc_utmp_lock) + +void +__setutent (void) +{ + __libc_lock_lock (__libc_utmp_lock); + + (void) (*__libc_utmp_jump_table->setutent) (1); + + __libc_lock_unlock (__libc_utmp_lock); +} +weak_alias (__setutent, setutent) + + +static int +__setutent_unknown (int reset) { - /* Open utmp file if not already done. */ - if (utmp_data->ut_fd == -1) + /* We have to test whether it is still not decided which backend to use. */ + assert (__libc_utmp_jump_table == &unknown_functions); + + /* See whether utmp db file exists. */ + if ((*__libc_utmp_db_functions.setutent) (reset)) + __libc_utmp_jump_table = &__libc_utmp_db_functions; + else { - setutent_r (utmp_data); - if (utmp_data->ut_fd == -1) - return -1; + /* Either the db file does not exist or we have other + problems. So use the normal file. */ + (*__libc_utmp_file_functions.setutent) (reset); + __libc_utmp_jump_table = &__libc_utmp_file_functions; } - /* Position file correctly. */ - if (lseek (utmp_data->ut_fd, utmp_data->loc_utmp, SEEK_SET) == -1) - return -1; + return 0; +} + - /* Read the next entry. */ - if (read (utmp_data->ut_fd, &utmp_data->ubuf, sizeof (struct utmp)) - != sizeof (struct utmp)) - return -1; +void +__endutent (void) +{ + __libc_lock_lock (__libc_utmp_lock); + + (*__libc_utmp_jump_table->endutent) (); - /* Update position pointer. */ - utmp_data->loc_utmp += sizeof (struct utmp); + __libc_lock_unlock (__libc_utmp_lock); +} +weak_alias (__endutent, endutent) - *utmp = &utmp_data->ubuf; - return 0; +static void +__endutent_unknown (void) +{ + /* Huh, how do we came here? Nothing to do. */ +} + + +int +__getutent_r (struct utmp *buffer, struct utmp **result) +{ + int retval; + + __libc_lock_lock (__libc_utmp_lock); + + retval = (*__libc_utmp_jump_table->getutent_r) (buffer, result); + + __libc_lock_unlock (__libc_utmp_lock); + + return retval; } weak_alias (__getutent_r, getutent_r) + + +static int +__getutent_r_unknown (struct utmp *buffer, struct utmp **result) +{ + /* It is not yet initialized. */ + __setutent_unknown (0); + + return (*__libc_utmp_jump_table->getutent_r) (buffer, result); +} + + +void +__pututline (const struct utmp *data) +{ + __libc_lock_lock (__libc_utmp_lock); + + (*__libc_utmp_jump_table->pututline) (data); + + __libc_lock_unlock (__libc_utmp_lock); +} + + +static void +__pututline_unknown (const struct utmp *data) +{ + /* It is not yet initialized. */ + __setutent_unknown (0); + + (*__libc_utmp_jump_table->pututline) (data); +} + + +int +__utmpname (const char *file) +{ + int result = -1; + + __libc_lock_lock (__libc_utmp_lock); + + /* Close the old file. */ + (*__libc_utmp_jump_table->endutent) (); + + /* Store new names. */ + if ((*__libc_utmp_file_functions.utmpname) (file) == 0 + && !(*__libc_utmp_db_functions.utmpname) (file) == 0) + { + /* Try to find out whether we are supposed to work with a db + file or not. Do this by looking for the extension ".db". */ + const char *ext = strrchr (file, '.'); + + if (ext != NULL && strcmp (ext, ".db") == 0) + __libc_utmp_jump_table = &__libc_utmp_db_functions; + else + __libc_utmp_jump_table = &unknown_functions; + + result = 0; + } + + __libc_lock_unlock (__libc_utmp_lock); + + return result; +} +weak_alias (__utmpname, utmpname) diff --git a/login/getutid.c b/login/getutid.c index 64ced6aeea..d3d3b5d068 100644 --- a/login/getutid.c +++ b/login/getutid.c @@ -1,27 +1,27 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper , 1996. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1996. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include -/* The global data defined in setutent.c. */ -extern struct utmp_data __utmp_data; +/* Local buffer to store the result. */ +static struct utmp buffer; struct utmp * @@ -29,8 +29,8 @@ getutid (const struct utmp *id) { struct utmp *result; - if (__getutid_r (id, &result, &__utmp_data) < 0) + if (__getutid_r (id, &buffer, &result) < 0) return NULL; - return (struct utmp *) result; + return result; } diff --git a/login/getutid_r.c b/login/getutid_r.c index 81070157a4..52b83cd862 100644 --- a/login/getutid_r.c +++ b/login/getutid_r.c @@ -1,35 +1,45 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper , 1996. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper + and Paul Janzen , 1996. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include +#include #include #include #include +#include "utmp-private.h" + + +/* We have to use the lock in getutent_r.c. */ +__libc_lock_define (extern, __libc_utmp_lock) + +/* The jump table is also in getutent_r.c. */ +extern struct utfuncs *__libc_utmp_jump_table; + -/* For implementing this function we don't use the getutent_r function - because we can avoid the reposition on every new entry this way. */ int -__getutid_r (const struct utmp *id, struct utmp **utmp, - struct utmp_data *utmp_data) +__getutid_r (const struct utmp *id, struct utmp *buffer, struct utmp **result) { #if (_HAVE_UT_ID - 0) && (_HAVE_UT_TYPE - 0) + int retval = -1; + /* Test whether ID has any of the legal types. */ if (id->ut_type != RUN_LVL && id->ut_type != BOOT_TIME && id->ut_type != OLD_TIME && id->ut_type != NEW_TIME @@ -38,77 +48,21 @@ __getutid_r (const struct utmp *id, struct utmp **utmp, /* No, using '<' and '>' for the test is not possible. */ { __set_errno (EINVAL); + *result = NULL; return -1; } - /* Open utmp file if not already done. */ - if (utmp_data->ut_fd == -1) - { - setutent_r (utmp_data); - if (utmp_data->ut_fd == -1) - return -1; - } - - /* Position file correctly. */ - if (lseek (utmp_data->ut_fd, utmp_data->loc_utmp, SEEK_SET) == -1) - return -1; - - if (id->ut_type == RUN_LVL || id->ut_type == BOOT_TIME - || id->ut_type == OLD_TIME || id->ut_type == NEW_TIME) - { - /* Search for next entry with type RUN_LVL, BOOT_TIME, - OLD_TIME, or NEW_TIME. */ - - while (1) - { - /* Read the next entry. */ - if (read (utmp_data->ut_fd, &utmp_data->ubuf, sizeof (struct utmp)) - != sizeof (struct utmp)) - { - utmp_data->loc_utmp = 0; /* Mark loc_utmp invalid. */ - __set_errno (ESRCH); - return -1; - } - - /* Update position pointer. */ - utmp_data->loc_utmp += sizeof (struct utmp); + __libc_lock_lock (__libc_utmp_lock); - if (id->ut_type == utmp_data->ubuf.ut_type) - break; - } - } + /* Not yet initialized. */ + if ((*__libc_utmp_jump_table->setutent) (0)) + retval = (*__libc_utmp_jump_table->getutid_r) (id, buffer, result); else - { - /* Search for the next entry with the specified ID and with type - INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS, or DEAD_PROCESS. */ - - while (1) - { - /* Read the next entry. */ - if (read (utmp_data->ut_fd, &utmp_data->ubuf, sizeof (struct utmp)) - != sizeof (struct utmp)) - { - utmp_data->loc_utmp = 0; /* Mark loc_utmp invalid. */ - __set_errno (ESRCH); - return -1; - } - - /* Update position pointer. */ - utmp_data->loc_utmp += sizeof (struct utmp); - - if (( utmp_data->ubuf.ut_type == INIT_PROCESS - || utmp_data->ubuf.ut_type == LOGIN_PROCESS - || utmp_data->ubuf.ut_type == USER_PROCESS - || utmp_data->ubuf.ut_type == DEAD_PROCESS) - && (strncmp (utmp_data->ubuf.ut_id, id->ut_id, sizeof id->ut_id) - == 0)) - break; - } - } + *result = NULL; - *utmp = &utmp_data->ubuf; + __libc_lock_unlock (__libc_utmp_lock); - return 0; + return retval; #else /* !_HAVE_UT_ID && !_HAVE_UT_TYPE */ __set_errno (ENOSYS); return -1; diff --git a/login/getutline.c b/login/getutline.c index c21f81745b..16a02f6e89 100644 --- a/login/getutline.c +++ b/login/getutline.c @@ -1,27 +1,27 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper , 1996. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1996. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include -/* The global data defined in setutent.c. */ -extern struct utmp_data __utmp_data; +/* Local buffer to store the result. */ +static struct utmp buffer; struct utmp * @@ -29,8 +29,8 @@ getutline (const struct utmp *line) { struct utmp *result; - if (__getutline_r (line, &result, &__utmp_data) < 0) + if (__getutline_r (line, &buffer, &result) < 0) return NULL; - return (struct utmp *) result; + return result; } diff --git a/login/getutline_r.c b/login/getutline_r.c index e88267decb..2285248ece 100644 --- a/login/getutline_r.c +++ b/login/getutline_r.c @@ -1,74 +1,55 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper , 1996. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper + and Paul Janzen , 1996. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include +#include #include #include #include +#include "utmp-private.h" -/* For implementing this function we don't use the getutent_r function - because we can avoid the reposition on every new entry this way. */ -int -__getutline_r (const struct utmp *line, struct utmp **utmp, - struct utmp_data *utmp_data) -{ - /* Open utmp file if not already done. */ - if (utmp_data->ut_fd == -1) - { - __setutent_r (utmp_data); - if (utmp_data->ut_fd == -1) - return -1; - } - /* Position file correctly. */ - if (lseek (utmp_data->ut_fd, utmp_data->loc_utmp, SEEK_SET) == -1) - return -1; +/* We have to use the lock in getutent_r.c. */ +__libc_lock_define (extern, __libc_utmp_lock) + +/* The jump table is also in getutent_r.c. */ +extern struct utfuncs *__libc_utmp_jump_table; - while (1) - { - /* Read the next entry. */ - if (read (utmp_data->ut_fd, &utmp_data->ubuf, sizeof (struct utmp)) - != sizeof (struct utmp)) - { - utmp_data->loc_utmp = 0; /* Mark UTMP_DATA->ubuf invalid. */ - __set_errno (ESRCH); - return -1; - } - /* Update position pointer. */ - utmp_data->loc_utmp += sizeof (struct utmp); +int +__getutline_r (const struct utmp *line, struct utmp *buffer, + struct utmp **result) +{ + int retval = -1; + + __libc_lock_lock (__libc_utmp_lock); - if ( -#if _HAVE_UT_TYPE - 0 - (utmp_data->ubuf.ut_type == USER_PROCESS - || utmp_data->ubuf.ut_type == LOGIN_PROCESS) - && -#endif - ! strncmp (line->ut_line, utmp_data->ubuf.ut_line, - sizeof line->ut_line)) - /* Stop if we found a user or login entry. */ - break; - } + /* Not yet initialized. */ + if ((*__libc_utmp_jump_table->setutent) (0)) + retval = (*__libc_utmp_jump_table->getutline_r) (line, buffer, result); + else + *result = NULL; - *utmp = &utmp_data->ubuf; + __libc_lock_unlock (__libc_utmp_lock); - return 0; + return retval; } weak_alias (__getutline_r, getutline_r) diff --git a/login/login.c b/login/login.c index 00b176a104..7cbe8b603e 100644 --- a/login/login.c +++ b/login/login.c @@ -1,21 +1,21 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper , 1996. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1996. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include #include @@ -43,8 +43,8 @@ tty_name (int fd, char **tty, size_t buf_len) rv = ttyname_r (fd, buf, buf_len); if (rv < 0 || memchr (buf, '\0', buf_len)) - /* We either got an error, or we succeeded and the returned name fit - in the buffer. */ + /* We either got an error, or we succeeded and the + returned name fit in the buffer. */ break; /* Try again with a longer buffer. */ @@ -68,9 +68,9 @@ tty_name (int fd, char **tty, size_t buf_len) } if (rv == 0) - *tty = buf; /* Return buffer to the user. */ + *tty = buf; /* Return buffer to the user. */ else if (buf != *tty) - free (buf); /* Free what we malloced when returning an error. */ + free (buf); /* Free what we malloced when returning an error. */ return rv; } @@ -86,8 +86,8 @@ login (const struct utmp *ut) char *tty = _tty; int found_tty; const char *ttyp; - struct utmp_data data = { -1 }; struct utmp copy = *ut; + struct utmp utbuf; /* Fill in those fields we supply. */ #if _HAVE_UT_TYPE - 0 @@ -118,26 +118,16 @@ login (const struct utmp *ut) struct utmp *old; /* Open UTMP file. */ - setutent_r (&data); + setutent (); /* Read the record. */ - if (getutline_r (©, &old, &data) >= 0) - { -#if _HAVE_UT_TYPE - 0 - /* We have to fake the old entry because this `login' - function does not fit well into the UTMP file - handling scheme. */ - old->ut_type = copy.ut_type; -#endif - pututline_r (©, &data); - } - else if (errno == ESRCH) - /* We didn't find anything. pututline_r will add UT at the end - of the file in this case. */ - pututline_r (©, &data); + getutline_r (©, &utbuf, &old); + + /* Write the entry. */ + pututline (©); /* Close UTMP file. */ - endutent_r (&data); + endutent (); } if (tty != _tty) @@ -147,23 +137,18 @@ login (const struct utmp *ut) /* Update the WTMP file. Here we have to add a new entry. */ if (utmpname (_PATH_WTMP) != 0) { + struct utmp *up; + /* Open the WTMP file. */ - setutent_r (&data); + setutent (); /* Position at end of file. */ - data.loc_utmp = lseek (data.ut_fd, 0, SEEK_END); - if (data.loc_utmp != -1) - { -#if _HAVE_UT_TYPE - 0 - /* We have to fake the old entry because this `login' - function does not fit well into the UTMP file handling - scheme. */ - data.ubuf.ut_type = copy.ut_type; -#endif - pututline_r (©, &data); - } + while (! getutent_r (&utbuf, &up)); + + /* Write the new entry. */ + pututline (©); /* Close WTMP file. */ - endutent_r (&data); + endutent (); } } diff --git a/login/logout.c b/login/logout.c index 8575512e0e..3e625486f6 100644 --- a/login/logout.c +++ b/login/logout.c @@ -25,8 +25,7 @@ Boston, MA 02111-1307, USA. */ int logout (const char *line) { - struct utmp_data data = { ut_fd: -1 }; - struct utmp tmp; + struct utmp tmp, utbuf; struct utmp *ut; int result = 0; @@ -35,7 +34,7 @@ logout (const char *line) return 0; /* Open UTMP file. */ - setutent_r (&data); + setutent (); /* Fill in search information. */ #if _HAVE_UT_TYPE - 0 @@ -44,7 +43,7 @@ logout (const char *line) strncpy (tmp.ut_line, line, sizeof tmp.ut_line); /* Read the record. */ - if (getutline_r (&tmp, &ut, &data) >= 0) + if (getutline_r (&tmp, &utbuf, &ut) >= 0) { /* Clear information about who & from where. */ bzero (ut->ut_name, sizeof ut->ut_name); @@ -57,12 +56,12 @@ logout (const char *line) time (&ut->ut_time); #endif - if (pututline_r (ut, &data) >= 0) + if (pututline (ut) >= 0) result = 1; } /* Close UTMP file. */ - endutent_r (&data); + endutent (); return result; } diff --git a/login/logwtmp.c b/login/logwtmp.c index 17c900181f..0d5e48e51f 100644 --- a/login/logwtmp.c +++ b/login/logwtmp.c @@ -1,21 +1,21 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper , 1996. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1996. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include #include diff --git a/login/utmp-private.h b/login/utmp-private.h new file mode 100644 index 0000000000..4825ae3f6d --- /dev/null +++ b/login/utmp-private.h @@ -0,0 +1,41 @@ +/* Internal definitions and declarations for UTMP functions. + Copyright (C) 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper + and Paul Janzen , 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _UTMP_PRIVATE_H +#define _UTMP_PRIVATE_H 1 + +#include + +/* The extra `int' argument for each function shows whether locking is + wanted or not. */ +struct utfuncs +{ + int (*setutent) (int); + int (*getutent_r) (struct utmp *, struct utmp **); + int (*getutid_r) (const struct utmp *, struct utmp *, struct utmp **); + int (*getutline_r) (const struct utmp *, struct utmp *, struct utmp **); + struct utmp *(*pututline) (const struct utmp *); + void (*endutent) (void); + int (*utmpname) (const char *); + +}; + +#endif /* utmp-private.h */ diff --git a/login/utmp.h b/login/utmp.h index 6786190aad..87f822d9c3 100644 --- a/login/utmp.h +++ b/login/utmp.h @@ -58,9 +58,11 @@ extern int utmpname __P ((__const char *__file)); extern struct utmp *getutent __P ((void)); /* Rest the input stream to the beginning of the file. */ +extern void __setutent __P ((void)); extern void setutent __P ((void)); /* Close the current open file. */ +extern void __endutent __P ((void)); extern void endutent __P ((void)); /* Search forward from the current point in the utmp file until the @@ -76,42 +78,19 @@ extern struct utmp *pututline __P ((__const struct utmp *__utmp_ptr)); #ifdef __USE_REENTRANT -/* Define the data structure needed for the reentrant version. */ -struct utmp_data -{ - int ut_fd; - off_t loc_utmp; - struct utmp ubuf; -}; - - /* Reentrant versions of the file for handling utmp files. */ -extern int __getutent_r __P ((struct utmp **__utmp, - struct utmp_data *__utmp_data)); -extern int getutent_r __P ((struct utmp **__utmp, - struct utmp_data *__utmp_data)); - -extern void __setutent_r __P ((struct utmp_data *__utmp_data)); -extern void setutent_r __P ((struct utmp_data *__utmp_data)); - -extern void __endutent_r __P ((struct utmp_data *__utmp_data)); -extern void endutent_r __P ((struct utmp_data *__utmp_data)); +extern int __getutent_r __P ((struct utmp *__buffer, struct utmp **__result)); +extern int getutent_r __P ((struct utmp *__buffer, struct utmp **__result)); -extern int __getutid_r __P ((__const struct utmp *__id, struct utmp **__utmp, - struct utmp_data *__utmp_data)); -extern int getutid_r __P ((__const struct utmp *__id, struct utmp **__utmp, - struct utmp_data *__utmp_data)); +extern int __getutid_r __P ((__const struct utmp *__id, struct utmp *__buffer, + struct utmp **__result)); +extern int getutid_r __P ((__const struct utmp *__id, struct utmp *__buffer, + struct utmp **__result)); extern int __getutline_r __P ((__const struct utmp *__line, - struct utmp **__utmp, - struct utmp_data *__utmp_data)); -extern int getutline_r __P ((__const struct utmp *__line, struct utmp **__utmp, - struct utmp_data *__utmp_data)); - -extern int __pututline_r __P ((__const struct utmp *__utmp_ptr, - struct utmp_data *__utmp_data)); -extern int pututline_r __P ((__const struct utmp *__utmp_ptr, - struct utmp_data *__utmp_data)); + struct utmp *__buffer, struct utmp **__result)); +extern int getutline_r __P ((__const struct utmp *__line, + struct utmp *__buffer, struct utmp **__result)); #endif /* Use reentrant. */ diff --git a/login/utmp_db.c b/login/utmp_db.c new file mode 100644 index 0000000000..2c5baf6592 --- /dev/null +++ b/login/utmp_db.c @@ -0,0 +1,102 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper + and Paul Janzen , 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "utmp-private.h" + + +/* This is the default name. */ +static const char default_file_name[] = _PATH_UTMP_DB; + +/* Current file name. */ +static const char *file_name = (const char *) default_file_name; + +/* Descriptor for database. */ +static DB *db_fd; +static char last_date[16]; + + +/* Our local functions. */ +static int setutent_db (int reset); +static void endutent_db (void); +static int utmpname_db (const char *name); + + +/* The jump table for the local functions. */ +struct utfuncs __libc_utmp_db_functions = +{ + setutent_db, + NULL, + NULL, + NULL, + NULL, + endutent_db, + utmpname_db +}; + + +static int +setutent_db (int reset) +{ + return 0; +} + + +static void +endutent_db (void) +{ +} + + +static int +utmpname_db (const char *name) +{ + if (strcmp (name, file_name) != 0) + { + if (strcmp (name, default_file_name) == 0) + { + if (file_name != default_file_name) + free ((char *) file_name); + + file_name = default_file_name; + } + else + { + char *new_name = __strdup (name); + if (new_name == NULL) + /* Out of memory. */ + return -1; + + if (file_name != default_file_name) + free ((char *) file_name); + + file_name = new_name; + } + } + return 0; +} diff --git a/login/utmp_file.c b/login/utmp_file.c new file mode 100644 index 0000000000..fff487a0a3 --- /dev/null +++ b/login/utmp_file.c @@ -0,0 +1,385 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper + and Paul Janzen , 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "utmp-private.h" + + +/* This is the default name. */ +static const char default_file_name[] = _PATH_UTMP; + +/* Current file name. */ +static const char *file_name = (const char *) default_file_name; + +/* Descriptor for the file and position. */ +static int file_fd = INT_MIN; +static off_t file_offset; + +static struct utmp last_entry; + +/* Functions defined here. */ +static int setutent_file (int reset); +static int getutent_r_file (struct utmp *buffer, struct utmp **result); +static int getutid_r_file (const struct utmp *key, struct utmp *buffer, + struct utmp **result); +static int getutline_r_file (const struct utmp *key, struct utmp *buffer, + struct utmp **result); +static struct utmp *pututline_file (const struct utmp *data); +static void endutent_file (void); +static int utmpname_file (const char *name); + + +/* Jump table for file functions. */ +struct utfuncs __libc_utmp_file_functions = +{ + setutent_file, + getutent_r_file, + getutid_r_file, + getutline_r_file, + pututline_file, + endutent_file, + utmpname_file +}; + + +static int +setutent_file (int reset) +{ + if (file_fd == INT_MIN) + { + file_fd = open (file_name, O_RDWR); + if (file_fd == -1) + { + /* Hhm, read-write access did not work. Try read-only. */ + file_fd = open (file_name, O_RDONLY); + if (file_fd == -1) + { + perror (_("while opening UTMP file")); + return 0; + } + } + file_offset = 0; + + /* Make sure the entry won't match. */ + last_entry.ut_type = -1; + } + else if (reset) + { + /* Remember we are at beginning of file. */ + file_offset = 0; + + /* Make sure the entry won't match. */ + last_entry.ut_type = -1; + } + + return 1; +} + + +static void +endutent_file (void) +{ + if (file_fd >= 0) + close (file_fd); + + file_fd = INT_MIN; +} + + +static int +getutent_r_file (struct utmp *buffer, struct utmp **result) +{ + int nbytes; + + /* Open utmp file if not already done. */ + if (file_fd == INT_MIN) + setutent_file (1); + + if (file_fd == -1 || file_offset == -1l) + { + /* Not available. */ + *result = NULL; + return -1; + } + + /* Read the next entry. */ + flock (file_fd, LOCK_SH); + nbytes = read (file_fd, &last_entry, sizeof (struct utmp)); + flock (file_fd, LOCK_UN); + + if (nbytes!= sizeof (struct utmp)) + { + file_offset = -1l; + *result = NULL; + return -1; + } + + /* Update position pointer. */ + file_offset += sizeof (struct utmp); + + memcpy (buffer, &last_entry, sizeof (struct utmp)); + *result = buffer; + + return 0; +} + + +/* For implementing this function we don't use the getutent_r function + because we can avoid the reposition on every new entry this way. */ +static int +getutline_r_file (const struct utmp *line, struct utmp *buffer, + struct utmp **result) +{ + if (file_fd < 0 || file_offset == -1l) + { + *result = NULL; + return -1; + } + + while (1) + { + /* Read the next entry. */ + if (read (file_fd, &last_entry, sizeof (struct utmp)) + != sizeof (struct utmp)) + { + __set_errno (ESRCH); + file_offset = -1l; + *result = NULL; + return -1; + } + + /* Stop if we found a user or login entry. */ + if ( +#if _HAVE_UT_TYPE - 0 + (last_entry.ut_type == USER_PROCESS + || last_entry.ut_type == LOGIN_PROCESS) + && +#endif + !strncmp (line->ut_line, last_entry.ut_line, sizeof line->ut_line)) + break; + + file_offset += sizeof (struct utmp); + } + + memcpy (buffer, &last_entry, sizeof (struct utmp)); + *result = buffer; + + return 0; +} + + +static int +internal_getutid_r (const struct utmp *id, struct utmp *buffer) +{ + if (id->ut_type == RUN_LVL || id->ut_type == BOOT_TIME + || id->ut_type == OLD_TIME || id->ut_type == NEW_TIME) + { + /* Search for next entry with type RUN_LVL, BOOT_TIME, + OLD_TIME, or NEW_TIME. */ + + while (1) + { + /* Read the next entry. */ + if (read (file_fd, buffer, sizeof (struct utmp)) + != sizeof (struct utmp)) + { + __set_errno (ESRCH); + file_offset = -1l; + return -1; + } + + if (id->ut_type == buffer->ut_type) + break; + + file_offset += sizeof (struct utmp); + } + } + else + { + /* Search for the next entry with the specified ID and with type + INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS, or DEAD_PROCESS. */ + + while (1) + { + /* Read the next entry. */ + if (read (file_fd, buffer, sizeof (struct utmp)) + != sizeof (struct utmp)) + { + __set_errno (ESRCH); + file_offset = -1l; + return -1; + } + if (( buffer->ut_type == INIT_PROCESS + || buffer->ut_type == LOGIN_PROCESS + || buffer->ut_type == USER_PROCESS + || buffer->ut_type == DEAD_PROCESS) + && strncmp (buffer->ut_id, id->ut_id, sizeof id->ut_id) == 0) + break; + + file_offset += sizeof (struct utmp); + } + } + + return 0; +} + + +/* For implementing this function we don't use the getutent_r function + because we can avoid the reposition on every new entry this way. */ +static int +getutid_r_file (const struct utmp *id, struct utmp *buffer, + struct utmp **result) +{ + if (file_fd < 0 || file_offset == -1l) + { + *result = NULL; + return -1; + } + + if (internal_getutid_r (id, &last_entry) < 0) + { + *result = NULL; + return -1; + } + + memcpy (buffer, &last_entry, sizeof (struct utmp)); + *result = buffer; + + return 0; +} + + +static struct utmp * +pututline_file (const struct utmp *data) +{ + struct utmp buffer; + struct utmp *pbuf; + int found; + + if (file_fd < 0) + /* Something went wrong. */ + return NULL; + + /* Find the correct place to insert the data. */ + if (file_offset > 0) + found = 0; + else + if ( last_entry.ut_type == RUN_LVL + || last_entry.ut_type == BOOT_TIME + || last_entry.ut_type == OLD_TIME + || last_entry.ut_type == NEW_TIME + || (( last_entry.ut_type == INIT_PROCESS + || last_entry.ut_type == LOGIN_PROCESS + || last_entry.ut_type == USER_PROCESS + || last_entry.ut_type == DEAD_PROCESS) + && !strncmp (last_entry.ut_id, data->ut_id, sizeof data->ut_id))) + found = 1; + else + found = internal_getutid_r (data, &buffer); + + /* Try to lock the file. */ + if (flock (file_fd, LOCK_EX | LOCK_NB) < 0 && errno != ENOSYS) + { + /* Oh, oh. The file is already locked. Wait a bit and try again. */ + sleep (1); + + /* This time we ignore the error. */ + (void) flock (file_fd, LOCK_EX | LOCK_NB); + } + + if (found < 0) + { + /* We append the next entry. */ + file_offset = lseek (file_fd, 0, SEEK_END); + if (file_offset % sizeof (struct utmp) != 0) + { + file_offset -= file_offset % sizeof (struct utmp); + ftruncate (file_fd, file_offset); + + if (lseek (file_fd, 0, SEEK_END) < 0) + { + (void) flock (file_fd, LOCK_UN); + return NULL; + } + } + } + else + { + /* We replace the just read entry. */ + file_offset -= sizeof (struct utmp); + lseek (file_fd, file_offset, SEEK_SET); + } + + /* Write the new data. */ + if (write (file_fd, data, sizeof (struct utmp)) != sizeof (struct utmp) + /* If we appended a new record this is only partially written. + Remove it. */ + && found < 0) + { + (void) ftruncate (file_fd, file_offset); + pbuf = NULL; + } + else + pbuf = (struct utmp *) data; + + /* And unlock the file. */ + (void) flock (file_fd, LOCK_UN); + + return pbuf; +} + + +static int +utmpname_file (const char *name) +{ + if (strcmp (name, file_name) != 0) + { + if (strcmp (name, default_file_name) == 0) + { + if (file_name != default_file_name) + free ((char *) file_name); + + file_name = default_file_name; + } + else + { + char *new_name = __strdup (name); + if (new_name == NULL) + /* Out of memory. */ + return -1; + + if (file_name != default_file_name) + free ((char *) file_name); + + file_name = new_name; + } + } + return 0; +} diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c index 6ddfd61d8d..635023884e 100644 --- a/nss/getXXbyYY_r.c +++ b/nss/getXXbyYY_r.c @@ -97,7 +97,7 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer, { no_more = DB_LOOKUP_FCT (&nip, REENTRANT_NAME_STRING, (void **) &fct); if (no_more) - startp = (service_user *) -1; + startp = (service_user *) -1l; else { startp = nip; @@ -118,7 +118,7 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer, else { fct = start_fct; - no_more = (nip = startp) == (service_user *) -1; + no_more = (nip = startp) == (service_user *) -1l; } while (no_more == 0) diff --git a/nss/getXXent_r.c b/nss/getXXent_r.c index 6c8105c03f..1df51ab768 100644 --- a/nss/getXXent_r.c +++ b/nss/getXXent_r.c @@ -124,9 +124,9 @@ setup (void **fctp, const char *func_name, int all) if (startp == NULL) { no_more = DB_LOOKUP_FCT (&nip, func_name, fctp); - startp = no_more ? (service_user *) -1 : nip; + startp = no_more ? (service_user *) -1l : nip; } - else if (startp == (service_user *) -1) + else if (startp == (service_user *) -1l) /* No services at all. */ return 1; else diff --git a/nss/nsswitch.c b/nss/nsswitch.c index 8ce1e8d122..af74493c3f 100644 --- a/nss/nsswitch.c +++ b/nss/nsswitch.c @@ -339,10 +339,10 @@ nss_lookup_function (service_user *ni, const char *fct_name) if (nss_dlerror_run (do_open) != 0) /* Failed to load the library. */ - ni->library->lib_handle = (void *) -1; + ni->library->lib_handle = (void *) -1l; } - if (ni->library->lib_handle == (void *) -1) + if (ni->library->lib_handle == (void *) -1l) /* Library not found => function not found. */ result = NULL; else diff --git a/posix/Makefile b/posix/Makefile index a2b7e57cda..fcf7cbae9e 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -25,7 +25,7 @@ headers := sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h \ glob.h regex.h wordexp.h fnmatch.h gnu/types.h getopt.h \ posix1_lim.h posix2_lim.h posix_opt.h local_lim.h tar.h \ utsnamelen.h confname.h waitflags.h waitstatus.h sys/unistd.h \ - sched.h schedbits.h re_comp.h + sched.h schedbits.h re_comp.h wait.h distribute := confstr.h diff --git a/posix/sys/types.h b/posix/sys/types.h index 26a35ee584..bbda57eee0 100644 --- a/posix/sys/types.h +++ b/posix/sys/types.h @@ -76,7 +76,6 @@ typedef unsigned short int ushort; typedef unsigned int uint; #endif -#ifdef __USE_BSD /* These size-specific names are used by some of the inet code. */ #if !defined (__GNUC__) || __GNUC__ < 2 || __GNUC_MINOR__ < 7 @@ -112,7 +111,6 @@ __u_intN_t (64, __DI__); typedef int register_t __attribute__ ((__mode__ (__word__))); -#endif /* Some code from BIND tests this macro to see if the types above are defined. */ diff --git a/posix/wait.h b/posix/wait.h new file mode 100644 index 0000000000..d01b81125f --- /dev/null +++ b/posix/wait.h @@ -0,0 +1 @@ +#include diff --git a/rellns-sh b/rellns-sh index 2df4721b00..40c4386c9c 100755 --- a/rellns-sh +++ b/rellns-sh @@ -28,15 +28,13 @@ case $1 in to=`echo $1 | sed 's%^/%%'` if test -d $2; then - fromname=. - from=`echo $2 | sed 's%/$%%'` + from=`echo $2 | sed 's%/*$%%'` else - fromname=`echo $2 | sed 's%.*/\([^/]*\)$%\1%'` - from=`echo $2 | sed "s%/*$fromname$%%"` + from=`echo $2 | sed 's%/*[^/]*$%%'` fi - case $from in - /*) from=`echo $from | sed 's%^/%%'` ;; + case "$from" in + /*) from=`echo $from | sed 's%^/*%%'` ;; ?*) from=`cd $from && pwd | sed 's%^/%%'` ;; *) from=`pwd | sed 's%^/%%'` ;; esac @@ -47,8 +45,8 @@ case $1 in test "$preto" != "$prefrom" && break - to=`echo $to | sed 's%^[^/]*/\(.*\)$%\1%'` - from=`echo $from | sed 's%^[^/]*/\(.*\)$%\1%'` + to=`echo $to | sed 's%^[^/]*/*\(.*\)$%\1%'` + from=`echo $from | sed 's%^[^/]*/*\(.*\)$%\1%'` done while test -n "$from"; do @@ -63,5 +61,3 @@ case $1 in ln -s $1 $2 ;; esac - -exit 0 diff --git a/shlib-versions b/shlib-versions index 58ea1f55b3..f2dbb79635 100644 --- a/shlib-versions +++ b/shlib-versions @@ -9,49 +9,49 @@ # ------------- ------- -------- # The interface to -lm depends only on cpu, not on operating system. -i?86-*-* libm=6 -m68k-*-* libm=6 -alpha-*-* libm=6 +i.86-.*-.* libm=6 +m68k-.*-.* libm=6 +alpha-.*-.* libm=6 # We provide libc.so.6 for Linux kernel versions 2.0 and later. -i?86-*-linux* libc=6 -m68k-*-linux* libc=6 -alpha-*-linux* libc=6 +i.86-.*-linux.* libc=6 +m68k-.*-linux.* libc=6 +alpha-.*-linux.* libc=6 # libmachuser.so.1 corresponds to mach/*.defs as of Utah's UK22 release. -*-*-gnu?* libmachuser=1 +.*-.*-gnu-gnu.* libmachuser=1 # libhurduser.so.0.0 corresponds to hurd/*.defs as of 7 May 1996. -*-*-gnu?* libhurduser=0.0 +.*-.*-gnu-gnu* libhurduser=0.0 # libc.so.0.2 is for the Hurd alpha release 0.2. -*-*-gnu?* libc=0.2 +.*-.*-gnu-gnu* libc=0.2 # The dynamic loader also requires different names. -i?86-*-linux* ld=ld-linux.so.2 +i.86-.*-linux.* ld=ld-linux.so.2 # We use the ELF ABI standard name for the default. -*-*-* ld=ld.so.1 +.*-.*-.* ld=ld.so.1 # The -ldl interface (see ) is the same on all platforms. -*-*-* libdl=2 +.*-.*-.* libdl=2 # So far the -lutil interface is the same on all platforms, except for the # `struct utmp' format, which depends on libc. -*-*-* libutil=1 +.*-.*-.* libutil=1 # Version number 2 is used on other systems for the BIND 4.9.5 resolver # interface. -*-*-* libresolv=2 +.*-.*-.* libresolv=2 # Interface revision of nss_* modules. This must match NSS_SHLIB_REVISION # in nss/nsswitch.h, which determines the library names used for service # names given in /etc/nsswitch.conf. -*-*-* libnss_files=1 -*-*-* libnss_dns=1 -*-*-* libnss_db=1 +.*-.*-.* libnss_files=1 +.*-.*-.* libnss_dns=1 +.*-.*-.* libnss_db=1 # We use libdb.so.2 for the interface in version 1.85 of the Berkeley DB code. -*-*-* libdb=2 +.*-.*-.* libdb=2 # This defines the shared library version numbers we will install. -*-*-* libcrypt=1 +.*-.*-.* libcrypt=1 diff --git a/stdio-common/Makefile b/stdio-common/Makefile index 920af7938f..ec7429c36e 100644 --- a/stdio-common/Makefile +++ b/stdio-common/Makefile @@ -12,9 +12,9 @@ # Library General Public License for more details. # You should have received a copy of the GNU Library General Public -# License along with the GNU C Library; see the file COPYING.LIB. If -# not, write to the Free Software Foundation, Inc., 675 Mass Ave, -# Cambridge, MA 02139, USA. +# License along with the GNU C Library; see the file COPYING.LIB. If not, +# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. # # Specific makefile for stdio-common. @@ -51,6 +51,8 @@ include ../Rules CFLAGS-_itoa.c = -Wno-unused CFLAGS-tst-printf.c = -Wno-format CFLAGS-tstdiomisc.c = -Wno-format +CFLAGS-scanf4.c = -Wno-format +CFLAGS-scanf7.c = -Wno-format ifeq ($(stdio),libio) ifneq (,$(filter %REENTRANT, $(defines))) diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h index 8f94f3b168..e741f492c6 100644 --- a/stdlib/stdlib.h +++ b/stdlib/stdlib.h @@ -245,14 +245,16 @@ struct random_data extern int __random_r __P ((struct random_data *__buf, int32_t *__result)); extern int random_r __P ((struct random_data *__buf, int32_t *__result)); + extern int __srandom_r __P ((unsigned int __seed, struct random_data *__buf)); +extern int srandom_r __P ((unsigned int __seed, struct random_data *__buf)); + extern int __initstate_r __P ((unsigned int __seed, __ptr_t __statebuf, size_t __statelen, struct random_data *__buf)); -extern int __setstate_r __P ((__ptr_t __statebuf, struct random_data *__buf)); - -extern int srandom_r __P ((unsigned int __seed, struct random_data *__buf)); extern int initstate_r __P ((unsigned int __seed, __ptr_t __statebuf, size_t __statelen, struct random_data *__buf)); + +extern int __setstate_r __P ((__ptr_t __statebuf, struct random_data *__buf)); extern int setstate_r __P ((__ptr_t __statebuf, struct random_data *__buf)); #endif /* Use reentrant. */ #endif /* Use BSD. */ diff --git a/stdlib/strtod.c b/stdlib/strtod.c index e1fff3dc3d..859e077b66 100644 --- a/stdlib/strtod.c +++ b/stdlib/strtod.c @@ -445,7 +445,8 @@ INTERNAL (STRTOF) (nptr, endptr, group) /* If no other digit but a '0' is found the result is 0.0. Return current read pointer. */ - if ((c < L_('0') || c > L_('9')) && (wint_t) c != decimal && !TOLOWER (c)) + if ((c < L_('0') || c > L_('9')) && (wint_t) c != decimal + && TOLOWER (c) != L_('e')) { tp = correctly_grouped_prefix (start_of_digits, cp, thousands, grouping); /* If TP is at the start of the digits, there was no correctly diff --git a/sysdeps/alpha/elf/Dist b/sysdeps/alpha/elf/Dist new file mode 100644 index 0000000000..3e7010182b --- /dev/null +++ b/sysdeps/alpha/elf/Dist @@ -0,0 +1,2 @@ +crtbegin.S +crtend.S diff --git a/sysdeps/alpha/elf/crtbegin.S b/sysdeps/alpha/elf/crtbegin.S new file mode 100644 index 0000000000..f75673e35f --- /dev/null +++ b/sysdeps/alpha/elf/crtbegin.S @@ -0,0 +1,91 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. + Contributed by Richard Henderson (rth@tamu.edu) + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If + not, write to the Free Software Foundation, Inc., + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + + +/* + * Heads of the constructor/destructor lists. + */ + +/* The __*TOR_LIST__ symbols are not global because when this file is used + in a shared library, we do not want the symbol to fall over to the + application's lists. */ + +.section .ctors,"aw" + + .align 3 +__CTOR_LIST__: + .quad -1 + +.section .dtors,"aw" + + .align 3 +__DTOR_LIST__: + .quad -1 + + +/* + * Fragment of the ELF _fini routine that invokes our dtor cleanup. + */ + +.section .fini,"ax" + + /* Since the bits of the _fini function are spread across many + object files, each potentially with its own GP, we must + assume we need to load ours. Further, our .fini section + can easily be more than 4MB away from our .text bits so we + can't use bsr. */ + + br $gp,1f +1: ldgp $gp,0($gp) + jsr $26,__do_global_dtors_aux + + /* Must match the alignment we got from crti.o else we get + zero-filled holes in our _fini function and thense SIGILL. */ + .align 3 + +/* + * Invoke our destructors in order. + */ + +.text + + .align 3 + .ent __do_global_dtors_aux + +__do_global_dtors_aux: + .frame $sp,16,$26,0 + /* GP already loaded in .fini */ + lda $sp,-16($sp) + stq $9,8($sp) + stq $26,0($sp) + .mask (1<<26)|(1<<9), -16 + .prologue 1 + + lda $9,__DTOR_LIST__ + br 1f +0: jsr $26,($27) +1: ldq $27,8($9) + addq $9,8,$9 + bne $27,0b + + ldq $26,0($sp) + ldq $9,8($sp) + lda $sp,16($sp) + ret + + .end __do_global_dtors_aux diff --git a/sysdeps/alpha/elf/crtend.S b/sysdeps/alpha/elf/crtend.S new file mode 100644 index 0000000000..7f51d81da1 --- /dev/null +++ b/sysdeps/alpha/elf/crtend.S @@ -0,0 +1,92 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. + Contributed by Richard Henderson (rth@tamu.edu) + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If + not, write to the Free Software Foundation, Inc., + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + + +/* + * Tails of the constructor/destructor lists. + */ + +/* The __*TOR_END__ symbols are not global because when this file is used + in a shared library, we do not want the symbol to fall over to the + application's lists. */ + +.section .ctors,"aw" + + .align 3 +__CTOR_END__: + .quad 0 + +.section .dtors,"aw" + + .align 3 +__DTOR_END__: + .quad 0 + + +/* + * Fragment of the ELF _init routine that invokes our ctor startup + */ + +.section .init,"ax" + + /* Since the bits of the _init function are spread across many + object files, each potentially with its own GP, we must + assume we need to load ours. Further, our .init section + can easily be more than 4MB away from our .text bits so we + can't use bsr. */ + + br $gp,1f +1: ldgp $gp,0($gp) + jsr $26,__do_global_ctors_aux + + /* Must match the alignment we got from crti.o else we get + zero-filled holes in our _init function and thense SIGILL. */ + .align 3 + +/* + * Invoke our destructors in order. + */ + +.text + + .align 3 + .ent __do_global_ctors_aux + +__do_global_ctors_aux: + .frame $sp,16,$26,0 + /* GP already loaded in .init. */ + lda $sp,-16($sp) + stq $9,8($sp) + stq $26,0($sp) + .mask (1<<26)|(1<<9), -16 + .prologue 1 + + lda $9,__CTOR_END__ + br 1f +0: jsr $26,($27) +1: ldq $27,-8($9) + subq $9,8,$9 + not $27,$0 + bne $0,0b + + ldq $26,0($sp) + ldq $9,8($sp) + lda $sp,16($sp) + ret + + .end __do_global_ctors_aux diff --git a/sysdeps/generic/paths.h b/sysdeps/generic/paths.h index a2ff426753..e5f34014a8 100644 --- a/sysdeps/generic/paths.h +++ b/sysdeps/generic/paths.h @@ -62,6 +62,7 @@ #define _PATH_TTY "/dev/tty" #define _PATH_UNIX "/vmunix" #define _PATH_UTMP "/var/run/utmp" +#define _PATH_UTMP_DB "/var/run/utmp.db" #define _PATH_VI "/usr/bin/vi" #define _PATH_WTMP "/var/log/wtmp" diff --git a/sysdeps/generic/pty.c b/sysdeps/generic/pty.c index 8df8aba4ba..660602b25a 100644 --- a/sysdeps/generic/pty.c +++ b/sysdeps/generic/pty.c @@ -59,9 +59,12 @@ openpty(amaster, aslave, name, termp, winp) static char line[] = "/dev/ptyXX"; register const char *cp1, *cp2; register int master, slave, ttygid; + size_t buflen = sysconf (_SC_GETGR_R_SIZE_MAX); + char buffer[buflen]; + struct group grbuffer; struct group *gr; - if ((gr = getgrnam("tty")) != NULL) + if (getgrnam_r("tty", &grbuffer, buffer, buflen, &gr) >= 0) ttygid = gr->gr_gid; else ttygid = -1; diff --git a/sysdeps/gnu/utmpbits.h b/sysdeps/gnu/utmpbits.h index 37e4fb9acc..5bb230b243 100644 --- a/sysdeps/gnu/utmpbits.h +++ b/sysdeps/gnu/utmpbits.h @@ -52,6 +52,31 @@ struct lastlog char ll_host[UT_HOSTSIZE]; }; + +/* Which program created the record. */ +enum utlogin +{ + unknown, + X, + local, + rlogin, + telnet, + rsh, + ftp, + screen, + splitvt, + xterm + /* More could be added here. */ +}; + + +struct exit_status +{ + short int e_termination; /* Process termination status. */ + short int e_exit; /* Process exit status. */ +}; + + struct utmp { short int ut_type; /* Type of login. */ @@ -61,11 +86,14 @@ struct utmp char ut_user[UT_NAMESIZE]; /* Username (not NUL terminated). */ #define ut_name ut_user /* Compatible field name for same. */ char ut_host[UT_HOSTSIZE]; /* Hostname for remote login. */ - int ut_exit; /* Process termination/exit status. */ + struct exit_status ut_exit; /* The exit status of a process marked + as DEAD_PROCESS. */ long ut_session; /* Session ID, used for windowing. */ struct timeval ut_tv; /* Time entry was made. */ - int32_t ut_addr; /* Internet address of remote host. */ - char pad[32]; /* Reserved for future use. */ + int32_t ut_addr[4]; /* Internet address of remote host. */ + enum utlogin ut_login; /* To store information about source. */ + short int ut_syslen; /* Significant length of ut_host. */ + char pad[14]; /* Reserved for future use. */ }; #define ut_time ut_tv.tv_sec /* Backwards compatibility. */ diff --git a/sysdeps/mach/hurd/Dist b/sysdeps/mach/hurd/Dist index 986efc4e2d..62fe4d96c6 100644 --- a/sysdeps/mach/hurd/Dist +++ b/sysdeps/mach/hurd/Dist @@ -1,3 +1,3 @@ errnos.awk err_hurd.sub libc-ldscript - +libc_p-ldscript diff --git a/sysdeps/mach/hurd/Makefile b/sysdeps/mach/hurd/Makefile index 74ceb2e6e1..eb3dc01252 100644 --- a/sysdeps/mach/hurd/Makefile +++ b/sysdeps/mach/hurd/Makefile @@ -98,17 +98,20 @@ common-generated += errnos.d stamp-errnos libc-name = crt ifeq (,$(subdir)) -install-others += $(libdir)/libc.a +install-others += $(libdir)/libc.a $(libdir)/libc_p.a $(libdir)/libc.a: $(hurd)/libc-ldscript; $(do-install) +$(libdir)/libc_p.a: $(hurd)/libc_p-ldscript; $(do-install) endif -# For the shared library, we don't need to do the linker script machination. -# Instead, we specify the required libraries when building the shared object. +# Make sure these are used to build the libc.so shared object too. rpcuserlibs := $(common-objpfx)mach/libmachuser.so \ $(common-objpfx)hurd/libhurduser.so $(common-objpfx)libc.so: $(rpcuserlibs) rpath-link := $(rpath-link):$(common-objpfx)mach:$(common-objpfx)hurd +# And get them into the libc.so ldscript. +$(libdir)/libc.so: $(rpcuserlibs) + # The RPC stubs from these libraries are needed in building the dynamic # linker, too. It must be self-contained, so we link the needed PIC # objects directly into the shared object. diff --git a/sysdeps/mach/hurd/libc_p-ldscript b/sysdeps/mach/hurd/libc_p-ldscript new file mode 100644 index 0000000000..d809998a1f --- /dev/null +++ b/sysdeps/mach/hurd/libc_p-ldscript @@ -0,0 +1,5 @@ +/* This linker script is installed as /lib/libc_p.a. + It makes -lc_p become just like -( -lcrt_p -lmachuser_p -lhurduser_p -). + */ + +GROUP ( libcrt_p.a libmachuser_p.a libhurduser_p.a ) diff --git a/sysdeps/posix/getcwd.c b/sysdeps/posix/getcwd.c index 825599f370..5f3f628fb5 100644 --- a/sysdeps/posix/getcwd.c +++ b/sysdeps/posix/getcwd.c @@ -344,8 +344,11 @@ __getcwd (buf, size) __set_errno (ENOMEM);/* closedir might have changed it.*/ return NULL; } - pathp = &buf[pathp - path]; + pathp = &buf[pathp - path + size / 2]; path = buf; + /* Move current contents up to the end of the buffer. + This is guaranteed to be non-overlapping. */ + memcpy (pathp, pathp - size / 2, path + size - pathp); } } pathp -= namlen; diff --git a/sysdeps/stub/getlogin.c b/sysdeps/stub/getlogin.c index 484c159855..34acbc38a9 100644 --- a/sysdeps/stub/getlogin.c +++ b/sysdeps/stub/getlogin.c @@ -1,20 +1,20 @@ /* Copyright (C) 1991, 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. + This file is part of the GNU C Library. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include #include @@ -23,11 +23,10 @@ Cambridge, MA 02139, USA. */ /* Return the login name of the user, or NULL if it can't be determined. The returned pointer, if not NULL, is good only until the next call. */ char * -getlogin () +getlogin (void) { __set_errno (ENOSYS); return NULL; } - stub_warning (getlogin) diff --git a/sysdeps/stub/getlogin_r.c b/sysdeps/stub/getlogin_r.c index fa9bb75d41..d811818096 100644 --- a/sysdeps/stub/getlogin_r.c +++ b/sysdeps/stub/getlogin_r.c @@ -1,21 +1,21 @@ /* Reentrant function to return the current login name. Stub version. -Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. + Copyright (C) 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include #include diff --git a/sysdeps/unix/getlogin.c b/sysdeps/unix/getlogin.c index ef985f2d2f..6e8a9a2a87 100644 --- a/sysdeps/unix/getlogin.c +++ b/sysdeps/unix/getlogin.c @@ -1,20 +1,20 @@ /* Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. + This file is part of the GNU C Library. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include #include @@ -34,9 +34,8 @@ getlogin (void) char tty_pathname[2 + 2 * NAME_MAX]; char *real_tty_path = tty_pathname; char *result = NULL; - struct utmp_data utmp_data = { ut_fd: -1 }; static char name[UT_NAMESIZE + 1]; - struct utmp *ut, line; + struct utmp *ut, line, buffer; /* Get name of tty connected to fd 0. Return NULL if not a tty or if fd 0 isn't open. Note that a lot of documentation says that @@ -52,9 +51,9 @@ getlogin (void) real_tty_path += 5; /* Remove "/dev/". */ - __setutent_r (&utmp_data); + __setutent (); strncpy (line.ut_line, real_tty_path, sizeof line.ut_line); - if (__getutline_r (&line, &ut, &utmp_data) < 0) + if (__getutline_r (&line, &buffer, &ut) < 0) { if (errno == ESRCH) /* The caller expects ENOENT if nothing is found. */ @@ -68,7 +67,7 @@ getlogin (void) result = name; } - __endutent_r (&utmp_data); + __endutent (); return result; } diff --git a/sysdeps/unix/getlogin_r.c b/sysdeps/unix/getlogin_r.c index aa2c0617e6..868fdbee12 100644 --- a/sysdeps/unix/getlogin_r.c +++ b/sysdeps/unix/getlogin_r.c @@ -1,21 +1,21 @@ /* Reentrant function to return the current login name. Unix version. -Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. + Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include #include @@ -38,8 +38,7 @@ getlogin_r (name, name_len) char tty_pathname[2 + 2 * NAME_MAX]; char *real_tty_path = tty_pathname; int result = 0; - struct utmp_data utmp_data; - struct utmp *ut, line; + struct utmp *ut, line, buffer; { int err; @@ -60,9 +59,9 @@ getlogin_r (name, name_len) real_tty_path += 5; /* Remove "/dev/". */ - setutent_r (&utmp_data); + __setutent (); strncpy (line.ut_line, real_tty_path, sizeof line.ut_line); - if (getutline_r (&line, &ut, &utmp_data) < 0) + if (__getutline_r (&line, &buffer, &ut) < 0) { if (errno == ESRCH) /* The caller expects ENOENT if nothing is found. */ @@ -85,7 +84,7 @@ getlogin_r (name, name_len) result = 0; } } - endutent_r (&utmp_data); + __endutent (); return result; } diff --git a/sysdeps/unix/sysv/linux/Dist b/sysdeps/unix/sysv/linux/Dist index ce55ab2d25..e1a89711e2 100644 --- a/sysdeps/unix/sysv/linux/Dist +++ b/sysdeps/unix/sysv/linux/Dist @@ -20,6 +20,7 @@ sys/mount.h sys/mtio.h sys/procfs.h sys/quota.h +sys/serial.h sys/socketcall.h sys/soundcard.h sys/sysctl.h diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index fcfb76c08f..69c207a575 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -8,7 +8,8 @@ sysdep_routines += sysctl clone sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h sys/mtio.h \ sys/module.h sys/io.h sys/klog.h sys/kdaemon.h \ sys/user.h syscall-list.h sys/sysmacros.h sys/procfs.h \ - sys/debugreg.h sys/kd.h sys/soundcard.h sys/vt.h + sys/debugreg.h sys/kd.h sys/soundcard.h sys/vt.h \ + sys/serial.h # Generate the list of SYS_* macros for the system calls (__NR_* macros). $(objpfx)syscall-%.h $(objpfx)syscall-%.d: ../sysdeps/unix/sysv/linux/syscall.h diff --git a/sysdeps/unix/sysv/linux/paths.h b/sysdeps/unix/sysv/linux/paths.h index 6751c0d4a9..eaa6aa632f 100644 --- a/sysdeps/unix/sysv/linux/paths.h +++ b/sysdeps/unix/sysv/linux/paths.h @@ -62,6 +62,7 @@ #define _PATH_TTY "/dev/tty" #define _PATH_UNIX "/vmlinux" #define _PATH_UTMP "/var/run/utmp" +#define _PATH_UTMP_DB "/var/run/utmp.db" #define _PATH_VI "/usr/bin/vi" #define _PATH_WTMP "/var/log/wtmp" diff --git a/sysdeps/unix/sysv/linux/sys/serial.h b/sysdeps/unix/sysv/linux/sys/serial.h new file mode 100644 index 0000000000..1844ef6032 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sys/serial.h @@ -0,0 +1,110 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _SYS_SERIAL_H +#define _SYS_SERIAL_H 1 +/* Defines for PC AT serial port. */ + +/* Serial port addresses and IRQs. */ +#define PORT_0 0x03F8 +#define PORT_1 0x02F8 +#define IRQ_0 0x04 +#define IRQ_1 0x03 + +/* Definitions for INS8250 / 16550 chips. */ + +/* Defined as offsets from the port address (data port). */ +#define DAT 0 /* Receive/transmit data. */ +#define ICR 1 /* Interrupt control register. */ +#define ISR 2 /* Interrupt status register. */ +#define LCR 3 /* Line control register. */ +#define MCR 4 /* Modem control register. */ +#define LSR 5 /* Line status register. */ +#define MSR 6 /* Modem status register. */ +#define DLL 0 /* Divisor latch (lsb). */ +#define DLH 1 /* Divisor latch (msb). */ + + +/* ICR. */ +#define RIEN 0x01 /* Enable receiver interrupt. */ +#define TIEN 0x02 /* Enable transmitter interrupt. */ +#define SIEN 0x04 /* Enable receiver line status interrupt. */ +#define MIEN 0x08 /* Enable modem status interrupt. */ + + +/* ISR */ +#define FFTMOUT 0x0c /* Fifo rcvr timeout. */ +#define RSTATUS 0x06 /* Change in receiver line status. */ +#define RxRDY 0x04 /* Receiver data available. */ +#define TxRDY 0x02 /* Transmitter holding register empty. */ +#define MSTATUS 0x00 /* Change in modem status. */ + + +/* LCR 3 + Number of data bits per received/transmitted character. */ +#define RXLEN 0x03 +#define STOP1 0x00 +#define STOP2 0x04 +#define PAREN 0x08 +#define PAREVN 0x10 +#define PARMARK 0x20 +#define SNDBRK 0x40 +#define DLAB 0x80 + +/* Baud rate definitions. */ +#define ASY9600 12 + +/* Definitions for character length (data bits) in RXLEN field. */ +#define BITS5 0x00 +#define BITS6 0x01 +#define BITS7 0x02 +#define BITS8 0x03 + +/* MCR. */ +#define DTR 0x01 /* Bring up DTR. */ +#define RTS 0x02 /* Bring up RTS. */ +#define OUT1 0x04 +#define OUT2 0x08 +#define LOOP 0x10 /* Put chip into loopback state. */ + + +/* LSR */ +#define RCA 0x01 /* Receive char available. */ +#define OVRRUN 0x02 /* Receive overrun. */ +#define PARERR 0x04 /* Parity error. */ +#define FRMERR 0x08 /* Framing/CRC error. */ +#define BRKDET 0x10 /* Break detected (null char + frame error). */ +#define XHRE 0x20 /* Transmit holding register empty. */ +#define XSRE 0x40 /* Transmit shift register empty. */ + + +/* MSR */ +#define DCTS 0x01 /* CTS has changed state. */ +#define DDSR 0x02 /* DSR has changed state. */ +#define DRI 0x04 /* RI has changed state. */ +#define DDCD 0x08 /* DCD has changed state. */ +#define CTS 0x10 /* State of CTS. */ +#define DSR 0x20 /* State of DSR. */ +#define RI 0x40 /* State of RI. */ +#define DCD 0x80 /* State of DCD. */ + + +#define DELTAS(x) ((x) & (DCTS | DDSR | DRI | DDCD)) +#define STATES(x) ((x) (CTS | DSR | RI | DCD)) + +#endif /* sys/serial.h */ diff --git a/time/Makefile b/time/Makefile index 772461c778..252b335c9e 100644 --- a/time/Makefile +++ b/time/Makefile @@ -125,7 +125,7 @@ $(installed-localtime-file): $(zonedir)/$(localtime) $(objpfx)zic echo Site timezone NOT reset to Factory.; \ else \ rm -f $@T; \ - $(SHELL) $(top_absdir)/rellns-sh $< $@T; \ + $(SHELL) $(..)/rellns-sh $< $@T; \ mv -f $@T $@; \ fi endif diff --git a/time/africa b/time/africa index a3a28c95ea..49f39fbfab 100644 --- a/time/africa +++ b/time/africa @@ -1,15 +1,23 @@ -# @(#)africa 7.15 +# @(#)africa 7.16 # This data is by no means authoritative; if you think you know better, # go ahead and edit the file (and please send any changes to # tz@elsie.nci.nih.gov for general use in the future). -# From Paul Eggert (1996-09-03): +# From Paul Eggert (1996-11-22): # # A good source for time zone historical data outside the U.S. is # Thomas G. Shanks, The International Atlas (3rd edition), # San Diego: ACS Publications, Inc. (1991). -# Except where otherwise noted, it is the source for the data below. +# +# Gwillim Law writes that a good source +# for recent time zone data is the International Air Transport +# Association's Standard Schedules Information Manual (IATA SSIM), +# published semiannually. Law sent in several helpful summaries +# of the IATA's data after 1990. +# +# Except where otherwise noted, Shanks is the source for entries through 1990, +# and IATA SSIM is the source for entries after 1990. # # Another source occasionally used is Edward W. Whitman, World Time Differences, # Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which @@ -255,12 +263,17 @@ Rule Egypt 1957 1958 - Oct 1 0:00 0 - Rule Egypt 1958 only - May 1 0:00 1:00 S Rule Egypt 1959 1981 - May 1 1:00 1:00 S Rule Egypt 1959 1965 - Sep 30 3:00 0 - -Rule Egypt 1966 max - Oct 1 3:00 0 - +Rule Egypt 1966 1990 - Oct 1 3:00 0 - Rule Egypt 1982 only - Jul 25 1:00 1:00 S Rule Egypt 1983 only - Jul 12 1:00 1:00 S Rule Egypt 1984 1988 - May 1 1:00 1:00 S Rule Egypt 1989 only - May 6 1:00 1:00 S -Rule Egypt 1990 max - May 1 1:00 1:00 S +Rule Egypt 1990 only - May 1 1:00 1:00 S +Rule Egypt 1991 1994 - May 1 0:00 1:00 S +Rule Egypt 1991 1994 - Oct 1 0:00 0 - +Rule Egypt 1995 max - Apr lastFri 0:00 1:00 S +Rule Egypt 1995 max - Sep lastFri 0:00 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Africa/Cairo 2:05:00 - LMT 1900 Oct 2:00 Egypt EE%sT @@ -390,15 +403,15 @@ Rule Libya 1986 only - Oct 3 0:00 0 - Rule Libya 1987 1989 - Apr 1 0:00 1:00 S Rule Libya 1987 1990 - Oct 1 0:00 0 - Rule Libya 1990 only - May 4 0:00 1:00 S +Rule Libya 1996 max - Mar 30 2:00s 1:00 S +Rule Libya 1996 max - Sep 30 2:00s 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Africa/Tripoli 0:52:44 - LMT 1920 1:00 Libya CE%sT 1959 2:00 - EET 1982 -# From Paul Eggert (1995-12-19): -# usno1995 (from OAG) says Libya uses 2:00 all year, as they did before 1982. -# We don't know when they switched back. We'll guess 1991. 1:00 Libya CE%sT 1991 - 2:00 - EET + 2:00 - EET 1996 Mar 30 3:00 + 1:00 Libya CE%sT # Madagascar # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -442,7 +455,7 @@ Zone Indian/Mayotte 3:00:56 - LMT 1911 Jul # Mamoutzou 3:00 - EAT # Morocco -# rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Morocco 1939 only - Sep 12 0:00 1:00 S Rule Morocco 1939 only - Nov 19 0:00 0 - Rule Morocco 1940 only - Feb 25 0:00 1:00 S @@ -474,12 +487,15 @@ Zone Africa/Maputo 2:10:20 - LMT 1903 Mar 2:00 - SAT # Namibia +# RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule Namibia 1994 max - Sep Sun>=1 2:00 1:00 S +Rule Namibia 1995 max - Apr Sun>=1 2:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Africa/Windhoek 1:08:24 - LMT 1892 Feb 8 1:30 - SWAT 1903 Mar # SW Africa Time 2:00 - SAT 1942 Sep 20 2:00 2:00 1:00 SAST 1943 Mar 21 2:00 - 2:00 - SAT + 2:00 Namibia SA%sT # Niger # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -618,10 +634,9 @@ Rule Tunisia 1977 only - Sep 24 0:00s 0 - Rule Tunisia 1978 only - May 1 0:00s 1:00 S Rule Tunisia 1978 only - Oct 1 0:00s 0 - Rule Tunisia 1988 only - Jun 1 0:00s 1:00 S -Rule Tunisia 1988 max - Sep lastSun 0:00s 0 - +Rule Tunisia 1988 1990 - Sep lastSun 0:00s 0 - Rule Tunisia 1989 only - Mar 26 0:00s 1:00 S Rule Tunisia 1990 only - May 1 0:00s 1:00 S -Rule Tunisia 1991 max - Mar lastSun 0:00s 1:00 S # Shanks gives 0:09 for Paris Mean Time; go with Howse's more precise 0:09:21. # Shanks says the 1911 switch occurred on Mar 9; go with Howse's Mar 11. # Zone NAME GMTOFF RULES FORMAT [UNTIL] diff --git a/time/antarctica b/time/antarctica index 0c78eb6826..b4a7d397a3 100644 --- a/time/antarctica +++ b/time/antarctica @@ -1,4 +1,4 @@ -# @(#)antarctica 7.4 +# @(#)antarctica 7.5 # From Paul Eggert (1996-09-03): # To keep things manageable, we list only locations occupied year-round; @@ -8,6 +8,20 @@ # I made up all time zone abbreviations mentioned here; corrections welcome! # FORMAT is `___' and GMTOFF is 0 for locations while uninhabited. +# These rules are stolen from the `southamerica' file. +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule ArgAQ 1964 1966 - Mar 1 0:00 0 - +Rule ArgAQ 1964 1966 - Oct 15 0:00 1:00 S +Rule ArgAQ 1967 only - Apr 1 0:00 0 - +Rule ArgAQ 1967 1968 - Oct Sun<=7 0:00 1:00 S +Rule ArgAQ 1968 1969 - Apr Sun<=7 0:00 0 - +Rule ArgAQ 1974 only - Jan 23 0:00 1:00 S +Rule ArgAQ 1974 only - May 1 0:00 0 - +Rule ArgAQ 1974 1976 - Oct Sun<=7 0:00 1:00 S +Rule ArgAQ 1975 1977 - Apr Sun<=7 0:00 0 - +Rule ChileAQ 1969 max - Oct Sun>=9 0:00 1:00 S +Rule ChileAQ 1970 max - Mar Sun>=9 0:00 0 - + # Argentina - 6 year-round bases # General Belgrano II @@ -118,7 +132,21 @@ Rule NZAQ 1990 max - Mar Sun>=15 2:00s 0 S # USA - year-round bases # -# Palmer, Anvers Island +# Palmer, Anvers Island, since 1965 (moved 2 miles in 1968) +# +# From Ethan Dicks (1996-10-06): +# It keeps the same time as Punta Arenas, Chile, because, just like us +# and the South Pole, that's the other end of their supply line.... +# I verified with someone who was there that since 1980, +# Palmer has followed Chile. Prior to that, before the Falklands War, +# Palmer used to be supplied from Argentina. +# +# Zone NAME GMTOFF RULES FORMAT [UNTIL] +Zone Antarctica/Palmer 0 - ___ 1965 + -4:00 ArgAQ AR%sT 1969 Oct 5 + -3:00 ArgAQ AR%sT 1982 May + -4:00 ChileAQ CL%sT +# # # McMurdo, Ross Island, since 1956 # Zone NAME GMTOFF RULES FORMAT [UNTIL] diff --git a/time/asia b/time/asia index b5220f3915..7afe922bf4 100644 --- a/time/asia +++ b/time/asia @@ -1,16 +1,25 @@ -# @(#)asia 7.25 +# @(#)asia 7.26 # This data is by no means authoritative; if you think you know better, # go ahead and edit the file (and please send any changes to # tz@elsie.nci.nih.gov for general use in the future). -# From Paul Eggert (1995-07-24): +# From Paul Eggert (1996-11-22): # # A good source for time zone historical data outside the U.S. is # Thomas G. Shanks, The International Atlas (3rd edition), # San Diego: ACS Publications, Inc. (1991). # Except where otherwise noted, it is the source for the data below. # +# Gwillim Law writes that a good source +# for recent time zone data is the International Air Transport +# Association's Standard Schedules Information Manual (IATA SSIM), +# published semiannually. Law sent in several helpful summaries +# of the IATA's data after 1990. +# +# Except where otherwise noted, Shanks is the source for entries through 1990, +# and IATA SSIM is the source for entries after 1990. +# # Another source occasionally used is Edward W. Whitman, World Time Differences, # Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which # I found in the UCLA library. @@ -24,7 +33,6 @@ # Corrections are welcome! # std dst # LMT Local Mean Time -# LST Local Star Time (Russian ``mestnoe zvezdnoe vremya'') # 2:00 EET EEST Eastern European Time # 2:00 IST IDT Israel # 3:00 AST ADT Arabia* @@ -48,12 +56,22 @@ ############################################################################### -# These rules for Russia are stolen from the `europe' file. +# These rules are stolen from the `europe' file. # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S -Rule RussiaAsia 1981 1984 - Apr 1 0:00 1:00 S -Rule RussiaAsia 1981 1983 - Oct 1 0:00 0 - -Rule RussiaAsia 1984 max - Sep lastSun 2:00s 0 - -Rule RussiaAsia 1985 max - Mar lastSun 2:00s 1:00 S +Rule EUAsia 1981 max - Mar lastSun 1:00u 1:00 S +Rule EUAsia 1996 max - Oct lastSun 1:00u 0 - +Rule E-EurAsia 1981 max - Mar lastSun 0:00 1:00 S +Rule E-EurAsia 1979 1995 - Sep lastSun 0:00 0 - +Rule E-EurAsia 1996 max - Oct lastSun 0:00 0 - +Rule RussiaAsia 1981 1984 - Apr 1 0:00 1:00 S +Rule RussiaAsia 1981 1983 - Oct 1 0:00 0 - +Rule RussiaAsia 1984 1991 - Sep lastSun 2:00s 0 - +Rule RussiaAsia 1985 1991 - Mar lastSun 2:00s 1:00 S +Rule RussiaAsia 1992 only - Mar lastSat 23:00 1:00 S +Rule RussiaAsia 1992 only - Sep lastSat 23:00 0 - +Rule RussiaAsia 1993 max - Mar lastSun 2:00s 1:00 S +Rule RussiaAsia 1993 1995 - Sep lastSun 2:00s 0 - +Rule RussiaAsia 1996 max - Oct lastSun 2:00s 0 - # Afghanistan # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -85,10 +103,9 @@ Zone Asia/Baku 3:19:24 - LMT 1924 May 2 3:00 - BAKT 1957 Mar # Baku Time 4:00 RussiaAsia BAK%sT 1991 Mar 31 2:00s 3:00 1:00 BAKST 1991 Aug 30 # independence - 3:00 RussiaAsia AZ%sT 1992 # Azerbaijan Time - 3:00 - AZT -# Shanks has Baku using Russian DST rules after 1991, -# but usno1995 has Azerbaijan with no DST. Guess no DST after 1991. + 3:00 RussiaAsia AZ%sT 1992 Sep lastSun 2:00s + 4:00 - AZT 1996 # Azerbaijan time + 4:00 EUAsia AZ%sT # Bahrain # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -287,18 +304,20 @@ Zone Asia/Nicosia 2:13:28 - LMT 1921 Nov 14 # an MP who went on a hunger strike for 11 days to force discussion about it! # We have no details, but we'll guess they didn't move the clocks back in fall. # -# From Paul Eggert (1995-11-13): -# usno1995 has Georgia at 4:00. Guess that Georgia stopped transitions -# after spring 1994 (thus sticking at 4:00). -# Most likely we're still missing some rule changes between 1991 and 1994. +# From Mathew Englander , quoting AP (1996-10-23 13:05-04): +# Instead of putting back clocks at the end of October, Georgia +# will stay on daylight savings time this winter to save energy, +# President Eduard Shevardnadze decreed Wednesday. # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Tbilisi 2:59:16 - LMT 1880 2:59:16 - TBMT 1924 May 2 # Tbilisi Mean Time 3:00 - TBIT 1957 Mar # Tbilisi Time 4:00 RussiaAsia TBI%sT 1991 Mar 31 2:00s 3:00 1:00 TBIST 1991 Apr 9 # independence - 3:00 RussiaAsia GE%sT 1994 Sep 25 2:00s # Georgia Time - 4:00 - GET + 3:00 RussiaAsia GE%sT 1992 # Georgia Time + 3:00 E-EurAsia GE%sT 1994 Sep lastSun + 4:00 E-EurAsia GE%sT 1996 Oct lastSun + 5:00 - GET # India # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -340,6 +359,13 @@ Rule Iran 1978 1980 - Mar 21 0:00 1:00 S Rule Iran 1978 only - Oct 21 0:00 0 - Rule Iran 1979 only - Sep 19 0:00 0 - Rule Iran 1980 only - Sep 23 0:00 0 - +Rule Iran 1991 only - May 3 0:00s 1:00 S +Rule Iran 1991 only - Sep 20 0:00s 0 - +Rule Iran 1992 only - Mar 22 0:00 1:00 S +Rule Iran 1992 1993 - Sep 23 0:00 0 - +Rule Iran 1993 max - Mar 21 0:00 1:00 S +Rule Iran 1994 1995 - Sep 22 0:00 0 - +Rule Iran 1996 max - Sep 21 0:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Tehran 3:25:44 - LMT 1916 3:25:44 - TMT 1946 # Tehran Mean Time @@ -353,8 +379,11 @@ Rule Iraq 1982 only - May 1 0:00 1:00 D Rule Iraq 1982 1984 - Oct 1 0:00 0 S Rule Iraq 1983 only - Mar 31 0:00 1:00 D Rule Iraq 1984 1985 - Apr 1 0:00 1:00 D -Rule Iraq 1985 max - Sep lastSun 1:00s 0 S -Rule Iraq 1986 max - Mar lastSun 1:00s 1:00 D +Rule Iraq 1985 1990 - Sep lastSun 1:00s 0 S +Rule Iraq 1986 1990 - Mar lastSun 1:00s 1:00 D +# IATA SSIM (1991/1996) says Apr 1 12:01am UTC; guess the `:01' is a typo. +Rule Iraq 1991 max - Apr 1 3:00s 1:00 D +Rule Iraq 1991 max - Oct 1 3:00s 0 D # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Baghdad 2:57:40 - LMT 1890 2:57:36 - BMT 1918 # Baghdad Mean Time? @@ -512,9 +541,6 @@ Zone Asia/Ishigaki 8:16:36 - LMT 1896 # Other Japanese possessions are probably like Asia/Tokyo. # Jordan -# From Paul Eggert (1993-11-18): -# Most likely Shanks is merely guessing dates from 1992 on. -# From Shanks (1991): # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Jordan 1973 only - Jun 6 0:00 1:00 S Rule Jordan 1973 1975 - Oct 1 0:00 0 - @@ -529,40 +555,56 @@ Rule Jordan 1986 1988 - Apr Fri>=1 0:00 1:00 S Rule Jordan 1986 1990 - Oct Fri>=1 0:00 0 - Rule Jordan 1989 only - May 8 0:00 1:00 S Rule Jordan 1990 only - Apr 27 0:00 1:00 S -Rule Jordan 1991 only - Apr 19 0:00 1:00 S +Rule Jordan 1991 only - Apr 17 0:00 1:00 S Rule Jordan 1991 only - Sep 27 0:00 0 - -Rule Jordan 1992 max - Apr Fri>=1 0:00 1:00 S -Rule Jordan 1992 max - Oct Fri>=1 0:00 0 - +Rule Jordan 1992 only - Apr 10 0:00 1:00 S +Rule Jordan 1992 1993 - Oct Fri>=1 0:00 0 - +Rule Jordan 1993 max - Apr Fri>=1 0:00 1:00 S +Rule Jordan 1994 only - Sep Fri>=15 0:00 0 - +Rule Jordan 1995 max - Sep Fri>=15 0:00s 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Amman 2:23:44 - LMT 1931 2:00 Jordan EE%sT # Kazakhstan -# From Paul Eggert (1996-04-19): +# From Paul Eggert (1996-11-22): # Andrew Evtichov (1996-04-13) writes that Kazakhstan -# stayed in sync with Moscow after 1990, and that Aktau is the biggest city -# in western Kazakhstan. Follow Shanks before 1991, Evtichov afterwards. +# stayed in sync with Moscow after 1990, and that Aqtobe (formerly Aktyubinsk) +# and Aqtau (formerly Shevchenko) are the largest cities in their zones. +# Guess that Aqtau and Aqtobe diverged in 1995, since that's the first time +# IATA SSIM mentions a third time zone in Kazakhstan. +# # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Alma-Ata 5:07:48 - LMT 1924 May 2 # or Almaty 5:00 - ALMT 1957 Mar # Alma-Ata Time 6:00 RussiaAsia ALM%sT 1991 Mar 31 2:00s 5:00 1:00 ALMST 1991 Sep 29 2:00s 5:00 - ALMT 1992 Jan 19 2:00s - 6:00 RussiaAsia ALM%sT -Zone Asia/Aktau 3:21:04 - LMT 1924 May 2 # or Aqtau + 6:00 E-EurAsia ALM%sT +Zone Asia/Aqtobe 3:48:40 - LMT 1924 May 2 + 4:00 - AKT 1957 Mar # Aktyubinsk Time + 5:00 RussiaAsia AK%sT 1991 Mar 31 2:00s + 4:00 1:00 AKTST 1991 Sep 29 2:00s + 4:00 - AQTT 1992 Jan 19 2:00s # Aqtobe Time + 5:00 E-EurAsia AQT%sT +Zone Asia/Aqtau 3:21:04 - LMT 1924 May 2 # or Aktau 4:00 - SHET 1957 Mar # Fort Shevchenko Time 5:00 RussiaAsia SHE%sT 1991 Mar 31 2:00s - 4:00 1:00 AKTST 1991 Sep 29 2:00s - 4:00 - AKTT 1992 Jan 19 2:00s # Aktau Time - 5:00 RussiaAsia AKT%sT + 4:00 1:00 AQTST 1991 Sep 29 2:00s + 4:00 - AQTT 1992 Jan 19 2:00s # Aqtau Time + 5:00 E-EurAsia AQT%sT 1995 Sep lastSun + 4:00 E-EurAsia AQT%sT # Kirgizstan +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule Kirgiz 1992 max - Apr Sun>=7 0:00 1:00 S +Rule Kirgiz 1991 max - Sep lastSun 0:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Bishkek 4:58:24 - LMT 1924 May 2 5:00 - FRUT 1957 Mar # Frunze Time 6:00 RussiaAsia FRU%sT 1991 Mar 31 2:00s 5:00 1:00 FRUST 1991 Aug 31 # independence - 5:00 RussiaAsia KG%sT # Kirgizstan Time + 5:00 Kirgiz KG%sT # Kirgizstan Time ############################################################################### @@ -630,10 +672,13 @@ Rule Lebanon 1973 1977 - May 1 0:00 1:00 S Rule Lebanon 1978 only - Apr 30 0:00 1:00 S Rule Lebanon 1978 only - Sep 30 0:00 0 - Rule Lebanon 1984 1987 - May 1 0:00 1:00 S -Rule Lebanon 1984 max - Oct 16 0:00 0 - +Rule Lebanon 1984 1991 - Oct 16 0:00 0 - Rule Lebanon 1988 only - Jun 1 0:00 1:00 S Rule Lebanon 1989 only - May 10 0:00 1:00 S -Rule Lebanon 1990 max - May 1 0:00 1:00 S +Rule Lebanon 1990 1992 - May 1 0:00 1:00 S +Rule Lebanon 1992 only - Oct 4 0:00 0 - +Rule Lebanon 1993 max - Mar lastSun 0:00 1:00 S +Rule Lebanon 1993 max - Sep lastSun 0:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Beirut 2:22:00 - LMT 1880 2:00 Lebanon EE%sT @@ -673,8 +718,11 @@ Zone Indian/Maldives 4:54:00 - LMT 1880 # Male # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Mongol 1981 1984 - Apr 1 0:00 1:00 S Rule Mongol 1981 1984 - Oct 1 0:00 0 - -Rule Mongol 1985 max - Mar lastSun 2:00 1:00 S -Rule Mongol 1985 max - Sep lastSun 3:00 0 - +Rule Mongol 1985 1990 - Mar lastSun 2:00 1:00 S +Rule Mongol 1985 1990 - Sep lastSun 3:00 0 - +Rule Mongol 1991 max - Mar lastSun 0:00 1:00 S +Rule Mongol 1991 1995 - Sep lastSun 0:00 0 - +Rule Mongol 1996 max - Oct Fri>=22 0:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] #Zone Asia/Dariv 6:14:32 - LMT 1905 Aug # 6:00 - DART 1978 # Dariv Time @@ -712,9 +760,9 @@ Zone Asia/Karachi 4:28:12 - LMT 1907 Rule EgyptAsia 1957 only - May 10 0:00 1:00 S Rule EgyptAsia 1957 1958 - Oct 1 0:00 0 - Rule EgyptAsia 1958 only - May 1 0:00 1:00 S -Rule EgyptAsia 1959 1981 - May 1 1:00 1:00 S +Rule EgyptAsia 1959 1967 - May 1 1:00 1:00 S Rule EgyptAsia 1959 1965 - Sep 30 3:00 0 - -Rule EgyptAsia 1966 max - Oct 1 3:00 0 - +Rule EgyptAsia 1966 only - Oct 1 3:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Gaza 2:17:52 - LMT 1900 Oct 2:00 - EET 1957 May 10 @@ -806,8 +854,16 @@ Rule Syria 1987 1988 - Oct 31 2:00 0 - Rule Syria 1988 only - Mar 15 2:00 1:00 S Rule Syria 1989 only - Mar 31 2:00 1:00 S Rule Syria 1989 only - Oct 1 2:00 0 - -Rule Syria 1990 max - Apr 1 2:00 1:00 S -Rule Syria 1990 max - Sep 30 2:00 0 - +Rule Syria 1990 only - Apr 1 2:00 1:00 S +Rule Syria 1990 only - Sep 30 2:00 0 - +Rule Syria 1991 only - Apr 1 0:00 1:00 S +Rule Syria 1991 1992 - Oct 1 0:00 0 - +Rule Syria 1992 only - Apr 8 0:00 1:00 S +Rule Syria 1993 only - Mar 26 0:00 1:00 S +Rule Syria 1993 only - Sep 25 0:00 0 - +# IATA SSIM (1996-09) says 1997-03-31; assume that it should be 1997-04-01. +Rule Syria 1994 max - Apr 1 0:00 1:00 S +Rule Syria 1994 max - Oct 1 0:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Damascus 2:25:12 - LMT 1920 2:00 Syria EE%sT @@ -820,10 +876,6 @@ Zone Asia/Dushanbe 4:35:12 - LMT 1924 May 2 5:00 1:00 DUSST 1991 Sep 9 # independence 5:00 RussiaAsia TJ%sT 1992 5:00 - TJT # Tajikistan Time -# Shanks has Dushanbe at 5:00 (6:00 summer) after 1991, -# but a cable from the American Embassy at Dushanbe -# (1996-07-02) -# says that Tajikistan is at 5:00. Guess no DST after 1991. # Thailand # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -836,12 +888,10 @@ Zone Asia/Bangkok 6:42:04 - LMT 1880 Zone Asia/Ashkhabad 3:53:32 - LMT 1924 May 2 # or Ashgabat 4:00 - ASHT 1957 Mar # Ashkhabad Time 5:00 RussiaAsia ASH%sT 1991 Mar 31 2:00s - 4:00 1:00 ASHST 1991 Oct 27 # independence - 4:00 RussiaAsia TM%sT 1992 # Turkmenistan Time - 4:00 - TMT -# Shanks has Ashkhabad at 4:00 (5:00 summer) after 1991, but -# DHL (1996-07-26) -# reports 4:00. Guess no DST after 1991. + 4:00 1:00 ASHST 1991 Sep 29 2:00s + 4:00 - ASHT 1991 Oct 27 # independence + 4:00 - TMT 1992 Jan 19 2:00s + 5:00 - TMT # Turkmenistan Time # United Arab Emirates # Zone NAME GMTOFF RULES FORMAT [UNTIL] diff --git a/time/australasia b/time/australasia index 27e018bcde..be15771b07 100644 --- a/time/australasia +++ b/time/australasia @@ -1,4 +1,4 @@ -# @(#)australasia 7.29 +# @(#)australasia 7.30 # This file also includes Pacific islands. # Notes are at the end of this file @@ -35,17 +35,33 @@ Zone Australia/Perth 7:43:24 - LMT 1895 Dec 8:00 1:00 WST 1992 Mar Sun>=1 2:00s 8:00 - WST # Queensland +# +# From Alex Livingston (1996-11-01): +# I have heard or read more than once that some resort islands off the coast +# of Queensland chose to keep observing daylight-saving time even after +# Queensland ceased to. +# +# From Paul Eggert (1996-11-22): +# IATA SSIM (1993-02/1994-09) say that the Holiday Islands (Hayman, Lindeman, +# Hamilton) observed DST for two years after the rest of Queensland stopped. +# Hamilton is the largest, but there is also a Hamilton in Victoria, +# so use Lindeman. +# +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule QL 1989 1991 - Oct lastSun 2:00s 1:00 - +Rule QL 1990 1992 - Mar Sun>=1 2:00s 0 - +Rule Holiday 1989 1993 - Oct lastSun 2:00s 1:00 - +Rule Holiday 1990 1994 - Mar Sun>=1 2:00s 0 - Zone Australia/Brisbane 10:12:08 - LMT 1895 10:00 - EST 1917 Jan 1 0:01 10:00 Aus EST 1971 Oct lastSun 2:00s 10:00 1:00 EST 1972 Feb lastSun 2:00s - 10:00 - EST 1989 Oct lastSun 2:00s - 10:00 1:00 EST 1990 Mar Sun>=1 2:00s - 10:00 - EST 1990 Oct lastSun 2:00s - 10:00 1:00 EST 1991 Mar Sun>=1 2:00s - 10:00 - EST 1991 Oct lastSun 2:00s - 10:00 1:00 EST 1992 Mar Sun>=1 2:00s - 10:00 - EST + 10:00 QL EST +Zone Australia/Lindeman 9:55:56 - LMT 1895 + 10:00 - EST 1917 Jan 1 0:01 + 10:00 Aus EST 1971 Oct lastSun 2:00s + 10:00 1:00 EST 1972 Feb lastSun 2:00s + 10:00 Holiday EST # South Australia # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S @@ -289,11 +305,13 @@ Rule NZ 1990 max - Oct Sun>=1 2:00s 1:00 D Rule NZ 1975 only - Feb 23 2:00s 0 S Rule NZ 1976 1989 - Mar Sun>=1 2:00s 0 S Rule NZ 1990 max - Mar Sun>=15 2:00s 0 S +Rule Chatham 1990 max - Oct Sun>=1 2:45s 1:00 D +Rule Chatham 1991 max - Mar Sun>=15 2:45s 0 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Pacific/Auckland 11:39:04 - LMT 1868 11:30 NZ NZ%sT 1940 Sep 29 2:00 12:00 NZ NZ%sT -Zone Pacific/Chatham 12:45 NZ CHA%sT +Zone Pacific/Chatham 12:45 Chatham CHA%sT # Antipodes Is, Kermadec Is @@ -375,9 +393,9 @@ Zone Pacific/Funafuti 11:56:52 - LMT 1901 Rule Vanuatu 1983 only - Sep 25 0:00 1:00 S Rule Vanuatu 1984 1991 - Mar Sun>=23 0:00 0 - Rule Vanuatu 1984 only - Oct 23 0:00 1:00 S -Rule Vanuatu 1985 1990 - Sep Sun>=23 0:00 1:00 S -Rule Vanuatu 1991 max - Sep lastSun 0:00 1:00 S -Rule Vanuatu 1992 max - Mar lastSun 0:00 0 - +Rule Vanuatu 1985 1991 - Sep Sun>=23 0:00 1:00 S +Rule Vanuatu 1992 1993 - Jan Sun>=23 0:00 0 - +Rule Vanuatu 1992 only - Oct Sun>=23 0:00 1:00 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Pacific/Efate 11:13:16 - LMT 1912 Jan 13 # Vila 11:00 Vanuatu VU%sT # Vanuatu Time @@ -400,11 +418,19 @@ Zone Pacific/Wallis 12:15:20 - LMT 1901 # go ahead and edit the file (and please send any changes to # tz@elsie.nci.nih.gov for general use in the future). -# From Paul Eggert (1996-01-22); +# From Paul Eggert (1996-11-22): # A good source for time zone historical data outside the U.S. is # Thomas G. Shanks, The International Atlas (3rd edition), # San Diego: ACS Publications, Inc. (1991). -# Except where noted, it is the source for the data above. +# +# Gwillim Law writes that a good source +# for recent time zone data is the International Air Transport +# Association's Standard Schedules Information Manual (IATA SSIM), +# published semiannually. Law sent in several helpful summaries +# of the IATA's data after 1990. +# +# Except where otherwise noted, Shanks is the source for entries through 1990, +# and IATA SSIM is the source for entries after 1990. # # Another source occasionally used is Edward W. Whitman, World Time Differences, # Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which @@ -799,8 +825,11 @@ Zone Pacific/Wallis 12:15:20 - LMT 1901 # time on both the first Sunday in October and the third Sunday in March. # As with Australia, we'll assume the tradition is 2:00s, not 2:00. # -# Shanks gives no data for Chatham, but usno1995 says it's +12:45/+13:45. -# Guess NZ switchover rules for now. +# From Paul Eggert (1996-11-22): +# Shanks gives no data for Chatham; usno1989 says it's +12:45, +# usno1995 says it's +12:45/+13:45, and IATA SSIM (1991/1996) +# gives the NZ rules but with transitions at 2:45 local standard time. +# Guess that they adopted DST in 1990. ############################################################################### diff --git a/time/etcetera b/time/etcetera index 73ad68ee0a..c47fae7a68 100644 --- a/time/etcetera +++ b/time/etcetera @@ -1,15 +1,19 @@ -# @(#)etcetera 7.5 +# @(#)etcetera 7.6 -# All of these are set up just so people can "zic -l" to a timezone -# that's right for their area, even if it doesn't have a name or DST rules -# (half hour zones are too much to bother with -- when someone asks!) +# These entries are mostly present for historical reasons, so that +# people in areas not otherwise covered by the tz files could "zic -l" +# to a time zone that was right for their area. These days, the +# tz files cover almost all the inhabited world, so there's little +# need now for the entries that are not on UTC. Zone Etc/GMT 0 - GMT -Link Etc/GMT Etc/UTC -Link Etc/GMT Etc/UCT -Link Etc/GMT Etc/Universal +Zone Etc/UTC 0 - UTC +Zone Etc/UCT 0 - UCT + +Link Etc/UTC Etc/Universal +Link Etc/UTC Etc/Zulu + Link Etc/GMT Etc/Greenwich -Link Etc/GMT Etc/Zulu Link Etc/GMT Etc/GMT-0 Link Etc/GMT Etc/GMT+0 Link Etc/GMT Etc/GMT0 diff --git a/time/europe b/time/europe index abeba98386..6eb92b769d 100644 --- a/time/europe +++ b/time/europe @@ -1,14 +1,22 @@ -# @(#)europe 7.40 +# @(#)europe 7.41 # This data is by no means authoritative; if you think you know better, # go ahead and edit the file (and please send any changes to # tz@elsie.nci.nih.gov for general use in the future). -# From Paul Eggert (1996-09-03): +# From Paul Eggert (1996-11-22): # A good source for time zone historical data outside the U.S. is # Thomas G. Shanks, The International Atlas (3rd edition), # San Diego: ACS Publications, Inc. (1991). -# Except where otherwise noted, it is the source for the data below. +# +# Gwillim Law writes that a good source +# for recent time zone data is the International Air Transport +# Association's Standard Schedules Information Manual (IATA SSIM), +# published semiannually. Law sent in several helpful summaries +# of the IATA's data after 1990. +# +# Except where otherwise noted, Shanks is the source for entries through 1990, +# and IATA SSIM is the source for entries after 1990. # # Another source occasionally used is Edward W. Whitman, World Time Differences, # Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which @@ -27,6 +35,7 @@ # 0:00 WET WEST Western Europe # 1:00 CET CEST Central Europe # 2:00 EET EEST Eastern Europe +# 3:00 MSK MSD Moscow # # See the `africa' file for time zone naming and abbreviation conventions. # @@ -826,6 +835,14 @@ Rule C-Eur 1979 1995 - Sep lastSun 2:00s 0 - Rule C-Eur 1981 max - Mar lastSun 2:00s 1:00 S Rule C-Eur 1996 max - Oct lastSun 2:00s 0 - +# E-Eur differs from EU only in that E-Eur switches at midnight local time. +Rule E-Eur 1977 1980 - Apr Sun>=1 0:00 1:00 S +Rule E-Eur 1977 only - Sep lastSun 0:00 0 - +Rule E-Eur 1978 only - Oct 1 0:00 0 - +Rule E-Eur 1979 1995 - Sep lastSun 0:00 0 - +Rule E-Eur 1981 max - Mar lastSun 0:00 1:00 S +Rule E-Eur 1996 max - Oct lastSun 0:00 0 - + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Russia 1917 only - Jul 1 23:00 1:00 MST # Moscow Summer Time Rule Russia 1917 only - Dec 28 0:00 0 MMT # Moscow Mean Time @@ -836,15 +853,20 @@ Rule Russia 1919 only - Jul 1 2:00 1:00 S Rule Russia 1919 only - Aug 16 0:00 0 - Rule Russia 1921 only - Feb 14 23:00 1:00 S # Shanks gives 1921 Mar 21 for the following transition. -# From Andrew A. Chernov (1993-11-12): +# From Andrey A. Chernov (1993-11-12): # My sources says, that it is Mar 20, not 21. Rule Russia 1921 only - Mar 20 23:00 2:00 DS Rule Russia 1921 only - Sep 1 0:00 1:00 S Rule Russia 1921 only - Oct 1 0:00 0 - Rule Russia 1981 1984 - Apr 1 0:00 1:00 S Rule Russia 1981 1983 - Oct 1 0:00 0 - -Rule Russia 1984 max - Sep lastSun 2:00s 0 - -Rule Russia 1985 max - Mar lastSun 2:00s 1:00 S +Rule Russia 1984 1991 - Sep lastSun 2:00s 0 - +Rule Russia 1985 1991 - Mar lastSun 2:00s 1:00 S +Rule Russia 1992 only - Mar lastSat 23:00 1:00 S +Rule Russia 1992 only - Sep lastSat 23:00 0 - +Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S +Rule Russia 1993 1995 - Sep lastSun 2:00s 0 - +Rule Russia 1996 max - Oct lastSun 2:00s 0 - # These are for backward compatibility with older versions. @@ -913,7 +935,8 @@ Rule Albania 1984 only - Oct 1 0:00 0 - Zone Europe/Tirane 1:19:20 - LMT 1914 1:00 - CET 1940 Jun 16 1:00 Albania CE%sT 1985 Mar 31 1:00 - 1:00 W-Eur CE%sT + 1:00 W-Eur CE%sT 1991 + 1:00 EU CE%sT # Andorra # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -944,11 +967,13 @@ Zone Europe/Vienna 1:05:20 - LMT 1893 Apr # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Europe/Minsk 1:50:16 - LMT 1880 2:30:20 Russia %s 1919 Jul 1 2:00 - 3:00 Russia MOS%sT 1922 Oct # Moscow Time + 3:00 Russia MSK/MSD 1922 Oct 2:00 - EET 1930 Jun 21 - 3:00 Russia MOS%sT 1991 Mar 31 2:00s + 3:00 Russia MSK/MSD 1991 Mar 31 2:00s 2:00 1:00 EEST 1991 Sep 29 2:00s - 2:00 C-Eur EE%sT + 2:00 - EET 1992 Mar 29 0:00 + 2:00 1:00 EEST 1992 Sep 27 0:00 + 2:00 Russia EE%sT # Belgium # Whitman and Shanks disagree; go with Shanks, usually. @@ -1021,7 +1046,8 @@ Zone Europe/Sofia 1:33:16 - LMT 1880 1:00 C-Eur CE%sT 1945 Apr 2 3:00 2:00 - EET 1979 Mar 31 23:00 2:00 Bulg EE%sT 1982 Sep 26 2:00 - 2:00 C-Eur EE%sT + 2:00 C-Eur EE%sT 1991 + 2:00 E-Eur EE%sT # Croatia # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -1077,30 +1103,54 @@ Zone Europe/Copenhagen 0:50:20 - LMT 1890 Zone Atlantic/Faeroe -0:27:04 - LMT 1908 Jan 11 # Torshavn 0:00 - WET 1981 0:00 EU WE%sT -Zone America/Scoresbysund -1:29:00 - LMT 1916 Jul 28 +# +# From Paul Eggert (1996-11-22): +# Greenland joined the EU as part of Denmark, obtained home rule on 1979-05-01, +# and left the EU on 1985-02-01. It therefore should have been using EU +# rules at least through 1984. Shanks says Scoresbysund and Godthab +# used C-Eur rules after 1980, but IATA SSIM (1991/1996) says they use EU +# rules since at least 1991. Assume EU rules since 1980. + +# +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule Thule 1993 max - Apr Sun>=1 2:00 1:00 D +Rule Thule 1993 max - Oct lastSun 2:00 0 S +# +# Zone NAME GMTOFF RULES FORMAT [UNTIL] +Zone America/Scoresbysund -1:29:00 - LMT 1916 Jul 28 # Ittoqqortoormit -2:00 - CGT 1980 Apr 6 2:00 -2:00 C-Eur CG%sT 1981 Mar 29 - -1:00 C-Eur EG%sT -Zone America/Godthab -3:26:56 - LMT 1916 Jul 28 + -1:00 EU EG%sT +Zone America/Godthab -3:26:56 - LMT 1916 Jul 28 # Nuuk -3:00 - WGT 1980 Apr 6 2:00 - -3:00 C-Eur WG%sT -Zone America/Thule -4:35:08 - LMT 1916 Jul 28 - -4:00 - AST + -3:00 EU WG%sT +Zone America/Thule -4:35:08 - LMT 1916 Jul 28 # Pituffik + -4:00 Thule A%sT # Estonia # From Peter Ilieve (1994-10-15): # A relative in Tallinn confirms the accuracy of the data for 1989 onwards # [through 1994] and gives the legal authority for it, # a regulation of the Government of Estonia, No. 111 of 1989.... +# +# From Peter Ilieve (1996-10-28): +# [IATA SSIM (1992/1996) claims that the Baltic republics switch at 01:00s, +# but a relative confirms that Estonia still switches at 02:00s, writing:] +# ``I do not [know] exactly but there are some little different +# (confusing) rules for International Air and Railway Transport Schedules +# conversion in Sunday connected with end of summer time in Estonia.... +# A discussion is running about the summer time efficiency and effect on +# human physiology. It seems that Estonia maybe will not change to +# summer time next spring.'' # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Europe/Tallinn 1:39:00 - LMT 1880 1:39:00 - TMT 1918 Feb # Tallinn Mean Time 1:00 C-Eur CE%sT 1919 Jul 1:39:00 - TMT 1921 May 2:00 - EET 1940 Aug 6 - 3:00 - MOST 1941 Sep 15 # Moscow Time + 3:00 - MSK 1941 Sep 15 1:00 C-Eur CE%sT 1944 Sep 22 - 3:00 Russia MOS%sT 1989 Mar 26 2:00s + 3:00 Russia MSK/MSD 1989 Mar 26 2:00s 2:00 1:00 EEST 1989 Sep 24 2:00s 2:00 C-Eur EE%sT @@ -1418,6 +1468,14 @@ Link Europe/Rome Europe/Vatican Link Europe/Rome Europe/San_Marino # Latvia +# From Paul Eggert (1996-11-22): +# Rules after 1991 are by extension from Shanks. They contradict +# IATA SSIM (1992/1996), which claims Latvia uses W-Eur rules, but +# Peter Ilieve's relative writes that Latvia switched in September this year, +# so we'll assume that the old C-Eur-style rules still apply. +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule Latvia 1992 max - Mar lastSun 2:00s 1:00 S +Rule Latvia 1992 max - Sep lastSun 2:00s 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Europe/Riga 1:36:24 - LMT 1880 1:36:24 - RMT 1918 Apr 15 2:00 #Riga Mean Time @@ -1426,11 +1484,11 @@ Zone Europe/Riga 1:36:24 - LMT 1880 1:36:24 1:00 LST 1919 May 22 3:00 1:36:24 - RMT 1926 May 11 2:00 - EET 1940 Aug 5 - 3:00 - MOST 1941 Jul # Moscow Time + 3:00 - MSK 1941 Jul 1:00 C-Eur CE%sT 1944 Aug 8 - 3:00 Russia MOS%sT 1991 Mar 31 2:00s + 3:00 Russia MSK/MSD 1991 Mar 31 2:00s 2:00 1:00 EEST 1991 Sep 29 2:00s - 2:00 C-Eur EE%sT + 2:00 Latvia EE%sT # Liechtenstein # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -1446,11 +1504,14 @@ Zone Europe/Vilnius 1:41:16 - LMT 1880 1:00 - CET 1920 Jul 12 2:00 - EET 1920 Oct 9 1:00 - CET 1940 Aug 3 - 3:00 - MOST 1941 Jun 24 # Moscow Time + 3:00 - MSK 1941 Jun 24 1:00 C-Eur CE%sT 1944 Aug - 3:00 Russia MOS%sT 1991 Mar 31 2:00s + 3:00 Russia MSK/MSD 1991 Mar 31 2:00s 2:00 1:00 EEST 1991 Sep 29 2:00s 2:00 C-Eur EE%sT +# From Paul Eggert (1996-11-22): +# IATA SSIM (1992/1996) says Lithuania uses W-Eur rules, but since it is +# known to be wrong about Estonia and Latvia, assume it's wrong here too. # Luxembourg # Whitman disagrees with most of these dates in minor ways; go with Shanks. @@ -1517,9 +1578,9 @@ Zone Europe/Malta 0:58:04 - LMT 1893 Nov 2 # Valletta # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Europe/Chisinau 1:55:20 - LMT 1924 May 2 2:00 - EET 1930 Jun 21 - 3:00 Russia MOS%sT 1991 Mar 31 2:00s # Moscow Time + 3:00 Russia MSK/MSD 1991 Mar 31 2:00s 2:00 1:00 EEST 1991 Sep 29 2:00s - 2:00 C-Eur EE%sT + 2:00 E-Eur EE%sT # Monaco # Shanks gives 0:09 for Paris Mean Time; go with Howse's more precise 0:09:21. @@ -1631,9 +1692,30 @@ Zone Europe/Warsaw 1:24:00 - LMT 1880 1:00 C-Eur CE%sT 1944 Oct 1:00 Poland CE%sT 1977 Apr 3 1:00 1:00 W-Eur CE%sT +# IATA SSIM (1991/1996) gives EU rules, but the _The Warsaw Voice_ +# +# (1995-09-24) says the autumn 1995 switch was at 02:00. +# Stick with W-Eur for now. # Portugal # Gregorian calendar adopted 1582-10-15. +# +# From Rui Pedro Salgueiro (1992-11-12): +# Portugal has recently (September, 27) changed timezone +# (from WET to MET or CET) to harmonize with EEC. +# +# Martin Bruckmann (1996-02-29) reports via Peter Ilieve +# that Portugal is reverting to 0:00 by not moving its clocks this spring. +# The new Prime Minister was fed up with getting up in the dark in the winter. +# +# From Paul Eggert (1996-11-12): +# IATA SSIM (1991-09) reports several 1991-09 and 1992-09 transitions +# at 02:00u, not 01:00u. Assume that these are typos. +# IATA SSIM (1991/1992) reports that the Azores were at -1:00. +# IATA SSIM (1993-02) says +0:00; later issues (through 1996-09) say -1:00. +# Guess that the Azores changed to EU rules in 1992 (since that's when Portugal +# harmonized with the EU), and that they stayed +0:00 that winter. +# # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Port 1916 only - Jun 17 23:00 1:00 S # Whitman gives 1916 Oct 31; go with Shanks. @@ -1701,23 +1783,16 @@ Zone Europe/Lisbon -0:36:32 - LMT 1884 0:00 Port WE%sT 1966 Apr 3 2:00 1:00 - CET 1976 Sep 26 1:00 0:00 Port WE%sT 1983 Sep 25 1:00s -# From Rui Pedro Salgueiro (1992-11-12): -# Portugal has recently (September, 27) changed timezone -# (from WET to MET or CET) to harmonize with EEC. - 0:00 EU WE%sT 1992 Sep 27 1:00s -# Martin Bruckmann (1996-02-29) reports via Peter Ilieve -# that Portugal is reverting to 0:00 by not moving its clocks this spring. -# The new Prime Minister was fed up with getting up in the dark in the winter. + 0:00 W-Eur WE%sT 1992 Sep 27 1:00s 1:00 EU CE%sT 1996 Mar 31 1:00u 0:00 EU WE%sT -# We don't know what happened to Madeira or the Azores, -# so we'll just use Shanks for now. -# Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Atlantic/Azores -1:42:40 - LMT 1884 # Ponta Delgada -1:55 - HMT 1911 May 24 # Horta Mean Time -2:00 Port AZO%sT 1966 Apr 3 2:00 # Azores Time -1:00 Port AZO%sT 1983 Sep 25 1:00s - -1:00 W-Eur AZO%sT + -1:00 W-Eur AZO%sT 1992 Sep 27 1:00s + 0:00 EU WE%sT 1993 Mar 28 1:00u + -1:00 EU AZO%sT Zone Atlantic/Madeira -1:07:36 - LMT 1884 # Funchal -1:08 - FMT 1911 May 24 # Funchal Mean Time -1:00 Port MAD%sT 1966 Apr 3 2:00 # Madeira Time @@ -1733,38 +1808,62 @@ Rule Romania 1979 only - May 27 0:00 1:00 S Rule Romania 1979 only - Sep lastSun 0:00 0 - Rule Romania 1980 only - Apr 5 23:00 1:00 S Rule Romania 1980 only - Sep lastSun 1:00 0 - +Rule Romania 1991 1993 - Mar lastSun 0:00s 1:00 S +Rule Romania 1991 1993 - Sep lastSun 0:00s 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Europe/Bucharest 1:44:24 - LMT 1891 Oct 1:44:24 - BMT 1931 Jul 24 # Bucharest MT 2:00 Romania EE%sT 1981 Mar 29 2:00s - 2:00 C-Eur EE%sT + 2:00 C-Eur EE%sT 1991 + 2:00 Romania EE%sT 1994 + 2:00 E-Eur EE%sT # Russia # From Shanks (1991): # In 1929 the Soviet Union instituted a 5 day week; in 1932 it instituted # a 6 day week; on 1940-06-27 it returned to the Gregorian week. # -# From Paul Eggert (1996-09-03): -# Moscow rules after 1991 are from Andrew A. Chernov . -# I invented the time zone names, and (unless otherwise specified) -# guessed what happened after 1991; the clocks were chaotic, and we know little. -# The rest is from Shanks. +# From Paul Eggert (1996-11-22): +# Except for Moscow after 1919-07-01, I invented the time zone abbreviations, +# and (unless otherwise specified) guessed what happened after 1991. +# Moscow time zone abbreviations after 1919-07-01, and Moscow rules after 1991, +# are from Andrey A. Chernov. The rest is from Shanks and the IATA. +# +# From Andrey A. Chernov (1996-10-04): +# `MSK' and `MSD' were born and used initially on Moscow computers with +# Unix-like OSes by several developer groups (e.g. Demos group, Kiae group).... +# The next step was the UUCP network, the Relcom predecessor +# (used mainly for mail), and MSK/MSD was actively used there. +# +# From Chris Carrier <72157.3334@CompuServe.COM> (1996-10-30): +# According to a friend of mine who rode the Trans-Siberian Railroad from +# Moscow to Irkutsk in 1995, public air and rail transport in Russia ... +# still follows Moscow time, no matter where in Russia it is located. # # Zone NAME GMTOFF RULES FORMAT [UNTIL] +Zone Europe/Kaliningrad 1:22:00 - LMT 1893 Apr + 1:00 C-Eur CE%sT 1945 + 2:00 Poland CET 1946 + 3:00 Russia MSK/MSD 1991 Mar 31 2:00s + 2:00 1:00 EEST 1991 Sep 29 2:00s + 2:00 - EET 1992 Jan 19 2:00s + 3:00 Russia MSK/MSD 1994 +# IATA SSIM (1994-02) says Kaliningrad is at UTC+2; guess 1994 change. + 2:00 Russia EE%sT Zone Europe/Moscow 2:30:20 - LMT 1880 2:30:20 Russia %s 1919 Jul 1 2:00 - 3:00 Russia MOS%sT 1922 Oct # Moscow TIme + 3:00 Russia MSK/MSD 1922 Oct 2:00 - EET 1930 Jun 21 - 3:00 Russia MOS%sT 1991 Mar 31 2:00s + 3:00 Russia MSK/MSD 1991 Mar 31 2:00s 2:00 1:00 EEST 1991 Sep 29 2:00s 2:00 - EET 1992 Jan 19 2:00s - 3:00 Russia MOS%sT -Zone Europe/Kuybyshev 3:20:36 - LMT 1924 May 2 + 3:00 Russia MSK/MSD +Zone Europe/Samara 3:20:36 - LMT 1924 May 2 3:00 - KUYT 1957 Mar # Kuybyshev Time 4:00 Russia KUY%sT 1991 Mar 31 2:00s 3:00 1:00 KUYST 1991 Sep 29 2:00s - 3:00 - KUYT 1992 Jan 19 2:00s - 4:00 Russia KUY%sT + 3:00 - SAMT 1992 Jan 19 2:00s # Samara Time + 4:00 Russia SAM%sT Zone Asia/Yekaterinburg 4:02:34 - LMT 1924 May 2 4:00 - SVET 1957 Mar # Sverdlovsk Time 5:00 Russia SVE%sT 1991 Mar 31 2:00s @@ -1916,6 +2015,8 @@ Zone Atlantic/Canary -1:01:36 - LMT 1922 Mar # Las Palmas de Gran C. 0:00 - WET 1980 Apr 6 0:00s 0:00 1:00 WEST 1980 Sep 28 0:00s 0:00 EU WE%sT +# IATA SSIM (1996-09) says the Canaries switch at 2:00u, not 1:00u. +# Ignore this for now, as the Canaries are part of the EU. # Sweden @@ -2026,7 +2127,8 @@ Zone Europe/Istanbul 1:55:52 - LMT 1880 2:00 Turkey EE%sT 1978 Oct 15 3:00 Turkey TR%sT 1985 Apr 20 # Turkey Time 2:00 Turkey EE%sT 1986 - 2:00 C-Eur EE%sT + 2:00 C-Eur EE%sT 1991 + 2:00 EU EE%sT Link Europe/Istanbul Asia/Istanbul # Istanbul is in both continents. # Ukraine @@ -2053,23 +2155,28 @@ Rule Crimea 1921 only - Feb 14 23:00 1:00 CST Rule Crimea 1921 only - Mar 21 23:00 2:00 CDST Rule Crimea 1921 only - Sep 1 0:00 1:00 CST Rule Crimea 1921 only - Oct 1 0:00 0 NMT +Rule Crimea 1996 max - Mar lastSun 0:00u 1:00 - +Rule Crimea 1996 max - Oct lastSun 0:00u 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Europe/Kiev 2:02:04 - LMT 1880 2:02:04 Ukraine %s 1924 May 2 2:00 - EET 1930 Jun 21 - 3:00 Russia MOS%sT 1990 Jul 17 # Moscow Time - 2:00 C-Eur EE%sT + 3:00 Russia MSK/MSD 1990 Jul 17 + 2:00 E-Eur EE%sT 1996 + 2:00 EU EE%sT Zone Europe/Simferopol 2:16:24 - LMT 1880 2:08:00 Crimea %s 1924 May 2 2:00 - EET 1930 Jun 21 - 3:00 Russia MOS%sT 1991 Mar 31 2:00s + 3:00 Russia MSK/MSD 1991 Mar 31 2:00s 2:00 1:00 EEST 1991 Sep 29 2:00s -# From Paul Eggert (1994-05-28): -# Today's _Economist_ (p 45) reports that Crimea switched -# from Kiev to Moscow time sometime after the January elections. -# For now, we'll guess that there was a 2-hour leap forward on March 27. - 2:00 C-Eur EE%sT 1994 Mar 27 2:00s - 3:00 Russia MOS%sT +# From Paul Eggert (1996-10-21): +# The _Economist_ (1994-05-28, p 45) reports that most of Crimea switched +# from Kiev to Moscow time sometime after the January 1994 elections. +# For now, guess it changed Feb 1. + 2:00 C-Eur EE%sT 1994 Feb +# From IATA SSIM (1994/1996), which also says that Kerch is still like Kiev. + 3:00 E-Eur MSK/MSD 1996 + 3:00 Crimea MSK/MSD # Yugoslavia # Zone NAME GMTOFF RULES FORMAT [UNTIL] diff --git a/time/northamerica b/time/northamerica index 5c0c02cc93..af81c5edb9 100644 --- a/time/northamerica +++ b/time/northamerica @@ -1,4 +1,4 @@ -# @(#)northamerica 7.28 +# @(#)northamerica 7.29 # also includes Central America and the Caribbean # This data is by no means authoritative; if you think you know better, @@ -462,11 +462,19 @@ Link Pacific/Honolulu HST ################################################################################ -# From Paul Eggert (1993-11-18): +# From Paul Eggert (1996-11-22): # A good source for time zone historical data outside the US is # Thomas G. Shanks, The International Atlas (3rd edition), # San Diego: ACS Publications, Inc. (1991). -# Except where otherwise noted, it is the source for the data below. +# +# Gwillim Law writes that a good source +# for recent time zone data is the International Air Transport +# Association's Standard Schedules Information Manual (IATA SSIM), +# published semiannually. Law sent in several helpful summaries +# of the IATA's data after 1990. +# +# Except where otherwise noted, Shanks is the source for entries through 1990, +# and IATA SSIM is the source for entries after 1990. # # Another source occasionally used is Edward W. Whitman, World Time Differences, # Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which @@ -523,7 +531,7 @@ Rule Canada 1974 max - Oct lastSun 2:00 0 S Rule Canada 1987 max - Apr Sun>=1 2:00 1:00 D -# Newfoundland +# Newfoundland (except Labrador) # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule StJohns 1917 1918 - Apr Sun>=8 2:00 1:00 D @@ -560,11 +568,23 @@ Rule StJohns 1989 max - Apr Sun>=1 2:00 1:00 D # St John's has an apostrophe, but Posix file names can't have apostrophes. # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone America/St_Johns -3:30:52 - LMT 1884 - -3:31 StJohns N%sT 1935 Mar 30 + -3:30:52 StJohns N%sT 1935 Mar 30 -3:30 StJohns N%sT -# Labrador, New Brunswick, Nova Scotia, Prince Edward I +# east Labrador + +# The name `Happy Valley-Goose Bay' is too long; use `Goose Bay'. +# Zone NAME GMTOFF RULES FORMAT [UNTIL] +Zone America/Goose_Bay -4:01:40 - LMT 1884 # Happy Valley-Goose Bay + -3:30:52 StJohns NST 1919 + -3:30:52 - NST 1935 Mar 30 + -3:30 - NST 1936 + -3:30 StJohns N%sT 1966 Mar 15 2:00 + -4:00 StJohns A%sT + + +# west Labrador, New Brunswick, Nova Scotia, Prince Edward I # From Paul Eggert (1996-06-12): # Shanks writes that since 1970 most of this region has been like Halifax. @@ -825,9 +845,17 @@ Zone America/Dawson_Creek -8:00:56 - LMT 1884 # Northwest Territories, Yukon -# From Paul Eggert (1996-06-12): +# From Paul Eggert (1996-10-07): # Dawson switched to PST in 1973. Inuvik switched to MST in 1979. # Shanks's table for Watson Lake is corrupted, so we have no data there. +# Mathew Englander (1996-10-07) gives the following refs: +# * 1967. Paragraph 28(34)(g) of the Interpretation Act, S.C. 1967-68, +# c. 7 defines Yukon standard time as UTC-9. This is still valid; +# see Interpretation Act, R.S.C. 1985, c. I-21, s. 35(1). +# * C.O. 1973/214 switched Yukon to PST on 1973-10-28 00:00. +# * O.I.C. 1980/02 established DST. +# * O.I.C. 1987/056 changed DST to Apr firstSun 2:00 to Oct lastSun 2:00. +# Shanks says Yukon's 1973-10-28 switch was at 2:00; go with Englander. # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule NT_YK 1918 only - Apr 14 2:00 1:00 D @@ -857,7 +885,7 @@ Zone America/Whitehorse -9:00:12 - LMT 1900 Aug 20 -9:00 NT_YK Y%sT 1966 Jul 1 2:00 -8:00 NT_YK P%sT Zone America/Dawson -9:17:40 - LMT 1900 Aug 20 - -9:00 NT_YK Y%sT 1973 Oct lastSun 2:00 + -9:00 NT_YK Y%sT 1973 Oct 28 0:00 -8:00 NT_YK P%sT @@ -1070,8 +1098,10 @@ Zone America/Cayman -5:25:32 - LMT 1890 # Georgetown # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule CR 1979 1980 - Feb lastSun 0:00 1:00 D Rule CR 1979 1980 - Jun Sun>=1 0:00 0 S -Rule CR 1991 only - Jan 19 0:00 1:00 D -Rule CR 1991 only - Jul 1 0:00 0 S +Rule CR 1991 1992 - Jan Sat>=15 0:00 1:00 D +# IATA SSIM (1991-09) says the following was at 1:00; go with Shanks. +Rule CR 1991 only - Jul 1 0:00 0 S +Rule CR 1992 only - Mar 15 0:00 0 S # There are too many San Joses elsewhere, so we'll use `Costa Rica'. # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone America/Costa_Rica -5:36:20 - LMT 1890 # San Jose @@ -1114,10 +1144,11 @@ Rule Cuba 1978 only - May 7 0:00 1:00 D Rule Cuba 1978 1980 - Oct Sun>=8 0:00 0 S Rule Cuba 1979 1980 - Mar Sun>=15 0:00 1:00 D Rule Cuba 1981 1985 - May Sun>=5 0:00 1:00 D -Rule Cuba 1981 max - Oct Sun>=8 0:00 0 S +Rule Cuba 1981 1990 - Oct Sun>=8 0:00 0 S Rule Cuba 1986 1989 - Mar Sun>=14 0:00 1:00 D -Rule Cuba 1990 only - Apr 1 0:00 1:00 D -Rule Cuba 1991 max - Mar Sun>=14 0:00 1:00 D +Rule Cuba 1990 max - Apr Sun>=1 0:00 1:00 D +Rule Cuba 1991 1995 - Oct Sun>=8 0:00s 0 S +Rule Cuba 1996 max - Oct Sun>=1 0:00s 0 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone America/Havana -5:29:28 - LMT 1890 @@ -1168,6 +1199,8 @@ Rule Guat 1973 only - Nov 25 0:00 1:00 D Rule Guat 1974 only - Feb 24 0:00 0 S Rule Guat 1983 only - May 21 0:00 1:00 D Rule Guat 1983 only - Sep 22 0:00 0 S +Rule Guat 1991 only - Mar 23 0:00 1:00 D +Rule Guat 1991 only - Sep 7 0:00 0 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone America/Guatemala -6:02:04 - LMT 1918 Oct 5 -6:00 Guat C%sT @@ -1177,8 +1210,9 @@ Zone America/Guatemala -6:02:04 - LMT 1918 Oct 5 Rule Haiti 1983 only - May 8 0:00 1:00 D Rule Haiti 1984 1987 - Apr lastSun 0:00 1:00 D Rule Haiti 1983 1987 - Oct lastSun 0:00 0 S -Rule Haiti 1988 max - Apr Sun>=1 2:00 1:00 D -Rule Haiti 1988 max - Oct lastSun 2:00 0 S +# Shanks says AT is 2:00, but IATA SSIM (1991/1996) says 1:00s. Go with IATA. +Rule Haiti 1988 max - Apr Sun>=1 1:00s 1:00 D +Rule Haiti 1988 max - Oct lastSun 1:00s 0 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone America/Port-au-Prince -4:49:20 - LMT 1890 -4:49 - PPMT 1917 Jan 24 12:00 # P-a-P MT @@ -1203,7 +1237,8 @@ Zone America/Tegucigalpa -5:48:52 - LMT 1921 Apr Zone America/Jamaica -5:07:12 - LMT 1890 # Kingston -5:07 - KMT 1912 Feb # Kingston Mean Time -5:00 - EST 1974 Jan 6 2:00 - -5:00 US E%sT + -5:00 US E%sT 1984 + -5:00 - EST # Martinique # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -1222,12 +1257,15 @@ Zone America/Montserrat -4:08:52 - LMT 1911 Jul 1 0:01 # Plymouth # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Nic 1979 1980 - Mar Sun>=16 0:00 1:00 D Rule Nic 1979 1980 - Jun Mon>=23 0:00 0 S +Rule Nic 1992 only - Jan 1 4:00 1:00 D +Rule Nic 1992 only - Sep 24 0:00 0 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone America/Managua -5:45:08 - LMT 1890 -5:45 - MMT 1934 Jun 23 # Managua Mean Time -6:00 - CST 1973 May -5:00 - EST 1975 Feb 16 - -6:00 Nic C%sT + -6:00 Nic C%sT 1993 Jan 1 4:00 + -5:00 - EST # Panama # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -1268,11 +1306,17 @@ Zone America/St_Vincent -4:04:56 - LMT 1890 # Kingstown -4:00 - AST # Turks and Caicos +# From Paul Eggert (1996-11-22): +# Shanks says they use US DST rules, but IATA SSIM (1991/1996) +# says they switch at midnight. Go with IATA SSIM. +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule TC 1979 1986 - Apr lastSun 0:00 1:00 D +Rule TC 1979 max - Oct lastSun 0:00 0 S +Rule TC 1987 max - Apr Sun>=1 0:00 1:00 D # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone America/Grand_Turk -4:44:32 - LMT 1890 -5:07 - KMT 1912 Feb # Kingston Mean Time - -5:00 - EST 1979 Apr 29 2:00 - -5:00 US E%sT + -5:00 TC E%sT # British Virgin Is # Zone NAME GMTOFF RULES FORMAT [UNTIL] diff --git a/time/southamerica b/time/southamerica index cd8c84ec6f..1fdde5ebe5 100644 --- a/time/southamerica +++ b/time/southamerica @@ -1,14 +1,22 @@ -# @(#)southamerica 7.14 +# @(#)southamerica 7.15 # This data is by no means authoritative; if you think you know better, # go ahead and edit the file (and please send any changes to # tz@elsie.nci.nih.gov for general use in the future). -# From Paul Eggert (1996-09-03): +# From Paul Eggert (1996-11-22): # A good source for time zone historical data outside the U.S. is # Thomas G. Shanks, The International Atlas (3rd edition), # San Diego: ACS Publications, Inc. (1991). -# Except where otherwise noted, it is the source for the data below. +# +# Gwillim Law writes that a good source +# for recent time zone data is the International Air Transport +# Association's Standard Schedules Information Manual (IATA SSIM), +# published semiannually. Law sent in several helpful summaries +# of the IATA's data after 1990. +# +# Except where otherwise noted, Shanks is the source for entries through 1990, +# and IATA SSIM is the source for entries after 1990. # # The following abbreviations are used in this file. # Corrections are welcome! @@ -103,11 +111,64 @@ Rule Arg 1989 1992 - Oct Sun>=15 0:00 1:00 S # to the time zones (for daylight saving) are now made. # # Zone NAME GMTOFF RULES FORMAT [UNTIL] +# +# Buenos Aires (BA), Distrito Federal (DF), Santa Cruz (SC), +# Tierra del Fuego (TF) & Antartida e Islas Zone America/Buenos_Aires -3:53:48 - LMT 1894 Nov -4:16:44 - CMT 1920 May # Cordoba Mean Time -4:00 - ART 1930 Dec -4:00 Arg AR%sT 1969 Oct 5 -3:00 Arg AR%sT +# +# Santa Fe (SF), Entre Rios (ER), Corrientes (CN), Misiones (MN), Chaco (CC), +# Formosa (FM), La Pampa (LP), Chubut (CH) +Zone America/Rosario -4:02:40 - LMT 1894 Nov + -4:16:44 - CMT 1920 May + -4:00 - ART 1930 Dec + -4:00 Arg AR%sT 1969 Oct 5 + -3:00 Arg AR%sT 1991 Jul + -3:00 - ART +# +# Cordoba (CB), Santiago del Estero (SE), Salta (SA), Tucuman (TM), La Rioja (LR), San Juan (SJ), San Luis (SL), +# Neuquen (NQ), Rio Negro (RN) +Zone America/Cordoba -4:16:44 - LMT 1894 Nov + -4:16:44 - CMT 1920 May + -4:00 - ART 1930 Dec + -4:00 Arg AR%sT 1969 Oct 5 + -3:00 Arg AR%sT 1990 Jul + -3:00 - ART +# +# Jujuy (JY) +Zone America/Jujuy -4:21:12 - LMT 1894 Nov + -4:16:44 - CMT 1920 May + -4:00 - ART 1930 Dec + -4:00 Arg AR%sT 1969 Oct 5 + -3:00 Arg AR%sT 1991 Mar 3 + -4:00 - WART 1991 Oct 6 + -4:00 1:00 WARST 1992 Mar 15 + -4:00 - WART 1992 Oct 18 + -3:00 - ART +# +# Catamarca (CT) +Zone America/Catamarca -4:23:08 - LMT 1894 Nov + -4:16:44 - CMT 1920 May + -4:00 - ART 1930 Dec + -4:00 Arg AR%sT 1969 Oct 5 + -3:00 Arg AR%sT 1990 Jul + -3:00 - ART 1991 Jul + -3:00 Arg AR%sT 1992 Jul + -3:00 - ART +# +# Mendoza (MZ) +Zone America/Mendoza -4:35:16 - LMT 1894 Nov + -4:16:44 - CMT 1920 May + -4:00 - ART 1930 Dec + -4:00 Arg AR%sT 1969 Oct 5 + -3:00 Arg AR%sT 1991 Mar 3 + -4:00 - WART 1991 Oct 15 + -4:00 1:00 WARST 1992 Mar 1 + -4:00 - WART 1992 Oct 18 + -3:00 - ART # Aruba # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -132,38 +193,55 @@ Zone America/La_Paz -4:32:36 - LMT 1890 # "[America/Porto_Acre]" is for the Territory of Acre; # "[America/Noronha]" is for Fernando De Noronha. -# From Bob Devine (1988-01-28): -# The only information I found is that there was no DST up to 1985. -# But there was some before 1952! - -# From U. S. Naval Observatory (1989-01-16): -# BRAZIL WEST 5 H BEHIND UTC TERRITORY OF ACRE -# BRAZIL WEST 4 H BEHIND UTC ACRE OCT 23, '88-FEB 11, -# BRAZIL '89 (ESTIMATED) -# BRAZIL CENTRAL 4 H BEHIND UTC MANAUS -# BRAZIL CENTRAL 3 H BEHIND UTC MANAUS OCT 23, '88-FEB 11, -# BRAZIL CENTRAL '89 (ESTIMATED) -# BRAZIL EAST 3 H BEHIND UTC COASTAL STATES, RIO, SAO -# BRAZIL EAST PAULO, BRASILIA -# BRAZIL EAST 2 H BEHIND UTC COASTAL STATES, RIO, SAO -# BRAZIL PAULO, BRASILIA OCT 23, -# BRAZIL '88-FEB 11, '89 -# BRAZIL (ESTIMATED) -# BRAZIL 2 H BEHIND UTC ATLANTIC ISLANDS, FERNANDO -# BRAZIL DE NORONHA -# BRAZIL 1 H BEHIND UTC OCT 23, '88-FEB 11, '89 -# BRAZIL (ESTIMATED) -# BRAZIL 3 H BEHIND UTC FOR MOST MAJOR AIRPORTS. - # From Paul Eggert (1993-11-18): # The mayor of Rio recently attempted to change the time zone rules # just in his city, in order to leave more summer time for the tourist trade. # The rule change lasted only part of the day; # the federal government refused to follow the city's rules, and business # was in a chaos, so the mayor backed down that afternoon. -# Shanks claims Acre stopped observing DST after 1988 Feb 7, but it -# could just be that his table ran out of room. We're extrapolating -# about time zone changes after 1990 Feb 11. + +# From IATA SSIM (1996-02): +# _Only_ the following states in BR1 observe DST: Rio Grande do Sul (RS), +# Santa Catarina (SC), Parana (PR), Sao Paulo (SP), Rio de Janeiro (RJ), +# Espirito Santo (ES), Minas Gerais (MG), Bahia (BA), Goias (GO), +# Distrito Federal (DF), Tocantins (TO), Sergipe [SE] and Alagoas [AL]. +# [The last three states are new to this issue of the IATA SSIM.] + +# From Gwillim Law (1996-10-07): +# Geography, history (Tocantins was part of Goias until 1989), and other +# sources of time zone information lead me to believe that AL, SE, and TO were +# always in BR1, and so the only change was whether or not they observed DST.... +# The earliest issue of the SSIM I have is 2/91. Each issue from then until +# 9/95 says that DST is observed only in the ten states I quoted from 9/95, +# along with Mato Grosso (MT) and Mato Grosso do Sul (MS), which are in BR2 +# (UTC-4).... The other two time zones given for Brazil are BR3, which is +# UTC-5, no DST, and applies only in the state of Acre (AC); and BR4, which is +# UTC-2, and applies to Fernando de Noronha (formerly FN, but I believe it's +# become part of the state of Pernambuco). The boundary between BR1 and BR2 +# has never been clearly stated. They've simply been called East and West. +# However, some conclusions can be drawn from another IATA manual: the Airline +# Coding Directory, which lists close to 400 airports in Brazil. For each +# airport it gives a time zone which is coded to the SSIM. From that +# information, I'm led to conclude that the states of Amapa (AP), Ceara (CE), +# Maranhao (MA), Paraiba (PR), Pernambuco (PE), Piaui (PI), and Rio Grande do +# Norte (RN), and the eastern part of Para (PA) are all in BR1 without DST. + +# From Paul Eggert (1996-11-22): +# Let's make the following assumptions: +# +# * All data in Shanks are correct through 1990. In particular, +# Shanks was right when he said Acre stopped observing DST in mid-1988. +# * Areas where Shanks reports DST up to 1990, but the IATA reports no DST +# in 1995, stopped observing DST in mid-1990. +# +# Under these assumptions Brazil needs 7 entries to cover all the distinct +# time zone histories since 1970: +# +# Noronha (UTC-2), Fortaleza (UTC-3), and Manaus (UTC-4) stopped observing DST +# in mid-1990. +# Maceio (UTC-3) stopped observing DST in mid-1990, but started again mid-1995. +# Sao Paulo (UTC-3) and Cuiaba (UTC-4) always observed DST. +# Porto Acre (UTC-5) stopped observing DST in mid-1988. # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Brazil 1931 only - Oct 3 11:00 1:00 D @@ -185,21 +263,59 @@ Rule Brazil 1986 1987 - Oct Sat<=28 0:00 1:00 D Rule Brazil 1987 only - Feb 14 0:00 0 S Rule Brazil 1988 only - Feb 7 0:00 0 S Rule Brazil 1989 only - Jan 22 0:00 0 S -Rule Brazil 1988 max - Oct Sun>=15 0:00 1:00 D -Rule Brazil 1990 max - Feb Sun>=8 0:00 0 S +Rule Brazil 1988 1989 - Oct Sun>=10 0:00 1:00 D +Rule Brazil 1990 1991 - Feb Sun>=11 0:00 0 S +Rule Brazil 1990 1992 - Oct Sun>=20 0:00 1:00 D +Rule Brazil 1992 only - Feb 9 0:00 0 S +Rule Brazil 1993 max - Oct Sun>=11 0:00 1:00 D +Rule Brazil 1993 only - Jan 31 0:00 0 S +Rule Brazil 1994 1995 - Feb Sun>=15 0:00 0 S +Rule Brazil 1996 max - Feb Sun>=11 0:00 0 S + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +# +# Fernando de Noronha Zone America/Noronha -2:09:40 - LMT 1914 -2:00 - FST 1963 Dec 9 - -2:00 Brazil F%sT + -2:00 Brazil F%sT 1990 Jul + -2:00 - FST +# +# Amapa, east Para, Maranhao, Piaui, Ceara, Rio Grande do Norte, Paraiba, +# Pernambuco (except Fernando de Noronha) +Zone America/Fortaleza -2:34:00 - LMT 1914 + -3:00 - EST 1963 Dec 9 + -3:00 Brazil E%sT 1990 Jul + -3:00 - EST +# +# Alagoas, Sergipe, Tocantins +Zone America/Maceio -2:22:52 - LMT 1914 + -3:00 - EST 1963 Dec 9 + -3:00 Brazil E%sT 1990 Jul + -3:00 - EST 1995 Jul + -3:00 Brazil E%sT +# +# Bahia, Goias, Distrito Federal, Minas Gerais, Espirito Santo, Rio de Janeiro, +# Sao Paulo, Parana, Santa Catarina, Rio Grande do Sul Zone America/Sao_Paulo -3:06:28 - LMT 1914 -3:00 Brazil E%sT -Zone America/Manaus -4:00:04 - LMT 1914 +# +# Mato Grosso, Mato Grosso do Sul +Zone America/Cuiaba -3:44:20 - LMT 1914 -4:00 - WST 1963 Dec 9 -4:00 Brazil W%sT +# +# Roraima, west Para, Amazonas, Rondonia +Zone America/Manaus -4:00:04 - LMT 1914 + -4:00 - WST 1963 Dec 9 + -4:00 Brazil W%sT 1990 Jul + -4:00 - WST +# +# Acre # Rio_Branco is too ambiguous, since there's a Rio Branco in Uruguay too. Zone America/Porto_Acre -4:31:12 - LMT 1914 -5:00 - AST 1963 Dec 9 - -5:00 Brazil A%sT + -5:00 Brazil A%sT 1988 Jul + -5:00 - AST # # Martin Vaz and Trinidade are like America/Noronha. @@ -217,6 +333,8 @@ Rule Chile 1927 1931 - Sep 1 0:00 1:00 S Rule Chile 1928 1932 - Apr 1 0:00 0 - Rule Chile 1969 max - Oct Sun>=9 0:00 1:00 S Rule Chile 1970 max - Mar Sun>=9 0:00 0 - +# IATA SSIM anomalies: (1990-09) says 1990-09-16; (1992-02) says 1992-03-14; +# (1996-09) says 1998-03-08. Ignore these for now. # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone America/Santiago -4:42:40 - LMT 1890 -4:42:40 - SMT 1910 # Santiago Mean Time @@ -233,10 +351,13 @@ Zone Pacific/Easter -7:17:28 - LMT 1890 # Mataveri # Colombia +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule CO 1992 only - May 2 0:00 1:00 S +Rule CO 1992 only - Dec 31 0:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone America/Bogota -4:56:20 - LMT 1884 Mar 13 -4:56:20 - BMT 1914 Nov 23 # Bogota Mean Time - -5:00 - COT # Colombia Time + -5:00 CO CO%sT # Colombia Time # Malpelo, Providencia, San Andres # no information; probably like America/Bogota @@ -265,8 +386,9 @@ Rule Falk 1943 only - Jan 1 0:00 0 - Rule Falk 1983 only - Sep lastSun 0:00 1:00 S Rule Falk 1984 1985 - Apr lastSun 0:00 0 - Rule Falk 1984 only - Sep 16 0:00 1:00 S -Rule Falk 1985 max - Sep Sun>=9 0:00 1:00 S +Rule Falk 1985 1995 - Sep Sun>=9 0:00 1:00 S Rule Falk 1986 max - Apr Sun>=16 0:00 0 - +Rule Falk 1996 max - Sep Sun>=8 0:00 1:00 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Atlantic/Stanley -3:51:24 - LMT 1890 -3:51:24 - SMT 1912 Mar 12 # Stanley Mean Time @@ -285,8 +407,9 @@ Zone America/Cayenne -3:29:20 - LMT 1911 Jul Zone America/Guyana -3:52:40 - LMT 1915 Mar # Georgetown -3:45 - GBGT 1966 May 26 # Br Guiana Time -3:45 - GYT 1975 Jul 31 # Guyana Time - -3:00 - GYT - + -3:00 - GYT 1991 +# IATA SSIM (1996-06) says -4:00. Assume a 1991 switch. + -4:00 - GYT # Paraguay @@ -303,10 +426,17 @@ Zone America/Guyana -3:52:40 - LMT 1915 Mar # Georgetown Rule Para 1975 1978 - Oct 1 0:00 1:00 S Rule Para 1975 1978 - Mar 1 0:00 0 - # Shanks says 1979 was all DST. -Rule Para 1980 max - Apr 1 0:00 0 - +Rule Para 1980 1991 - Apr 1 0:00 0 - Rule Para 1980 1988 - Oct 1 0:00 1:00 S Rule Para 1989 only - Oct 22 0:00 1:00 S -Rule Para 1990 max - Oct 1 0:00 1:00 S +Rule Para 1990 only - Oct 1 0:00 1:00 S +Rule Para 1991 only - Oct 6 0:00 1:00 S +Rule Para 1992 only - Mar 1 0:00 0 - +Rule Para 1992 only - Oct 5 0:00 1:00 S +Rule Para 1993 only - Mar 31 0:00 0 - +Rule Para 1993 max - Oct 1 0:00 1:00 S +Rule Para 1994 1995 - Feb lastSun 0:00 0 - +Rule Para 1996 max - Mar 1 0:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone America/Asuncion -3:50:40 - LMT 1890 -3:50:40 - AMT 1931 Oct 10 # Asuncion Mean Time @@ -324,6 +454,8 @@ Rule Peru 1987 only - Jan 1 0:00 1:00 S Rule Peru 1987 only - Apr 1 0:00 0 - Rule Peru 1990 only - Jan 1 0:00 1:00 S Rule Peru 1990 only - Apr 1 0:00 0 - +Rule Peru 1993 only - Jan 1 0:00 1:00 S +Rule Peru 1993 only - Apr 1 0:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone America/Lima -5:08:12 - LMT 1890 -5:09 - LMT 1908 Jul 28 # Lima Mean Time @@ -396,7 +528,10 @@ Rule Uruguay 1988 only - Mar 14 0:00 0 - Rule Uruguay 1988 only - Dec 11 0:00 1:00 S Rule Uruguay 1989 only - Mar 12 0:00 0 - Rule Uruguay 1989 only - Oct 29 0:00 1:00 S -Rule Uruguay 1990 only - Mar 4 0:00 0 - +Rule Uruguay 1990 1992 - Mar Sun>=1 0:00 0 - +Rule Uruguay 1990 1991 - Oct Sun>=21 0:00 1:00 S +Rule Uruguay 1992 1993 - Oct Sun>=15 0:00 1:00 S +Rule Uruguay 1993 only - Feb 28 0:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone America/Montevideo -3:44:44 - LMT 1898 Jun 28 -3:44:44 - MMT 1920 May 1 # Montevideo MT diff --git a/time/zone.tab b/time/zone.tab index fef6a7244f..9d86110ca7 100644 --- a/time/zone.tab +++ b/time/zone.tab @@ -31,9 +31,15 @@ AN +1211-06900 America/Curacao AO -0848+01314 Africa/Luanda AQ -7750+16636 Antarctica/McMurdo McMurdo Station, Ross Island AQ -9000+00000 Antarctica/South_Pole Amundsen-Scott Station, South Pole -AQ -6617+11031 Antarctica/Casey Casey Station, Bailey Peninsula +AQ -6448-06406 Antarctica/Palmer Palmer Station, Anvers Island AQ -6736+06253 Antarctica/Mawson Mawson Station, Holme Bay -AR -3436-05827 America/Buenos_Aires +AQ -6617+11031 Antarctica/Casey Casey Station, Bailey Peninsula +AR -3436-05827 America/Buenos_Aires E Argentina (BA, DF, SC, TF) +AR -3257-06040 America/Rosario NE Argentina (SF, ER, CN, MN, CC, FM, LP, CH) +AR -3124-06411 America/Cordoba W Argentina (CB, SA, TM, LR, SJ, SL, NQ, RN) +AR -2411-06518 America/Jujuy Jujuy (JY) +AR -2828-06547 America/Catamarca Catamarca (CT) +AR -3253-06849 America/Mendoza Mendoza (MZ) AS -1416-17042 Pacific/Pago_Pago AT +4813+01620 Europe/Vienna AU -3133+15905 Australia/Lord_Howe Lord Howe Island @@ -41,7 +47,8 @@ AU -4253+14719 Australia/Hobart Tasmania AU -3749+14458 Australia/Melbourne Victoria AU -3352+15113 Australia/Sydney New South Wales - most locations AU -3157+14127 Australia/Broken_Hill New South Wales - Broken Hill -AU -2728+15302 Australia/Brisbane Queensland +AU -2728+15302 Australia/Brisbane Queensland - most locations +AU -2016+14900 Australia/Lindeman Queensland - Holiday Islands AU -3455+13835 Australia/Adelaide South Australia AU -1228+13050 Australia/Darwin Northern Territory AU -3157+11551 Australia/Perth Western Australia @@ -59,9 +66,12 @@ BJ +0629+00237 Africa/Porto-Novo BM +3217-06446 Atlantic/Bermuda BN +0456+11455 Asia/Brunei BO -1630-06809 America/La_Paz -BR -0351-03225 America/Noronha Atlantic islands -BR -2332-04637 America/Sao_Paulo east Brazil -BR -0308-06001 America/Manaus west Brazil +BR -0351-03225 America/Noronha Fernando de Noronha +BR -0343-03830 America/Fortaleza NE Brazil (AP, east PA, MA, PI, CE, RN, PR, PE) +BR -0940-03543 America/Maceio ENE Brazil (AL, SE, TO) +BR -2332-04637 America/Sao_Paulo S & SE Brazil (BA, GO, DF, MG, ES, RJ, SP, PR, SC, RS) +BR -1535-05605 America/Cuiaba SW Brazil (MT, MS) +BR -0308-06001 America/Manaus NW Brazil (RR, west PA, AM, RO) BR -0934-06731 America/Porto_Acre Acre BS +2505-07721 America/Nassau BT +2728+08939 Asia/Thimbu @@ -69,8 +79,9 @@ BW -2545+02555 Africa/Gaborone BY +5354+02734 Europe/Minsk BZ +1730-08812 America/Belize CA +4734-05243 America/St_Johns Newfoundland Island -CA +4439-06336 America/Halifax Atlantic Time - Nova Scotia (most locations), New Brunswick, Labrador & PEI +CA +4439-06336 America/Halifax Atlantic Time - Nova Scotia (most places), NB, W Labrador, E Quebec & PEI CA +4612-05957 America/Glace_Bay Atlantic Time - Nova Scotia - places that did not observe DST 1966-1971 +CA +5320-06025 America/Goose_Bay Atlantic Time - E Labrador CA +6608-06544 America/Pangnirtung Atlantic Time - Northwest Territories CA +4531-07334 America/Montreal Eastern Time - Ontario & Quebec - most locations CA +4901-08816 America/Nipigon Eastern Time - Ontario & Quebec - places that did not observe DST 1967-1973 @@ -189,7 +200,8 @@ KR +3733+12658 Asia/Seoul KW +2920+04759 Asia/Kuwait KY +1918-08123 America/Cayman KZ +4315+07657 Asia/Alma-Ata east Kazakhstan -KZ +5016+07302 Asia/Aktau west Kazakhstan +KZ +5017+05710 Asia/Aqtobe central Kazakhstan +KZ +4431+05016 Asia/Aqtau west Kazakhstan LA +1758+10236 Asia/Vientiane LB +3353+03530 Asia/Beirut LC +1401-06100 America/St_Lucia @@ -262,15 +274,16 @@ PY -2516-05740 America/Asuncion QA +2517+05132 Asia/Qatar RE -2052+05528 Indian/Reunion RO +4426+02606 Europe/Bucharest +RU +5443+02030 Europe/Kaliningrad Moscow-01 - Kaliningrad RU +5545+03735 Europe/Moscow Moscow+00 - west Russia -RU +5312+05009 Europe/Kuybyshev Moscow+01 - Caspian Sea +RU +5312+05009 Europe/Samara Moscow+01 - Caspian Sea RU +5651+06036 Asia/Yekaterinburg Moscow+02 - Urals RU +5500+07324 Asia/Omsk Moscow+03 - west Siberia RU +5502+08255 Asia/Novosibirsk Moscow+03 - Novosibirsk RU +5601+09250 Asia/Krasnoyarsk Moscow+04 - Yenisei River -RU +5216+10420 Asia/Irkutsk Moscow+05 - Irkutsk +RU +5216+10420 Asia/Irkutsk Moscow+05 - Lake Baikal RU +6200+12940 Asia/Yakutsk Moscow+06 - Lena River -RU +4310+13156 Asia/Vladivostok Moscow+07 - Vladivostok +RU +4310+13156 Asia/Vladivostok Moscow+07 - Amur River RU +5934+15048 Asia/Magadan Moscow+08 - Magadan & Sakhalin RU +5301+15839 Asia/Kamchatka Moscow+09 - Kamchatka RU +6445+17729 Asia/Anadyr Moscow+10 - Bering Sea