From fe6cc2ae0947c91d9daf844dccc44a8c76deb767 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 9 Aug 2004 07:24:19 +0000 Subject: [PATCH] [BZ #154] Update. 2004-08-09 Ulrich Drepper * time/tzset.c (tzset_internal): If TZ is not set do not compare old and new tz value since it might be /etc/localtime in both cases although the file changed. [BZ #154] Patch by Christian Franke . * time/tzfile.c (__tzfile_read): Determine dev/ino of file. Compare with values of previously opened file. Don't do anything is they match. --- ChangeLog | 11 +++++++++++ time/tzfile.c | 23 +++++++++++++++++++++++ time/tzset.c | 9 +++++---- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 20c210d..b0791cc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2004-08-09 Ulrich Drepper + + * time/tzset.c (tzset_internal): If TZ is not set do not compare + old and new tz value since it might be /etc/localtime in both + cases although the file changed. [BZ #154] + Patch by Christian Franke . + + * time/tzfile.c (__tzfile_read): Determine dev/ino of file. + Compare with values of previously opened file. Don't do anything + is they match. + 2004-08-08 Ulrich Drepper * elf/dl-load.c (_dl_map_object): If __RTLD_CALLMAP flag is set, diff --git a/time/tzfile.c b/time/tzfile.c index 2c17825..b118e07 100644 --- a/time/tzfile.c +++ b/time/tzfile.c @@ -24,11 +24,14 @@ #include #include #include +#include #define NOID #include int __use_tzfile; +static dev_t tzfile_dev; +static ino64_t tzfile_ino; struct ttinfo { @@ -97,6 +100,7 @@ __tzfile_read (const char *file, size_t extra, char **extrap) size_t total_size; size_t types_idx; size_t leaps_idx; + int was_using_tzfile = __use_tzfile; __use_tzfile = 0; @@ -154,6 +158,25 @@ __tzfile_read (const char *file, size_t extra, char **extrap) if (f == NULL) return; + /* Get information about the file. */ + struct stat64 st; + if (fstat64 (fileno (f), &st) != 0) + { + fclose (f); + return; + } + if (was_using_tzfile && tzfile_ino == st.st_ino && tzfile_dev == st.st_dev) + { + /* It's the same file. No further work needed. */ + fclose (f); + __use_tzfile = 1; + return; + } + + /* Remember the inode and device number. */ + tzfile_dev = st.st_dev; + tzfile_ino = st.st_ino; + /* No threads reading this stream. */ __fsetlocking (f, FSETLOCKING_BYCALLER); diff --git a/time/tzset.c b/time/tzset.c index 2274a38..aa86691 100644 --- a/time/tzset.c +++ b/time/tzset.c @@ -159,10 +159,7 @@ tzset_internal (always) /* Examine the TZ environment variable. */ tz = getenv ("TZ"); - if (tz == NULL) - /* No user specification; use the site-wide default. */ - tz = TZDEFAULT; - else if (*tz == '\0') + if (tz && *tz == '\0') /* User specified the empty string; use UTC explicitly. */ tz = "Universal"; @@ -177,6 +174,10 @@ tzset_internal (always) /* No change, simply return. */ return; + if (tz == NULL) + /* No user specification; use the site-wide default. */ + tz = TZDEFAULT; + tz_rules[0].name = NULL; tz_rules[1].name = NULL; -- 2.7.4