Mercurial > hg > release > icedtea6-1.12
view patches/rh995488-rhel_tz_fix.patch @ 3027:908f1fb82dd8
RH995488: Java thinks that the default timezone is Busingen instead of Zurich
2013-09-05 Andrew John Hughes <gnu.andrew@redhat.com>
* Makefile.am:
(ICEDTEA_PATCHES): Add new patch.
* patches/rh995488-rhel_tz_fix.patch:
Use /etc/sysconfig/clock on RHEL & clones
so that they don't search /usr/share/zoneinfo.
* NEWS: Mention patch.
author | Andrew John Hughes <gnu.andrew@redhat.com> |
---|---|
date | Fri, 06 Sep 2013 12:19:02 +0100 |
parents | |
children |
line wrap: on
line source
diff --git a/src/solaris/native/java/util/TimeZone_md.c b/src/solaris/native/java/util/TimeZone_md.c --- openjdk/jdk/src/solaris/native/java/util/TimeZone_md.c +++ openjdk/jdk/src/solaris/native/java/util/TimeZone_md.c @@ -52,6 +52,8 @@ #ifdef __linux__ static const char *ETC_TIMEZONE_FILE = "/etc/timezone"; +static const char *REDHAT_RELEASE_FILE = "/etc/redhat-release"; +static const char *SYSCONFIG_CLOCK_FILE = "/etc/sysconfig/clock"; static const char *ZONEINFO_DIR = "/usr/share/zoneinfo"; static const char *DEFAULT_ZONEINFO_FILE = "/etc/localtime"; @@ -225,6 +227,64 @@ } /* + * Next, try the ZONE entry in /etc/sysconfig/clock. + */ + if ((fp = fopen(REDHAT_RELEASE_FILE, "r")) != NULL) { + char id[7]; + + /* Avoid this file on Fedora as may be buggy; RH489586 */ + if (fgets(id, sizeof (id), fp) != NULL && + strncmp(id, "Fedora", 6) != 0) { + (void) fclose(fp); + if ((fp = fopen(SYSCONFIG_CLOCK_FILE, "r")) != NULL) { + char line[256]; + + while (fgets(line, sizeof(line), fp) != NULL) { + char *p = line; + char *s; + + SKIP_SPACE(p); + if (*p != 'Z') { + continue; + } + if (strncmp(p, "ZONE=\"", 6) == 0) { + p += 6; + } else { + /* + * In case we need to parse it token by token. + */ + if (strncmp(p, "ZONE", 4) != 0) { + continue; + } + p += 4; + SKIP_SPACE(p); + if (*p++ != '=') { + break; + } + SKIP_SPACE(p); + if (*p++ != '"') { + break; + } + } + for (s = p; *s && *s != '"'; s++) + ; + if (*s != '"') { + /* this ZONE entry is broken. */ + break; + } + *s = '\0'; + tz = strdup(p); + break; + } + (void) fclose(fp); + if (tz != NULL) { + return tz; + } + } + } + } + + /* * Next, try /etc/localtime to find the zone ID. */ if (lstat(DEFAULT_ZONEINFO_FILE, &statbuf) == -1) {