<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Hello Paul,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">I have removed the code to use Windows native localtime() etc functions but that caused a crash in zdump.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">In zdump localtime_r() was calling localtime() but it crashed after the return from localtime because there was no prototype for localtime and thus localtime_r did receive an integer instead of struct
 tm*.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">I added the prototype to private.h.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">With regards to have tzloadbody() check for a dos drive specifier I found zdump was not showing the transition times when I omitted the change.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">We need to run zdump -v with a full path to the time zone file because the time zone files are located in our product installation and customers decide where they install our software.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">So we do not know TZDIR at compile time and the code that prepends TZDIR to the path actually corrupts the full path.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Therefore it is crucial for us to have the dos specifier check in tzloadbody().<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">This change won’t affect the behaviour on Unix and using a full path works fine on Unix.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">I’d like to suggest the following patch.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">localtime.c | 4 ++++<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">private.h   | 2 ++<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">2 files changed, 6 insertions(+)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">diff --git a/localtime.c b/localtime.c<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">index 6f5aa76..18b6412 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">--- a/localtime.c<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">+++ b/localtime.c<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">@@ -401,6 +401,10 @@ tzloadbody(char const *name, struct state *sp, bool doextend,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">               if (name[0] == ':')<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">                               ++name;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">               doaccess = name[0] == '/';<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">+             /* check for DOS drive specifier */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">+             if (!doaccess)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">+                             if ( ( (name[0]>64 && name[0]<91) || (name[0]>96 && name[0]<123) ) && name[1]==':' && name[2] == '\\')<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">+                                doaccess = true;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">               if (!doaccess) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">                               size_t namelen = strlen(name);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">                               if (sizeof lsp->fullname - sizeof tzdirslash <= namelen)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">diff --git a/private.h b/private.h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">index ffb8121..58b3eab 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">--- a/private.h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">+++ b/private.h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">@@ -470,6 +470,8 @@ struct tm *localtime_r(time_t const *restrict, struct tm *restrict);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">time_t mktime(struct tm *);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">time_t time(time_t *);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">void tzset(void);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">+#else<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">+struct tm *localtime(const time_t *timep);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">#endif<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"> #if !HAVE_DECL_ASCTIME_R && !defined asctime_r<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Regards<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Manuela Friedrich<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US">From:</span></b><span lang="EN-US"> Paul Eggert [mailto:eggert@cs.ucla.edu]
<br>
<b>Sent:</b> Donnerstag, 1. Februar 2018 18:38<br>
<b>To:</b> Manuela Friedrich <Manuela.Friedrich@actian.com>; Time Zone Mailing List <tz@iana.org><br>
<b>Subject:</b> Re: [tz] [PATCH] Support building zic.exe and zdump.exe natively on Windows with Visual Studio nmake.<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">On 02/01/2018 08:37 AM, Manuela Friedrich wrote:<br>
> I managed to write a minimal tools.ini file for Windows that doesn't require changes of the Makefile so that compiling on POSIX systems will work as before.<br>
<br>
Thanks, that sounds like a good way to go.<br>
<br>
> It contains Windows versions of the version and version.h rules as these use shell commands in the base Makefile which will not work on Windows. Also, tools.ini contains any windows specific flags to the compiler, variables, suffixes and windows specific
 compilation rules.<br>
><br>
> As explained earlier our customers will download the latest release from your ftp server and will need the tools.ini file and the getopt.c file as part of your latest release package.<br>
<br>
Normally, downstream wrappers like this are maintained in downstream <br>
packages, as the tzdb project itself doesn't have the maintenance oomph <br>
to support all the downstream platforms ourselves. So I suggest that you <br>
give your customers the tools.ini and getopt.c files as part of your <br>
package; they can then use those files along with the downloaded data <br>
and code from tzdb.<br>
<br>
> Stat on Windows is documented on msdn:<a href="https://msdn.microsoft.com/en-us/library/14h5k7ff(v=vs.100).aspx">https://msdn.microsoft.com/en-us/library/14h5k7ff(v=vs.100).aspx</a><br>
> Having /. appended to a filename is not mentioned, potentially it's not expected.<br>
> In the debugger I see stat returning 0 for an existing file with /. appended but -1 for a non-existing file with /. appended.<br>
<br>
It's odd that "FOO/." acts like "FOO" when FOO is not a directory. Do <br>
the following names also act like "FOO"? That is, on MS-Windows can one <br>
append any number of ".", "/" and "\" to an ordinary filename without <br>
affecting its interpretation, so long as every "." is preceded by a "/" <br>
or "\"?<br>
<br>
"FOO//"<br>
"FOO/./"<br>
"FOO/./."<br>
"FOO\"<br>
"FOO\."<br>
"FOO\.\"<o:p></o:p></p>
</div>
</body>
</html>