aboutsummaryrefslogtreecommitdiff
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
parentc14e91352e26aa4e1622f08bb9a25a9527a8db2b (diff)
downloadglibc-fe6cc2ae0947c91d9daf844dccc44a8c76deb767.zip
glibc-fe6cc2ae0947c91d9daf844dccc44a8c76deb767.tar.gz
glibc-fe6cc2ae0947c91d9daf844dccc44a8c76deb767.tar.bz2
[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.
-rw-r--r--ChangeLog11
-rw-r--r--time/tzfile.c23
-rw-r--r--time/tzset.c9
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 <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.
+
2004-08-08 Ulrich Drepper <drepper@redhat.com>
* 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 <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);
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;