< prev index next >

src/java.base/unix/native/libjava/TimeZone_md.c

Print this page

        

*** 38,70 **** #ifdef __solaris__ #include <libscf.h> #endif #include "jvm.h" #define SKIP_SPACE(p) while (*p == ' ' || *p == '\t') p++; #if !defined(__solaris__) || defined(__sparcv9) || defined(amd64) #define fileopen fopen #define filegets fgets #define fileclose fclose #endif #if defined(__linux__) || defined(_ALLBSD_SOURCE) - - static const char *ETC_TIMEZONE_FILE = "/etc/timezone"; static const char *ZONEINFO_DIR = "/usr/share/zoneinfo"; static const char *DEFAULT_ZONEINFO_FILE = "/etc/localtime"; #else #ifdef _AIX static const char *ETC_ENVIRONMENT_FILE = "/etc/environment"; #endif static const char *SYS_INIT_FILE = "/etc/default/init"; static const char *ZONEINFO_DIR = "/usr/share/lib/zoneinfo"; static const char *DEFAULT_ZONEINFO_FILE = "/usr/share/lib/zoneinfo/localtime"; ! #endif /*__linux__*/ /* * Returns a pointer to the zone ID portion of the given zoneinfo file * name, or NULL if the given string doesn't contain "zoneinfo/". */ --- 38,69 ---- #ifdef __solaris__ #include <libscf.h> #endif #include "jvm.h" + #include "TimeZone_md.h" #define SKIP_SPACE(p) while (*p == ' ' || *p == '\t') p++; #if !defined(__solaris__) || defined(__sparcv9) || defined(amd64) #define fileopen fopen #define filegets fgets #define fileclose fclose #endif #if defined(__linux__) || defined(_ALLBSD_SOURCE) static const char *ETC_TIMEZONE_FILE = "/etc/timezone"; static const char *ZONEINFO_DIR = "/usr/share/zoneinfo"; static const char *DEFAULT_ZONEINFO_FILE = "/etc/localtime"; #else #ifdef _AIX static const char *ETC_ENVIRONMENT_FILE = "/etc/environment"; #endif static const char *SYS_INIT_FILE = "/etc/default/init"; static const char *ZONEINFO_DIR = "/usr/share/lib/zoneinfo"; static const char *DEFAULT_ZONEINFO_FILE = "/usr/share/lib/zoneinfo/localtime"; ! #endif /* defined(__linux__) || defined(_ALLBSD_SOURCE) */ /* * Returns a pointer to the zone ID portion of the given zoneinfo file * name, or NULL if the given string doesn't contain "zoneinfo/". */
*** 316,327 **** tz = findZoneinfoFile(buf, size, ZONEINFO_DIR); free((void *) buf); return tz; } ! #else ! #ifdef __solaris__ #if !defined(__sparcv9) && !defined(amd64) /* * Those file* functions mimic the UNIX stream io functions. This is * because of the limitation of the number of open files on Solaris --- 315,327 ---- tz = findZoneinfoFile(buf, size, ZONEINFO_DIR); free((void *) buf); return tz; } ! ! #elif defined(__solaris__) ! #if !defined(__sparcv9) && !defined(amd64) /* * Those file* functions mimic the UNIX stream io functions. This is * because of the limitation of the number of open files on Solaris
*** 442,453 **** return s; } } /*NOTREACHED*/ } ! #endif /* not __sparcv9 */ ! /* * Performs Solaris dependent mapping. Returns a zone ID if * found. Otherwise, NULL is returned. Solaris libc looks up * "/etc/default/init" to get the default TZ value if TZ is not defined --- 442,452 ---- return s; } } /*NOTREACHED*/ } ! #endif /* !defined(__sparcv9) && !defined(amd64) */ /* * Performs Solaris dependent mapping. Returns a zone ID if * found. Otherwise, NULL is returned. Solaris libc looks up * "/etc/default/init" to get the default TZ value if TZ is not defined
*** 544,554 **** scf_handle_destroy(h); } } /* ! * Retruns a zone ID of Solaris when the TZ value is "localtime". * First, it tries scf. If scf fails, it looks for the same file as * /usr/share/lib/zoneinfo/localtime under /usr/share/lib/zoneinfo/. */ static char * getSolarisDefaultZoneID() { --- 543,553 ---- scf_handle_destroy(h); } } /* ! * Returns a zone ID of Solaris when the TZ value is "localtime". * First, it tries scf. If scf fails, it looks for the same file as * /usr/share/lib/zoneinfo/localtime under /usr/share/lib/zoneinfo/. */ static char * getSolarisDefaultZoneID() {
*** 613,626 **** (void) close(fd); tz = findZoneinfoFile(buf, size, ZONEINFO_DIR); free((void *) buf); return tz; } - #endif /*__solaris__*/ - #endif /*__linux__*/ ! #ifdef _AIX static char * getPlatformTimeZoneID() { FILE *fp; char *tz = NULL; --- 612,624 ---- (void) close(fd); tz = findZoneinfoFile(buf, size, ZONEINFO_DIR); free((void *) buf); return tz; } ! #elif defined(_AIX) ! static char * getPlatformTimeZoneID() { FILE *fp; char *tz = NULL;
*** 642,653 **** (void) fclose(fp); } return tz; } ! static char *mapPlatformToJavaTimezone(const char *java_home_dir, const char *tz); ! #endif /* * findJavaTZ_md() maps platform time zone ID to Java time zone ID * using <java_home>/lib/tzmappings. If the TZ value is not found, it * trys some libc implementation dependent mappings. If it still --- 640,755 ---- (void) fclose(fp); } return tz; } ! ! static char * ! mapPlatformToJavaTimezone(const char *java_home_dir, const char *tz) { ! FILE *tzmapf; ! char mapfilename[PATH_MAX + 1]; ! char line[256]; ! int linecount = 0; ! char *tz_buf = NULL; ! char *temp_tz = NULL; ! char *str_tmp = NULL; ! char *javatz = NULL; ! size_t tz_len = 0; ! size_t temp_tz_len = 0; ! ! /* On AIX, the TZ environment variable may end with a comma ! * followed by modifier fields. These are ignored here. ! */ ! tz_len = strlen(tz); ! tz_buf = (char *)malloc(tz_len + 1); ! strncpy(tz_buf, tz, tz_len); ! tz_buf[tz_len] = 0; ! temp_tz = strtok_r(tz_buf, ",", &str_tmp); ! ! if (temp_tz == NULL) ! goto tzerr; ! ! temp_tz_len = strlen(temp_tz); ! ! if (strlen(java_home_dir) >= (PATH_MAX - 15)) { ! jio_fprintf(stderr, "java.home longer than maximum path length \n"); ! goto tzerr; ! } ! ! strncpy(mapfilename, java_home_dir, PATH_MAX); ! strcat(mapfilename, "/lib/tzmappings"); ! ! if ((tzmapf = fopen(mapfilename, "r")) == NULL) { ! jio_fprintf(stderr, "can't open %s\n", mapfilename); ! goto tzerr; ! } ! ! while (fgets(line, sizeof(line), tzmapf) != NULL) { ! char *p = line; ! char *sol = line; ! char *java; ! int result; ! ! linecount++; ! /* ! * Skip comments and blank lines ! */ ! if (*p == '#' || *p == '\n') { ! continue; ! } ! ! /* ! * Get the first field, platform zone ID ! */ ! while (*p != '\0' && *p != '\t') { ! p++; ! } ! if (*p == '\0') { ! /* mapping table is broken! */ ! jio_fprintf(stderr, "tzmappings: Illegal format at near line %d.\n", linecount); ! break; ! } ! ! *p++ = '\0'; ! if ((result = strncmp(temp_tz, sol, temp_tz_len)) == 0) { ! /* ! * If this is the current platform zone ID, ! * take the Java time zone ID (2nd field). ! */ ! java = p; ! while (*p != '\0' && *p != '\n') { ! p++; ! } ! ! if (*p == '\0') { ! /* mapping table is broken! */ ! jio_fprintf(stderr, "tzmappings: Illegal format at line %d.\n", linecount); ! break; ! } ! ! *p = '\0'; ! javatz = strdup(java); ! break; ! } else if (result < 0) { ! break; ! } ! } ! (void) fclose(tzmapf); ! ! tzerr: ! if (tz_buf != NULL ) { ! free((void *) tz_buf); ! } ! ! if (javatz == NULL) { ! return getGMTOffsetID(); ! } ! ! return javatz; ! } ! ! #endif /*_AIX*/ /* * findJavaTZ_md() maps platform time zone ID to Java time zone ID * using <java_home>/lib/tzmappings. If the TZ value is not found, it * trys some libc implementation dependent mappings. If it still
*** 662,719 **** char *javatz = NULL; char *freetz = NULL; tz = getenv("TZ"); - #if defined(__linux__) || defined(_ALLBSD_SOURCE) - if (tz == NULL) { - #else - #if defined (__solaris__) || defined(_AIX) if (tz == NULL || *tz == '\0') { - #endif - #endif tz = getPlatformTimeZoneID(); freetz = tz; } ! /* ! * Remove any preceding ':' ! */ ! if (tz != NULL && *tz == ':') { tz++; } - - #ifdef __solaris__ - if (tz != NULL && strcmp(tz, "localtime") == 0) { - tz = getSolarisDefaultZoneID(); - if (freetz != NULL) { - free((void *) freetz); - } - freetz = tz; - } - #endif - - if (tz != NULL) { #ifdef __linux__ ! /* ! * Ignore "posix/" prefix. ! */ if (strncmp(tz, "posix/", 6) == 0) { tz += 6; } #endif ! javatz = strdup(tz); if (freetz != NULL) { free((void *) freetz); } ! ! #ifdef _AIX ! freetz = mapPlatformToJavaTimezone(java_home_dir, javatz); ! if (javatz != NULL) { ! free((void *) javatz); } - javatz = freetz; #endif } return javatz; } --- 764,817 ---- char *javatz = NULL; char *freetz = NULL; tz = getenv("TZ"); if (tz == NULL || *tz == '\0') { tz = getPlatformTimeZoneID(); freetz = tz; } ! if (tz != NULL) { ! /* Ignore preceding ':' */ ! if (*tz == ':') { tz++; } #ifdef __linux__ ! /* Ignore "posix/" prefix on Linux. */ if (strncmp(tz, "posix/", 6) == 0) { tz += 6; } #endif ! ! #if defined(_AIX) ! /* On AIX do the platform to Java mapping. */ ! javatz = mapPlatformToJavaTimezone(java_home_dir, tz); if (freetz != NULL) { free((void *) freetz); } ! #else ! #if defined(__solaris__) ! /* Solaris might use localtime, so handle it here. */ ! if (strcmp(tz, "localtime") == 0) { ! javatz = getSolarisDefaultZoneID(); ! if (freetz != NULL) { ! free((void *) freetz); ! } ! } else ! #endif ! if (freetz == NULL) { ! /* strdup if we are still working on getenv result. */ ! javatz = strdup(tz); ! } else if (freetz != tz) { ! /* strdup and free the old buffer, if we moved the pointer. */ ! javatz = strdup(tz); ! free((void *) freetz); ! } else { ! /* we are good if we already work on a freshly allocated buffer. */ ! javatz = tz; } #endif } return javatz; }
*** 745,754 **** --- 843,853 ---- } sprintf(buf, (const char *)"GMT%c%02d:%02d", sign, (int)(offset/3600), (int)((offset%3600)/60)); return strdup(buf); } + #else char * getGMTOffsetID() {
*** 764,774 **** } offset = localtm.tm_isdst ? altzone : timezone; #else offset = timezone; ! #endif /*__linux__*/ if (offset == 0) { return strdup("GMT"); } --- 863,873 ---- } offset = localtm.tm_isdst ? altzone : timezone; #else offset = timezone; ! #endif if (offset == 0) { return strdup("GMT"); }
*** 782,884 **** sprintf(buf, (const char *)"GMT%c%02d:%02d", sign, (int)(offset/3600), (int)((offset%3600)/60)); return strdup(buf); } #endif /* MACOSX */ - - #ifdef _AIX - static char * - mapPlatformToJavaTimezone(const char *java_home_dir, const char *tz) { - FILE *tzmapf; - char mapfilename[PATH_MAX+1]; - char line[256]; - int linecount = 0; - char temp[100], *temp_tz; - char *javatz = NULL; - char *str_tmp = NULL; - size_t temp_tz_len = 0; - - /* On AIX, the TZ environment variable may end with a comma - * followed by modifier fields. These are ignored here. - */ - strncpy(temp, tz, 100); - temp_tz = strtok_r(temp, ",", &str_tmp); - - if(temp_tz == NULL) - goto tzerr; - - temp_tz_len = strlen(temp_tz); - - if (strlen(java_home_dir) >= (PATH_MAX - 15)) { - jio_fprintf(stderr, "java.home longer than maximum path length \n"); - goto tzerr; - } - - strncpy(mapfilename, java_home_dir, PATH_MAX); - strcat(mapfilename, "/lib/tzmappings"); - - if ((tzmapf = fopen(mapfilename, "r")) == NULL) { - jio_fprintf(stderr, "can't open %s\n", mapfilename); - goto tzerr; - } - - while (fgets(line, sizeof(line), tzmapf) != NULL) { - char *p = line; - char *sol = line; - char *java; - int result; - - linecount++; - /* - * Skip comments and blank lines - */ - if (*p == '#' || *p == '\n') { - continue; - } - - /* - * Get the first field, platform zone ID - */ - while (*p != '\0' && *p != '\t') { - p++; - } - if (*p == '\0') { - /* mapping table is broken! */ - jio_fprintf(stderr, "tzmappings: Illegal format at near line %d.\n", linecount); - break; - } - - *p++ = '\0'; - if ((result = strncmp(temp_tz, sol, temp_tz_len)) == 0) { - /* - * If this is the current platform zone ID, - * take the Java time zone ID (2nd field). - */ - java = p; - while (*p != '\0' && *p != '\n') { - p++; - } - - if (*p == '\0') { - /* mapping table is broken! */ - jio_fprintf(stderr, "tzmappings: Illegal format at line %d.\n", linecount); - break; - } - - *p = '\0'; - javatz = strdup(java); - break; - } else if (result < 0) { - break; - } - } - (void) fclose(tzmapf); - - tzerr: - if (javatz == NULL) { - return getGMTOffsetID(); - } - - return javatz; - } - #endif - --- 881,885 ----
< prev index next >