diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-08-09 07:24:19 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-08-09 07:24:19 +0000 |
commit | fe6cc2ae0947c91d9daf844dccc44a8c76deb767 (patch) | |
tree | 036330f5f78f9cd95101bc3926dc8991b1d689f4 /time/tzfile.c | |
parent | c14e91352e26aa4e1622f08bb9a25a9527a8db2b (diff) | |
download | glibc-fe6cc2ae0947c91d9daf844dccc44a8c76deb767.tar.gz glibc-fe6cc2ae0947c91d9daf844dccc44a8c76deb767.tar.xz glibc-fe6cc2ae0947c91d9daf844dccc44a8c76deb767.zip |
[BZ #154]
Update. 2004-08-09 Ulrich Drepper <drepper@redhat.com> * 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 <franke@computer.org>. * time/tzfile.c (__tzfile_read): Determine dev/ino of file. Compare with values of previously opened file. Don't do anything is they match.
Diffstat (limited to 'time/tzfile.c')
-rw-r--r-- | time/tzfile.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/time/tzfile.c b/time/tzfile.c index 2c178253e4..b118e07dc4 100644 --- a/time/tzfile.c +++ b/time/tzfile.c @@ -24,11 +24,14 @@ #include <string.h> #include <time.h> #include <unistd.h> +#include <sys/stat.h> #define NOID #include <timezone/tzfile.h> 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); |