<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">Right, I see that time.h includes time.inl which contains<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">_CRT_INSECURE_DEPRECATE(localtime_s) static __inline struct tm * __CRTDECL localtime(const time_t * _Time)<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">#pragma warning( push )<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">#pragma warning( disable : 4996 )<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">    return _localtime64(_Time);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">#pragma warning( pop )<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>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">However this did not compile with Visual Studio because if I include time.h header than usage of native localtime is expected and MS localtime function definition is pulled into the code, however,
 if you want us to use your version of localtime then prototype has to be defined in your header.  Compilation error for time.h header inclusion is as follows:<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(1540) : error C2084: function 'tm *localtime(const time_t *)' already has a body<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">        C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\time.inl(112) : see previous definition of 'localtime'<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\x86_amd64\cl.EXE"' : return code '0x2'<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Stop.<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">To avoid this error I excluded time.inl by using -D_INC_TIME_INL CFLAG, but then the problem with the missing prototype prevented zdump from working properly.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Can you add this to private.h? Maybe with a new macro if you prefer that?
<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">For zdump -v we cannot use UNC paths and when we tried with -DTZDIR='\0' tzloadbody still created a path starting with leading slash, like /c:\mydir.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">So we added code that checks if TZDIR is not empty and only then applies the the leading slash.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Is that an acceptable alternative?<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 | 10 +++++++---<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">1 file changed, 7 insertions(+), 3 deletions(-)<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..be63de4 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">@@ -357,7 +357,7 @@ union input_buffer {<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>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">/* TZDIR with a trailing '/' rather than a trailing '\0'.  */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">-static char const tzdirslash[sizeof TZDIR] = TZDIR "/";<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">+static char tzdirslash[sizeof TZDIR] = {TZDIR} ;<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">/* Local storage needed for 'tzloadbody'.  */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">union local_storage {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">@@ -389,6 +389,8 @@ 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">                register bool doaccess;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">                register union input_buffer *up = &lsp->u.u;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">                register int tzheadsize = sizeof (struct tzhead);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">+             if (*tzdirslash)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">+                             strcat(tzdirslash, "/");<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">               sp->goback = sp->goahead = false;<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">@@ -410,8 +412,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">                                   would pull in stdio (and would fail if the<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">                                   resulting string length exceeded INT_MAX!).  */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">                                memcpy(lsp->fullname, tzdirslash, sizeof tzdirslash);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">-                              strcpy(lsp->fullname + sizeof tzdirslash, name);<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 (*tzdirslash)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">+                                 strcpy(lsp->fullname + sizeof tzdirslash, name);<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">+                                 strcpy(lsp->fullname, name);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">                                /* Set doaccess if '.' (as in "../") shows up in name.  */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">                                if (strchr(name, '.'))<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"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">The issue is that zdump is included for customers to verify their timezone files and it should be able to handle any type of path including a full path to the file.  As a result, we need to get this
 code to run with a full path or at least recognize it and not corrupt it.  <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">We realize you are reluctant to take any windows specific changes due to lack of resources to support this going forward, however, we intend to implement continuous integration to ensure that the
 latest code is always tested on Windows and any issues that are encountered are fixed as soon as possible and submitted back to iana.org.  As a result, we really hope you will work with us to ensure this helpful package can be expanded to encapsulate support
 on Windows going forward and open up its usage to a wider audience.  We intend to support iana.org community by ensuring the highest quality of the package enclosed with our products. 
<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">Thanks!<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, 8. Februar 2018 06:54<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">Manuela Friedrich wrote:<br>
> In zdump localtime_r() was calling localtime() but it crashed after the return from localtime because there was no prototype for localtime<br>
<br>
Why not? zdump.c includes private.h, which includes time.h, and that should <br>
should declare a prototype for localtime, according to this page:<br>
<br>
<a href="https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/localtime-localtime32-localtime64">https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/localtime-localtime32-localtime64</a><br>
<br>
> Therefore it is crucial for us to have the dos specifier check in tzloadbody().<br>
> This change won’t affect the behaviour on Unix and using a full path works fine on Unix.<br>
<br>
It does affect the behavior on Unix, as file names like "a:b" are valid relative <br>
file names whereas the proposed code would treat them as absolute.<br>
<br>
Can you use UNC names instead? Perhaps something starting with // will do the <br>
trick. Or if that doesn't work, perhaps you can set TZDIR=/ when running 'make', <br>
and then cd to the appropriate drive root before running zdump and/or zic and <br>
then use a path relative to that drive root. At any rate, I'm not sure it's a <br>
good idea for portable code to worry about these ins and outs of MS-Windows file <br>
name conventions.<o:p></o:p></p>
</div>
</body>
</html>