4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-08 18:19:08 +08:00

Cygwin: tzset(1): use GetDynamicTimeZoneInformation

Use official GetDynamicTimeZoneInformation() function instead of
scanning the registry for the timezone keyname.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2024-03-21 21:24:11 +01:00
parent 372eaba70d
commit 6c0240b545

View File

@ -15,10 +15,6 @@ details. */
#include <cygwin/version.h>
#include <windows.h>
#ifndef GEOID_NOT_AVAILABLE
#define GEOID_NOT_AVAILABLE -1
#endif
/* The auto-generated tzmap.h contains the mapping table from Windows timezone
and country per ISO 3166-1 to POSIX timezone. For more info, see the file
itself. */
@ -35,49 +31,6 @@ static struct option longopts[] =
static char opts[] = "hV";
#define REG_TZINFO L"SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation"
#define REG_TZDB L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones"
static inline HKEY
reg_open (HKEY pkey, PCWSTR path, const char *msg)
{
LONG ret;
HKEY hkey;
ret = RegOpenKeyExW (pkey, path, 0, KEY_READ, &hkey);
if (ret == ERROR_SUCCESS)
return hkey;
if (msg)
fprintf (stderr, "%s: cannot open registry %s, error code %" PRIu32 "\n",
program_invocation_short_name, msg, (unsigned int) ret);
return NULL;
}
/* For symmetry */
#define reg_close(hkey) RegCloseKey(hkey)
static inline BOOL
reg_query (HKEY hkey, PCWSTR value, PWCHAR buf, DWORD size, const char *msg)
{
LONG ret;
DWORD type;
ret = RegQueryValueExW (hkey, value, 0, &type, (LPBYTE) buf, &size);
if (ret == ERROR_SUCCESS)
return TRUE;
if (msg)
fprintf (stderr, "%s: cannot query registry %s, error code %" PRIu32 "\n",
program_invocation_short_name, msg, (unsigned int) ret);
return FALSE;
}
static inline BOOL
reg_enum (HKEY hkey, int idx, PWCHAR name, DWORD size)
{
return RegEnumKeyExW (hkey, idx, name, &size, NULL, NULL, NULL, NULL)
== ERROR_SUCCESS;
}
static void __attribute__ ((__noreturn__))
usage (FILE *stream)
{
@ -119,8 +72,8 @@ print_version ()
int
main (int argc, char **argv)
{
HKEY hkey;
WCHAR keyname[256], country[10], *spc;
DYNAMIC_TIME_ZONE_INFORMATION tz;
WCHAR country[10], *spc;
GEOID geo;
int opt, idx, gotit = -1;
@ -141,18 +94,8 @@ main (int argc, char **argv)
if (optind < argc)
usage (stderr);
/* First fetch current timezone information from registry. */
hkey = reg_open (HKEY_LOCAL_MACHINE, REG_TZINFO, "timezone information");
if (!hkey)
if (GetDynamicTimeZoneInformation (&tz) == TIME_ZONE_ID_INVALID)
return 1;
/* Vista introduced the TimeZoneKeyName value, which simplifies the
job a lot. */
if (!reg_query (hkey, L"TimeZoneKeyName", keyname, sizeof keyname, NULL))
{
reg_close (hkey);
return 1;
}
reg_close (hkey);
/* We fetch the current Geo-location of the user and convert it to an
ISO 3166-1 compatible nation code. */
@ -169,7 +112,7 @@ main (int argc, char **argv)
/* Now iterate over the mapping table and find the right entry. */
for (idx = 0; idx < TZMAP_SIZE; ++idx)
{
if (!wcscasecmp (keyname, tzmap[idx].win_tzkey))
if (!wcscasecmp (tz.TimeZoneKeyName, tzmap[idx].win_tzkey))
{
if (gotit < 0)
gotit = idx;
@ -189,7 +132,7 @@ main (int argc, char **argv)
fprintf (stderr,
"%s: can't find matching POSIX timezone for "
"Windows timezone \"%ls\"\n",
program_invocation_short_name, keyname);
program_invocation_short_name, tz.TimeZoneKeyName);
return 1;
}
idx = gotit;