view patches/rh995488-rhel_tz_fix.patch @ 2933:636eeb85c15e

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) {