This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Win32: implement our own stat(), and hence our own utime
authorTony Cook <tony@develop-help.com>
Wed, 14 Oct 2020 02:27:50 +0000 (13:27 +1100)
committerTony Cook <tony@develop-help.com>
Tue, 1 Dec 2020 04:29:33 +0000 (15:29 +1100)
commite935ef333b3eab54a766de93fad1369f76ddea49
treeea085a4dd5daf2e5f236818ba2a9ca8309eabb60
parent680b2c5ee3b53c627074192b3cf14416a24da6ea
Win32: implement our own stat(), and hence our own utime

This fixes at least two problems:

- unlike UCRT, the MSVCRT used for gcc builds has a bug converting
  a FILETIME in an unlike current DST state, returning a time
  offset by an hour.  Fixes GH #6080

- the MSVCRT apparently uses FindFirstFile() to fetch file
  information, but this doesn't follow symlinks(), so stat()
  ends up returning information about the symlink(), not the
  underlying file.  This isn't an issue with the UCRT which
  opens the file as this implementation does.

Currently this code calculates the time_t for st_*time, and the
other way for utime() using a simple multiplication and offset
between time_t and FILETIME values, but this may be incorrect
if leap seconds are enabled.

This code also requires Vista or later.

Some of this is based on code by Tomasz Konojacki (xenu).
pod/perlport.pod
t/win32/stat.t
win32/win32.c