about summary refs log tree commit diff
path: root/time/tzfile.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-08-09 07:24:19 +0000
committerUlrich Drepper <drepper@redhat.com>2004-08-09 07:24:19 +0000
commitfe6cc2ae0947c91d9daf844dccc44a8c76deb767 (patch)
tree036330f5f78f9cd95101bc3926dc8991b1d689f4 /time/tzfile.c
parentc14e91352e26aa4e1622f08bb9a25a9527a8db2b (diff)
downloadglibc-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.c23
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);