src/java.base/unix/native/libjava/TimeZone_md.c
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 58191 8a8e87e8a4fd
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
58186
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
     2
 * Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3740
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3740
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3740
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3740
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3740
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
#include <stdlib.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
#include <stdio.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
#include <strings.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    29
#include <time.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
#include <limits.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
#include <errno.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    32
#include <stddef.h>
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
    33
#include <sys/stat.h>
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
    34
#include <sys/types.h>
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
#include <string.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
#include <dirent.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
#include <unistd.h>
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
    38
#if defined(__solaris__)
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
    39
#include <libscf.h>
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
#include "jvm.h"
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
    43
#include "TimeZone_md.h"
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
58186
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
    45
static char *isFileIdentical(char* buf, size_t size, char *pathname);
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
    46
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
#define SKIP_SPACE(p)   while (*p == ' ' || *p == '\t') p++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
39893
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
    49
#define RESTARTABLE(_cmd, _result) do { \
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
    50
  do { \
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
    51
    _result = _cmd; \
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
    52
  } while((_result == -1) && (errno == EINTR)); \
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
    53
} while(0)
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
    54
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
#if !defined(__solaris__) || defined(__sparcv9) || defined(amd64)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
#define fileopen        fopen
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
#define filegets        fgets
90ce3da70b43 Initial load
duke
parents:
diff changeset
    58
#define fileclose       fclose
90ce3da70b43 Initial load
duke
parents:
diff changeset
    59
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
    60
53029
8180809085a4 8214077: test java/io/File/SetLastModified.java fails on ARM32
alanb
parents: 51597
diff changeset
    61
#if defined(_ALLBSD_SOURCE)
8180809085a4 8214077: test java/io/File/SetLastModified.java fails on ARM32
alanb
parents: 51597
diff changeset
    62
#define stat64 stat
8180809085a4 8214077: test java/io/File/SetLastModified.java fails on ARM32
alanb
parents: 51597
diff changeset
    63
#define lstat64 lstat
8180809085a4 8214077: test java/io/File/SetLastModified.java fails on ARM32
alanb
parents: 51597
diff changeset
    64
#define fstat64 fstat
8180809085a4 8214077: test java/io/File/SetLastModified.java fails on ARM32
alanb
parents: 51597
diff changeset
    65
#endif
8180809085a4 8214077: test java/io/File/SetLastModified.java fails on ARM32
alanb
parents: 51597
diff changeset
    66
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents: 10702
diff changeset
    67
#if defined(__linux__) || defined(_ALLBSD_SOURCE)
3740
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
    68
static const char *ETC_TIMEZONE_FILE = "/etc/timezone";
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
    69
static const char *ZONEINFO_DIR = "/usr/share/zoneinfo";
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
    70
static const char *DEFAULT_ZONEINFO_FILE = "/etc/localtime";
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
    71
#else
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
    72
static const char *SYS_INIT_FILE = "/etc/default/init";
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
    73
static const char *ZONEINFO_DIR = "/usr/share/lib/zoneinfo";
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
    74
static const char *DEFAULT_ZONEINFO_FILE = "/usr/share/lib/zoneinfo/localtime";
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
    75
#endif /* defined(__linux__) || defined(_ALLBSD_SOURCE) */
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
    76
58186
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
    77
static const char popularZones[][4] = {"UTC", "GMT"};
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
    78
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
    79
#if defined(_AIX)
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
    80
static const char *ETC_ENVIRONMENT_FILE = "/etc/environment";
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
    81
#endif
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
    82
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
    83
#if defined(__linux__) || defined(MACOSX) || defined(__solaris__)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
/*
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
    86
 * Returns a pointer to the zone ID portion of the given zoneinfo file
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
    87
 * name, or NULL if the given string doesn't contain "zoneinfo/".
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    88
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
static char *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
getZoneName(char *str)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
    static const char *zidir = "zoneinfo/";
90ce3da70b43 Initial load
duke
parents:
diff changeset
    93
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
    94
    char *pos = strstr((const char *)str, zidir);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
    if (pos == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    96
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
    return pos + strlen(zidir);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
 * Returns a path name created from the given 'dir' and 'name' under
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
 * UNIX. This function allocates memory for the pathname calling
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   104
 * malloc(). NULL is returned if malloc() fails.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
static char *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
getPathName(const char *dir, const char *name) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
    char *path;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
    path = (char *) malloc(strlen(dir) + strlen(name) + 2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
    if (path == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
    return strcat(strcat(strcpy(path, dir), "/"), name);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
 * Scans the specified directory and its subdirectories to find a
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   119
 * zoneinfo file which has the same content as /etc/localtime on Linux
12182
97ccd7eba4f3 7149608: Default TZ detection fails on linux when symbolic links to non default location used.
coffeys
parents: 12047
diff changeset
   120
 * or /usr/share/lib/zoneinfo/localtime on Solaris given in 'buf'.
97ccd7eba4f3 7149608: Default TZ detection fails on linux when symbolic links to non default location used.
coffeys
parents: 12047
diff changeset
   121
 * If file is symbolic link, then the contents it points to are in buf.
97ccd7eba4f3 7149608: Default TZ detection fails on linux when symbolic links to non default location used.
coffeys
parents: 12047
diff changeset
   122
 * Returns a zone ID if found, otherwise, NULL is returned.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
static char *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
findZoneinfoFile(char *buf, size_t size, const char *dir)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   127
    DIR *dirp = NULL;
51597
4c78f4fd8370 8207744: Clean up inconsistent use of opendir/closedir versus opendir64/closedir64
bpb
parents: 51105
diff changeset
   128
    struct dirent *dp = NULL;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
    char *pathname = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
    char *tz = NULL;
39893
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   131
    int res;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
58186
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   133
    if (strcmp(dir, ZONEINFO_DIR) == 0) {
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   134
        /* fast path for 1st iteration */
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   135
        for (unsigned int i = 0; i < sizeof (popularZones) / sizeof (popularZones[0]); i++) {
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   136
            pathname = getPathName(dir, popularZones[i]);
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   137
            if (pathname == NULL) {
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   138
                continue;
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   139
            }
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   140
            tz = isFileIdentical(buf, size, pathname);
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   141
            free((void *) pathname);
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   142
            pathname = NULL;
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   143
            if (tz != NULL) {
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   144
                return tz;
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   145
            }
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   146
        }
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   147
    }
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   148
58191
8a8e87e8a4fd 8231124: Missing closedir call with JDK-8223490
coffeys
parents: 58186
diff changeset
   149
    dirp = opendir(dir);
