public inbox for cygwin-cvs@sourceware.org
help / color / mirror / Atom feed
From: Corinna Vinschen <corinna@sourceware.org>
To: cygwin-cvs@sourceware.org
Subject: [newlib-cygwin/cygwin-3_5-branch] Cygwin: tzset(1): use GetDynamicTimeZoneInformation
Date: Wed,  3 Apr 2024 16:56:16 +0000 (GMT)	[thread overview]
Message-ID: <20240403165616.2735A38460B2@sourceware.org> (raw)

https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=6c0240b54539d5396df1c6ee0c75b213e57c67bc

commit 6c0240b54539d5396df1c6ee0c75b213e57c67bc
Author:     Corinna Vinschen <corinna@vinschen.de>
AuthorDate: Thu Mar 21 21:24:11 2024 +0100
Commit:     Corinna Vinschen <corinna@vinschen.de>
CommitDate: Wed Apr 3 18:53:56 2024 +0200

    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>

Diff:
---
 winsup/utils/tzset.c | 67 ++++------------------------------------------------
 1 file changed, 5 insertions(+), 62 deletions(-)

diff --git a/winsup/utils/tzset.c b/winsup/utils/tzset.c
index d369ff7a2cd3..0660da7d1d8e 100644
--- a/winsup/utils/tzset.c
+++ b/winsup/utils/tzset.c
@@ -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;

                 reply	other threads:[~2024-04-03 16:56 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240403165616.2735A38460B2@sourceware.org \
    --to=corinna@sourceware.org \
    --cc=cygwin-cvs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).