8a8e87e8a4fd 8231124: Missing closedir call with JDK-8223490
coffeys
parents: 58186
diff changeset
   150
    if (dirp == NULL) {
8a8e87e8a4fd 8231124: Missing closedir call with JDK-8223490
coffeys
parents: 58186
diff changeset
   151
        return NULL;
8a8e87e8a4fd 8231124: Missing closedir call with JDK-8223490
coffeys
parents: 58186
diff changeset
   152
    }
8a8e87e8a4fd 8231124: Missing closedir call with JDK-8223490
coffeys
parents: 58186
diff changeset
   153
51597
4c78f4fd8370 8207744: Clean up inconsistent use of opendir/closedir versus opendir64/closedir64
bpb
parents: 51105
diff changeset
   154
    while ((dp = readdir(dirp)) != NULL) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
         * Skip '.' and '..' (and possibly other .* files)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
        if (dp->d_name[0] == '.') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
            continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   160
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
        /*
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   163
         * Skip "ROC", "posixrules", and "localtime".
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
        if ((strcmp(dp->d_name, "ROC") == 0)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
            || (strcmp(dp->d_name, "posixrules") == 0)
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   167
#if defined(__solaris__)
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   168
            /*
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   169
             * Skip the "src" and "tab" directories on Solaris.
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   170
             */
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   171
            || (strcmp(dp->d_name, "src") == 0)
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   172
            || (strcmp(dp->d_name, "tab") == 0)
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   173
#endif
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
            || (strcmp(dp->d_name, "localtime") == 0)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
            continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
        pathname = getPathName(dir, dp->d_name);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
        if (pathname == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
58186
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   183
        tz = isFileIdentical(buf, size, pathname);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
        free((void *) pathname);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
        pathname = NULL;
58186
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   186
        if (tz != NULL) {
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   187
           break;
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   188
        }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
    if (dirp != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
        (void) closedir(dirp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
    }
58186
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   194
    return tz;
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   195
}
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   196
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   197
/*
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   198
 * Checks if the file pointed to by pathname matches
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   199
 * the data contents in buf.
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   200
 * Returns a representation of the timezone file name
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   201
 * if file match is found, otherwise NULL.
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   202
 */
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   203
static char *
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   204
isFileIdentical(char *buf, size_t size, char *pathname)
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   205
{
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   206
    char *possibleMatch = NULL;
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   207
    struct stat64 statbuf;
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   208
    char *dbuf = NULL;
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   209
    int fd = -1;
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   210
    int res;
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   211
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   212
    RESTARTABLE(stat64(pathname, &statbuf), res);
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   213
    if (res == -1) {
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   214
        return NULL;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
    }
58186
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   216
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   217
    if (S_ISDIR(statbuf.st_mode)) {
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   218
        possibleMatch  = findZoneinfoFile(buf, size, pathname);
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   219
    } else if (S_ISREG(statbuf.st_mode) && (size_t)statbuf.st_size == size) {
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   220
        dbuf = (char *) malloc(size);
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   221
        if (dbuf == NULL) {
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   222
            return NULL;
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   223
        }
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   224
        RESTARTABLE(open(pathname, O_RDONLY), fd);
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   225
        if (fd == -1) {
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   226
            goto freedata;
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   227
        }
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   228
        RESTARTABLE(read(fd, dbuf, size), res);
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   229
        if (res != (ssize_t) size) {
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   230
            goto freedata;
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   231
        }
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   232
        if (memcmp(buf, dbuf, size) == 0) {
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   233
            possibleMatch = getZoneName(pathname);
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   234
            if (possibleMatch != NULL) {
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   235
                possibleMatch = strdup(possibleMatch);
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   236
            }
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   237
        }
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   238
        freedata:
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   239
        free((void *) dbuf);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   240
        (void) close(fd);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
    }
58186
8ee083465318 8223490: Optimize search algorithm for determining default time zone
coffeys
parents: 53029
diff changeset
   242
    return possibleMatch;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   243
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents: 10702
diff changeset
   245
#if defined(__linux__) || defined(MACOSX)
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   246
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   247
/*
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   248
 * Performs Linux specific mapping and returns a zone ID
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
 * if found. Otherwise, NULL is returned.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   250
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   251
static char *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   252
getPlatformTimeZoneID()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
{
53029
8180809085a4 8214077: test java/io/File/SetLastModified.java fails on ARM32
alanb
parents: 51597
diff changeset
   254
    struct stat64 statbuf;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
    char *tz = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   256
    FILE *fp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
    int fd;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
    char *buf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
    size_t size;
39893
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   260
    int res;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   261
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   262
#if defined(__linux__)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
    /*
3740
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
   264
     * Try reading the /etc/timezone file for Debian distros. There's
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
   265
     * no spec of the file format available. This parsing assumes that
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
   266
     * there's one line of an Olson tzid followed by a '\n', no
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
   267
     * leading or trailing spaces, no comments.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
     */
3740
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
   269
    if ((fp = fopen(ETC_TIMEZONE_FILE, "r")) != NULL) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
        char line[256];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   271
3740
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
   272
        if (fgets(line, sizeof(line), fp) != NULL) {
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
   273
            char *p = strchr(line, '\n');
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
   274
            if (p != NULL) {
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
   275
                *p = '\0';
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
            }
3740
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
   277
            if (strlen(line) > 0) {
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
   278
                tz = strdup(line);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   279
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   281
        (void) fclose(fp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
        if (tz != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
            return tz;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
    }
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   286
#endif /* defined(__linux__) */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   289
     * Next, try /etc/localtime to find the zone ID.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
     */
53029
8180809085a4 8214077: test java/io/File/SetLastModified.java fails on ARM32
alanb
parents: 51597
diff changeset
   291
    RESTARTABLE(lstat64(DEFAULT_ZONEINFO_FILE, &statbuf), res);
39893
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   292
    if (res == -1) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   295
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   297
     * If it's a symlink, get the link name and its zone ID part. (The
90ce3da70b43 Initial load
duke
parents:
diff changeset
   298
     * older versions of timeconfig created a symlink as described in
90ce3da70b43 Initial load
duke
parents:
diff changeset
   299
     * the Red Hat man page. It was changed in 1999 to create a copy
90ce3da70b43 Initial load
duke
parents:
diff changeset
   300
     * of a zoneinfo file. It's no longer possible to get the zone ID
90ce3da70b43 Initial load
duke
parents:
diff changeset
   301
     * from /etc/localtime.)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   302
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   303
    if (S_ISLNK(statbuf.st_mode)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   304
        char linkbuf[PATH_MAX+1];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   305
        int len;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   306
3740
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
   307
        if ((len = readlink(DEFAULT_ZONEINFO_FILE, linkbuf, sizeof(linkbuf)-1)) == -1) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   308
            jio_fprintf(stderr, (const char *) "can't get a symlink of %s\n",
3740
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
   309
                        DEFAULT_ZONEINFO_FILE);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   310
            return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   311
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
        linkbuf[len] = '\0';
90ce3da70b43 Initial load
duke
parents:
diff changeset
   313
        tz = getZoneName(linkbuf);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   314
        if (tz != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   315
            tz = strdup(tz);
12182
97ccd7eba4f3 7149608: Default TZ detection fails on linux when symbolic links to non default location used.
coffeys
parents: 12047
diff changeset
   316
            return tz;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   317
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   318
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   319
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
     * If it's a regular file, we need to find out the same zoneinfo file
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
     * that has been copied as /etc/localtime.
12182
97ccd7eba4f3 7149608: Default TZ detection fails on linux when symbolic links to non default location used.
coffeys
parents: 12047
diff changeset
   323
     * If initial symbolic link resolution failed, we should treat target
97ccd7eba4f3 7149608: Default TZ detection fails on linux when symbolic links to non default location used.
coffeys
parents: 12047
diff changeset
   324
     * file as a regular file.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
     */
39893
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   326
    RESTARTABLE(open(DEFAULT_ZONEINFO_FILE, O_RDONLY), fd);
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   327
    if (fd == -1) {
12182
97ccd7eba4f3 7149608: Default TZ detection fails on linux when symbolic links to non default location used.
coffeys
parents: 12047
diff changeset
   328
        return NULL;
97ccd7eba4f3 7149608: Default TZ detection fails on linux when symbolic links to non default location used.
coffeys
parents: 12047
diff changeset
   329
    }
39893
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   330
53029
8180809085a4 8214077: test java/io/File/SetLastModified.java fails on ARM32
alanb
parents: 51597
diff changeset
   331
    RESTARTABLE(fstat64(fd, &statbuf), res);
39893
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   332
    if (res == -1) {
12182
97ccd7eba4f3 7149608: Default TZ detection fails on linux when symbolic links to non default location used.
coffeys
parents: 12047
diff changeset
   333
        (void) close(fd);
97ccd7eba4f3 7149608: Default TZ detection fails on linux when symbolic links to non default location used.
coffeys
parents: 12047
diff changeset
   334
        return NULL;
97ccd7eba4f3 7149608: Default TZ detection fails on linux when symbolic links to non default location used.
coffeys
parents: 12047
diff changeset
   335
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   336
    size = (size_t) statbuf.st_size;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   337
    buf = (char *) malloc(size);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   338
    if (buf == NULL) {
12182
97ccd7eba4f3 7149608: Default TZ detection fails on linux when symbolic links to non default location used.
coffeys
parents: 12047
diff changeset
   339
        (void) close(fd);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   340
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   341
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   342
39893
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   343
    RESTARTABLE(read(fd, buf, size), res);
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   344
    if (res != (ssize_t) size) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   345
        (void) close(fd);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   346
        free((void *) buf);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   347
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   348
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   349
    (void) close(fd);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   350
3740
efb34ff1cef4 6456628: (tz) Default timezone is incorrectly set occasionally on Linux
peytoia
parents: 2
diff changeset
   351
    tz = findZoneinfoFile(buf, size, ZONEINFO_DIR);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   352
    free((void *) buf);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   353
    return tz;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   354
}
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   355
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   356
#elif defined(__solaris__)
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   357
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   358
#if !defined(__sparcv9) && !defined(amd64)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   359
90ce3da70b43 Initial load
duke
parents:
diff changeset
   360
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   361
 * Those file* functions mimic the UNIX stream io functions. This is
90ce3da70b43 Initial load
duke
parents:
diff changeset
   362
 * because of the limitation of the number of open files on Solaris
90ce3da70b43 Initial load
duke
parents:
diff changeset
   363
 * (32-bit mode only) due to the System V ABI.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   364
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   365
90ce3da70b43 Initial load
duke
parents:
diff changeset
   366
#define BUFFER_SIZE     4096
90ce3da70b43 Initial load
duke
parents:
diff changeset
   367
90ce3da70b43 Initial load
duke
parents:
diff changeset
   368
static struct iobuffer {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   369
    int     magic;      /* -1 to distinguish from the real FILE */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   370
    int     fd;         /* file descriptor */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   371
    char    *buffer;    /* pointer to buffer */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   372
    char    *ptr;       /* current read pointer */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   373
    char    *endptr;    /* end pointer */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   374
};
90ce3da70b43 Initial load
duke
parents:
diff changeset
   375
90ce3da70b43 Initial load
duke
parents:
diff changeset
   376
static int
90ce3da70b43 Initial load
duke
parents:
diff changeset
   377
fileclose(FILE *stream)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   378
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   379
    struct iobuffer *iop = (struct iobuffer *) stream;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   380
90ce3da70b43 Initial load
duke
parents:
diff changeset
   381
    if (iop->magic != -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   382
        return fclose(stream);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   383
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   384
90ce3da70b43 Initial load
duke
parents:
diff changeset
   385
    if (iop == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   386
        return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   387
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   388
    close(iop->fd);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   389
    free((void *)iop->buffer);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   390
    free((void *)iop);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   391
    return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   392
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   393
90ce3da70b43 Initial load
duke
parents:
diff changeset
   394
static FILE *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   395
fileopen(const char *fname, const char *fmode)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   396
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   397
    FILE *fp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   398
    int fd;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   399
    struct iobuffer *iop;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   400
90ce3da70b43 Initial load
duke
parents:
diff changeset
   401
    if ((fp = fopen(fname, fmode)) != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   402
        return fp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   403
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   404
90ce3da70b43 Initial load
duke
parents:
diff changeset
   405
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   406
     * It assumes read open.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   407
     */
39893
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   408
    RESTARTABLE(open(fname, O_RDONLY), fd);
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   409
    if (fd == -1) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   410
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   411
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   412
90ce3da70b43 Initial load
duke
parents:
diff changeset
   413
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   414
     * Allocate struct iobuffer and its buffer
90ce3da70b43 Initial load
duke
parents:
diff changeset
   415
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   416
    iop = malloc(sizeof(struct iobuffer));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   417
    if (iop == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   418
        (void) close(fd);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   419
        errno = ENOMEM;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   420
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   421
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   422
    iop->magic = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   423
    iop->fd = fd;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   424
    iop->buffer = malloc(BUFFER_SIZE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   425
    if (iop->buffer == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   426
        (void) close(fd);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   427
        free((void *) iop);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   428
        errno = ENOMEM;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   429
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   430
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   431
    iop->ptr = iop->buffer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   432
    iop->endptr = iop->buffer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   433
    return (FILE *)iop;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   434
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   435
90ce3da70b43 Initial load
duke
parents:
diff changeset
   436
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   437
 * This implementation assumes that n is large enough and the line
90ce3da70b43 Initial load
duke
parents:
diff changeset
   438
 * separator is '\n'.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   439
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   440
static char *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   441
filegets(char *s, int n, FILE *stream)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   442
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   443
    struct iobuffer *iop = (struct iobuffer *) stream;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   444
    char *p;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   445
90ce3da70b43 Initial load
duke
parents:
diff changeset
   446
    if (iop->magic != -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   447
        return fgets(s, n, stream);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   448
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   449
90ce3da70b43 Initial load
duke
parents:
diff changeset
   450
    p = s;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   451
    for (;;) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   452
        char c;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   453
90ce3da70b43 Initial load
duke
parents:
diff changeset
   454
        if (iop->ptr == iop->endptr) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   455
            ssize_t len;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   456
39893
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   457
            RESTARTABLE(read(iop->fd, (void *)iop->buffer, BUFFER_SIZE), len);
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   458
            if (len == -1) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   459
                return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   460
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   461
            if (len == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   462
                *p = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   463
                if (s == p) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   464
                    return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   465
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   466
                return s;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   467
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   468
            iop->ptr = iop->buffer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   469
            iop->endptr = iop->buffer + len;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   470
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   471
        c = *iop->ptr++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   472
        *p++ = c;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   473
        if ((p - s) == (n - 1)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   474
            *p = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   475
            return s;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   476
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   477
        if (c == '\n') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   478
            *p = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   479
            return s;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   480
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   481
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   482
    /*NOTREACHED*/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   483
}
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   484
#endif /* !defined(__sparcv9) && !defined(amd64) */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   485
90ce3da70b43 Initial load
duke
parents:
diff changeset
   486
/*
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   487
 * Performs Solaris dependent mapping. Returns a zone ID if
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   488
 * found. Otherwise, NULL is returned.  Solaris libc looks up
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   489
 * "/etc/default/init" to get the default TZ value if TZ is not defined
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   490
 * as an environment variable.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   491
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   492
static char *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   493
getPlatformTimeZoneID()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   494
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   495
    char *tz = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   496
    FILE *fp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   497
90ce3da70b43 Initial load
duke
parents:
diff changeset
   498
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   499
     * Try the TZ entry in /etc/default/init.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   500
     */
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   501
    if ((fp = fileopen(SYS_INIT_FILE, "r")) != NULL) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   502
        char line[256];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   503
        char quote = '\0';
90ce3da70b43 Initial load
duke
parents:
diff changeset
   504
90ce3da70b43 Initial load
duke
parents:
diff changeset
   505
        while (filegets(line, sizeof(line), fp) != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   506
            char *p = line;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   507
            char *s;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   508
            char c;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   509
90ce3da70b43 Initial load
duke
parents:
diff changeset
   510
            /* quick check for comment lines */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   511
            if (*p == '#') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   512
                continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   513
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   514
            if (strncmp(p, "TZ=", 3) == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   515
                p += 3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   516
                SKIP_SPACE(p);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   517
                c = *p;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   518
                if (c == '"' || c == '\'') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   519
                    quote = c;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   520
                    p++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   521
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   522
90ce3da70b43 Initial load
duke
parents:
diff changeset
   523
                /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   524
                 * PSARC/2001/383: quoted string support
90ce3da70b43 Initial load
duke
parents:
diff changeset
   525
                 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   526
                for (s = p; (c = *s) != '\0' && c != '\n'; s++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   527
                    /* No '\\' is supported here. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   528
                    if (c == quote) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   529
                        quote = '\0';
90ce3da70b43 Initial load
duke
parents:
diff changeset
   530
                        break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   531
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   532
                    if (c == ' ' && quote == '\0') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   533
                        break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   534
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   535
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   536
                if (quote != '\0') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   537
                    jio_fprintf(stderr, "ZoneInfo: unterminated time zone name in /etc/TIMEZONE\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   538
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   539
                *s = '\0';
90ce3da70b43 Initial load
duke
parents:
diff changeset
   540
                tz = strdup(p);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   541
                break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   542
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   543
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   544
        (void) fileclose(fp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   545
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   546
    return tz;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   547
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   548
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   549
#define TIMEZONE_FMRI   "svc:/system/timezone:default"
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   550
#define TIMEZONE_PG     "timezone"
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   551
#define LOCALTIME_PROP  "localtime"
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   552
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   553
static void
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   554
cleanupScf(scf_handle_t *h,
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   555
           scf_snapshot_t *snap,
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   556
           scf_instance_t *inst,
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   557
           scf_propertygroup_t *pg,
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   558
           scf_property_t *prop,
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   559
           scf_value_t *val,
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   560
           char *buf) {
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   561
    if (buf != NULL) {
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   562
        free(buf);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   563
    }
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   564
    if (snap != NULL) {
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   565
        scf_snapshot_destroy(snap);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   566
    }
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   567
    if (val != NULL) {
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   568
        scf_value_destroy(val);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   569
    }
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   570
    if (prop != NULL) {
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   571
        scf_property_destroy(prop);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   572
    }
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   573
    if (pg != NULL) {
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   574
        scf_pg_destroy(pg);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   575
    }
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   576
    if (inst != NULL) {
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   577
        scf_instance_destroy(inst);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   578
    }
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   579
    if (h != NULL) {
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   580
        scf_handle_destroy(h);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   581
    }
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   582
}
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   583
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   584
/*
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   585
 * Returns a zone ID of Solaris when the TZ value is "localtime".
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   586
 * First, it tries scf. If scf fails, it looks for the same file as
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   587
 * /usr/share/lib/zoneinfo/localtime under /usr/share/lib/zoneinfo/.
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   588
 */
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   589
static char *
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   590
getSolarisDefaultZoneID() {
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   591
    char *tz = NULL;
53029
8180809085a4 8214077: test java/io/File/SetLastModified.java fails on ARM32
alanb
parents: 51597
diff changeset
   592
    struct stat64 statbuf;
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   593
    size_t size;
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   594
    char *buf;
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   595
    int fd;
39893
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   596
    int res;
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   597
    /* scf specific variables */
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   598
    scf_handle_t *h = NULL;
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   599
    scf_snapshot_t *snap = NULL;
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   600
    scf_instance_t *inst = NULL;
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   601
    scf_propertygroup_t *pg = NULL;
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   602
    scf_property_t *prop = NULL;
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   603
    scf_value_t *val = NULL;
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   604
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   605
    if ((h = scf_handle_create(SCF_VERSION)) != NULL
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   606
        && scf_handle_bind(h) == 0
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   607
        && (inst = scf_instance_create(h)) != NULL
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   608
        && (snap = scf_snapshot_create(h)) != NULL
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   609
        && (pg = scf_pg_create(h)) != NULL
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   610
        && (prop = scf_property_create(h)) != NULL
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   611
        && (val = scf_value_create(h)) != NULL
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   612
        && scf_handle_decode_fmri(h, TIMEZONE_FMRI, NULL, NULL, inst,
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   613
                                  NULL, NULL, SCF_DECODE_FMRI_REQUIRE_INSTANCE) == 0
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   614
        && scf_instance_get_snapshot(inst, "running", snap) == 0
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   615
        && scf_instance_get_pg_composed(inst, snap, TIMEZONE_PG, pg) == 0
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   616
        && scf_pg_get_property(pg, LOCALTIME_PROP, prop) == 0
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   617
        && scf_property_get_value(prop, val) == 0) {
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   618
        ssize_t len;
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   619
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   620
        /* Gets the length of the zone ID string */
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   621
        len = scf_value_get_astring(val, NULL, 0);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   622
        if (len != -1) {
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   623
            tz = malloc(++len); /* +1 for a null byte */
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   624
            if (tz != NULL && scf_value_get_astring(val, tz, len) != -1) {
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   625
                cleanupScf(h, snap, inst, pg, prop, val, NULL);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   626
                return tz;
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   627
            }
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   628
        }
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   629
    }
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   630
    cleanupScf(h, snap, inst, pg, prop, val, tz);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   631
53029
8180809085a4 8214077: test java/io/File/SetLastModified.java fails on ARM32
alanb
parents: 51597
diff changeset
   632
    RESTARTABLE(stat64(DEFAULT_ZONEINFO_FILE, &statbuf), res);
39893
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   633
    if (res == -1) {
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   634
        return NULL;
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   635
    }
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   636
    size = (size_t) statbuf.st_size;
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   637
    buf = malloc(size);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   638
    if (buf == NULL) {
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   639
        return NULL;
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   640
    }
39893
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   641
    RESTARTABLE(open(DEFAULT_ZONEINFO_FILE, O_RDONLY), fd);
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   642
    if (fd == -1) {
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   643
        free((void *) buf);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   644
        return NULL;
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   645
    }
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   646
39893
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   647
    RESTARTABLE(read(fd, buf, size), res);
56745139718c 7153347: System read/stat/open calls should be hardened to handle EINTR
nishjain
parents: 39887
diff changeset
   648
    if (res != (ssize_t) size) {
10700
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   649
        (void) close(fd);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   650
        free((void *) buf);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   651
        return NULL;
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   652
    }
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   653
    (void) close(fd);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   654
    tz = findZoneinfoFile(buf, size, ZONEINFO_DIR);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   655
    free((void *) buf);
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   656
    return tz;
31c24f40f614 7092679: (tz) Java getting wrong timezone/DST info on Solaris 11
okutsu
parents: 5506
diff changeset
   657
}
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   658
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   659
#endif /* defined(__solaris__) */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   660
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   661
#elif defined(_AIX)
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   662
22597
7515a991bb37 8024854: PPC64: Basic changes and files to build the class library on AIX
simonis
parents: 12689
diff changeset
   663
static char *
7515a991bb37 8024854: PPC64: Basic changes and files to build the class library on AIX
simonis
parents: 12689
diff changeset
   664
getPlatformTimeZoneID()
7515a991bb37 8024854: PPC64: Basic changes and files to build the class library on AIX
simonis
parents: 12689
diff changeset
   665
{
23929
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   666
    FILE *fp;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   667
    char *tz = NULL;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   668
    char *tz_key = "TZ=";
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   669
    char line[256];
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   670
    size_t tz_key_len = strlen(tz_key);
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   671
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   672
    if ((fp = fopen(ETC_ENVIRONMENT_FILE, "r")) != NULL) {
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   673
        while (fgets(line, sizeof(line), fp) != NULL) {
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   674
            char *p = strchr(line, '\n');
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   675
            if (p != NULL) {
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   676
                *p = '\0';
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   677
            }
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   678
            if (0 == strncmp(line, tz_key, tz_key_len)) {
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   679
                tz = strdup(line + tz_key_len);
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   680
                break;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   681
            }
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   682
        }
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   683
        (void) fclose(fp);
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   684
    }
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   685
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   686
    return tz;
22597
7515a991bb37 8024854: PPC64: Basic changes and files to build the class library on AIX
simonis
parents: 12689
diff changeset
   687
}
7515a991bb37 8024854: PPC64: Basic changes and files to build the class library on AIX
simonis
parents: 12689
diff changeset
   688
23929
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   689
static char *
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   690
mapPlatformToJavaTimezone(const char *java_home_dir, const char *tz) {
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   691
    FILE *tzmapf;
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   692
    char mapfilename[PATH_MAX + 1];
23929
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   693
    char line[256];
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   694
    int linecount = 0;
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   695
    char *tz_buf = NULL;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   696
    char *temp_tz = NULL;
23929
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   697
    char *javatz = NULL;
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   698
    size_t tz_len = 0;
23929
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   699
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   700
    /* On AIX, the TZ environment variable may end with a comma
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   701
     * followed by modifier fields. These are ignored here. */
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   702
    temp_tz = strchr(tz, ',');
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   703
    tz_len = (temp_tz == NULL) ? strlen(tz) : temp_tz - tz;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   704
    tz_buf = (char *)malloc(tz_len + 1);
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   705
    memcpy(tz_buf, tz, tz_len);
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   706
    tz_buf[tz_len] = 0;
23929
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   707
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   708
    /* Open tzmappings file, with buffer overrun check */
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   709
    if ((strlen(java_home_dir) + 15) > PATH_MAX) {
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   710
        jio_fprintf(stderr, "Path %s/lib/tzmappings exceeds maximum path length\n", java_home_dir);
23929
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   711
        goto tzerr;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   712
    }
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   713
    strcpy(mapfilename, java_home_dir);
23929
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   714
    strcat(mapfilename, "/lib/tzmappings");
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   715
    if ((tzmapf = fopen(mapfilename, "r")) == NULL) {
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   716
        jio_fprintf(stderr, "can't open %s\n", mapfilename);
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   717
        goto tzerr;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   718
    }
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   719
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   720
    while (fgets(line, sizeof(line), tzmapf) != NULL) {
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   721
        char *p = line;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   722
        char *sol = line;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   723
        char *java;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   724
        int result;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   725
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   726
        linecount++;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   727
        /*
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   728
         * Skip comments and blank lines
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   729
         */
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   730
        if (*p == '#' || *p == '\n') {
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   731
            continue;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   732
        }
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   733
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   734
        /*
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   735
         * Get the first field, platform zone ID
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   736
         */
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   737
        while (*p != '\0' && *p != '\t') {
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   738
            p++;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   739
        }
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   740
        if (*p == '\0') {
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   741
            /* mapping table is broken! */
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   742
            jio_fprintf(stderr, "tzmappings: Illegal format at near line %d.\n", linecount);
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   743
            break;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   744
        }
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   745
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   746
        *p++ = '\0';
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   747
        if ((result = strncmp(tz_buf, sol, tz_len)) == 0) {
23929
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   748
            /*
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   749
             * If this is the current platform zone ID,
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   750
             * take the Java time zone ID (2nd field).
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   751
             */
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   752
            java = p;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   753
            while (*p != '\0' && *p != '\n') {
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   754
                p++;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   755
            }
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   756
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   757
            if (*p == '\0') {
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   758
                /* mapping table is broken! */
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   759
                jio_fprintf(stderr, "tzmappings: Illegal format at line %d.\n", linecount);
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   760
                break;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   761
            }
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   762
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   763
            *p = '\0';
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   764
            javatz = strdup(java);
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   765
            break;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   766
        } else if (result < 0) {
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   767
            break;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   768
        }
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   769
    }
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   770
    (void) fclose(tzmapf);
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   771
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   772
tzerr:
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   773
    if (tz_buf != NULL ) {
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   774
        free((void *) tz_buf);
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   775
    }
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   776
23929
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   777
    if (javatz == NULL) {
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   778
        return getGMTOffsetID();
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   779
    }
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   780
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   781
    return javatz;
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   782
}
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   783
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   784
#endif /* defined(_AIX) */
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   785
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   786
/*
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   787
 * findJavaTZ_md() maps platform time zone ID to Java time zone ID
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   788
 * using <java_home>/lib/tzmappings. If the TZ value is not found, it
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   789
 * trys some libc implementation dependent mappings. If it still
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   790
 * can't map to a Java time zone ID, it falls back to the GMT+/-hh:mm
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   791
 * form.
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   792
 */
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   793
/*ARGSUSED1*/
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   794
char *
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   795
findJavaTZ_md(const char *java_home_dir)
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   796
{
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   797
    char *tz;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   798
    char *javatz = NULL;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   799
    char *freetz = NULL;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   800
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   801
    tz = getenv("TZ");
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   802
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   803
    if (tz == NULL || *tz == '\0') {
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   804
        tz = getPlatformTimeZoneID();
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   805
        freetz = tz;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   806
    }
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   807
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   808
    if (tz != NULL) {
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   809
        /* Ignore preceding ':' */
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   810
        if (*tz == ':') {
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   811
            tz++;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   812
        }
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   813
#if defined(__linux__)
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   814
        /* Ignore "posix/" prefix on Linux. */
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   815
        if (strncmp(tz, "posix/", 6) == 0) {
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   816
            tz += 6;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   817
        }
23929
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   818
#endif
e70b7aee5962 8034220: Improve time zone mapping for AIX platform
luchsh
parents: 22597
diff changeset
   819
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   820
#if defined(_AIX)
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   821
        /* On AIX do the platform to Java mapping. */
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   822
        javatz = mapPlatformToJavaTimezone(java_home_dir, tz);
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   823
        if (freetz != NULL) {
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   824
            free((void *) freetz);
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   825
        }
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   826
#else
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   827
#if defined(__solaris__)
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   828
        /* Solaris might use localtime, so handle it here. */
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   829
        if (strcmp(tz, "localtime") == 0) {
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   830
            javatz = getSolarisDefaultZoneID();
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   831
            if (freetz != NULL) {
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   832
                free((void *) freetz);
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   833
            }
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   834
        } else
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   835
#endif
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   836
        if (freetz == NULL) {
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   837
            /* strdup if we are still working on getenv result. */
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   838
            javatz = strdup(tz);
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   839
        } else if (freetz != tz) {
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   840
            /* strdup and free the old buffer, if we moved the pointer. */
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   841
            javatz = strdup(tz);
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   842
            free((void *) freetz);
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   843
        } else {
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   844
            /* we are good if we already work on a freshly allocated buffer. */
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   845
            javatz = tz;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   846
        }
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   847
#endif
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   848
    }
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   849
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   850
    return javatz;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   851
}
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   852
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   853
/**
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   854
 * Returns a GMT-offset-based zone ID. (e.g., "GMT-08:00")
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   855
 */
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   856
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   857
#if defined(MACOSX)
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   858
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   859
char *
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   860
getGMTOffsetID()
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   861
{
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   862
    time_t offset;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   863
    char sign, buf[32];
39887
8d74d858fe75 8066652: Default TimeZone is GMT not local if user.timezone is invalid on Mac OS
rgoel
parents: 32513
diff changeset
   864
    struct tm local_tm;
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   865
    time_t clock;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   866
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   867
    clock = time(NULL);
39887
8d74d858fe75 8066652: Default TimeZone is GMT not local if user.timezone is invalid on Mac OS
rgoel
parents: 32513
diff changeset
   868
    if (localtime_r(&clock, &local_tm) == NULL) {
8d74d858fe75 8066652: Default TimeZone is GMT not local if user.timezone is invalid on Mac OS
rgoel
parents: 32513
diff changeset
   869
        return strdup("GMT");
8d74d858fe75 8066652: Default TimeZone is GMT not local if user.timezone is invalid on Mac OS
rgoel
parents: 32513
diff changeset
   870
    }
8d74d858fe75 8066652: Default TimeZone is GMT not local if user.timezone is invalid on Mac OS
rgoel
parents: 32513
diff changeset
   871
    offset = (time_t)local_tm.tm_gmtoff;
8d74d858fe75 8066652: Default TimeZone is GMT not local if user.timezone is invalid on Mac OS
rgoel
parents: 32513
diff changeset
   872
    if (offset == 0) {
8d74d858fe75 8066652: Default TimeZone is GMT not local if user.timezone is invalid on Mac OS
rgoel
parents: 32513
diff changeset
   873
        return strdup("GMT");
8d74d858fe75 8066652: Default TimeZone is GMT not local if user.timezone is invalid on Mac OS
rgoel
parents: 32513
diff changeset
   874
    }
8d74d858fe75 8066652: Default TimeZone is GMT not local if user.timezone is invalid on Mac OS
rgoel
parents: 32513
diff changeset
   875
    if (offset > 0) {
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   876
        sign = '+';
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   877
    } else {
39887
8d74d858fe75 8066652: Default TimeZone is GMT not local if user.timezone is invalid on Mac OS
rgoel
parents: 32513
diff changeset
   878
        offset = -offset;
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   879
        sign = '-';
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   880
    }
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   881
    sprintf(buf, (const char *)"GMT%c%02d:%02d",
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   882
            sign, (int)(offset/3600), (int)((offset%3600)/60));
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   883
    return strdup(buf);
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   884
}
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   885
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   886
#else
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   887
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   888
char *
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   889
getGMTOffsetID()
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   890
{
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   891
    time_t offset;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   892
    char sign, buf[32];
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   893
#if defined(__solaris__)
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   894
    struct tm localtm;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   895
    time_t currenttime;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   896
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   897
    currenttime = time(NULL);
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   898
    if (localtime_r(&currenttime, &localtm) == NULL) {
39887
8d74d858fe75 8066652: Default TimeZone is GMT not local if user.timezone is invalid on Mac OS
rgoel
parents: 32513
diff changeset
   899
        return strdup("GMT");
32513
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   900
    }
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   901
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   902
    offset = localtm.tm_isdst ? altzone : timezone;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   903
#else
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   904
    offset = timezone;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   905
#endif
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   906
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   907
    if (offset == 0) {
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   908
        return strdup("GMT");
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   909
    }
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   910
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   911
    /* Note that the time offset direction is opposite. */
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   912
    if (offset > 0) {
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   913
        sign = '-';
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   914
    } else {
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   915
        offset = -offset;
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   916
        sign = '+';
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   917
    }
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   918
    sprintf(buf, (const char *)"GMT%c%02d:%02d",
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   919
            sign, (int)(offset/3600), (int)((offset%3600)/60));
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   920
    return strdup(buf);
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   921
}
e0545ceeadd7 8134505: Cleanup of "TimeZone_md.c"
simonis
parents: 32274
diff changeset
   922
#endif /* MACOSX */