This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Win32: add lstat(), fetch st_dev and st_ino and fetch st_nlink for fstat
authorTony Cook <tony@develop-help.com>
Tue, 6 Oct 2020 06:07:00 +0000 (17:07 +1100)
committerTony Cook <tony@develop-help.com>
Tue, 1 Dec 2020 04:29:33 +0000 (15:29 +1100)
We need lstat() for various modules to work well with symlinks,
and the same modules often want to check for matches on the device
and inode number.

The values we're using for st_ino match those that the Python and Rust
libraries use, and Go uses the same volume and file index values for
testing if two stat objects refer to the same file.

They aren't entirely unique, given ReFS uses 128-bit file ids, but
the API used to check for this (GetFileInformationByHandleEx() for
FileIdInfo) is only available on server operating systems, so I can't
directly test it anyway.

12 files changed:
MANIFEST
dosish.h
t/op/stat.t
t/win32/stat.t [new file with mode: 0644]
win32/config.gc
win32/config.vc
win32/config_H.gc
win32/config_H.vc
win32/perlhost.h
win32/win32.c
win32/win32.h
win32/win32iop.h

index f0efee7..684be88 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -6164,6 +6164,7 @@ t/win32/fs.t                      Test Win32 link for compatibility
 t/win32/popen.t                        Test for stdout races in backticks, etc
 t/win32/runenv.t               Test if Win* perl honors its env variables
 t/win32/signal.t               Test Win32 signal emulation
+t/win32/stat.t                 Test Win32 stat emulation
 t/win32/system.t               See if system works in Win*
 t/win32/system_tests           Test runner for system.t
 taint.c                                Tainting code
index 1860a0f..3580693 100644 (file)
--- a/dosish.h
+++ b/dosish.h
  *     to include <sys/stat.h> and <sys/types.h> to get any typedef'ed
  *     information.
  */
-#define Stat_t struct _stati64
+#if defined(WIN32)
+#  define Stat_t struct w32_stat
+#else
+#  define Stat_t struct _stati64
+#endif
 
 /* USE_STAT_RDEV:
  *     This symbol is defined if this system has a stat structure declaring
index 663ad9d..1cf6072 100644 (file)
@@ -502,14 +502,19 @@ like $@, qr/^The stat preceding lstat\(\) wasn't an lstat at /,
 }
   
 SKIP: {
-    skip "No lstat", 2 unless $Config{d_lstat};
+    skip "No lstat", 2 unless $Config{d_lstat} && $Config{d_symlink};
 
     # bug id 20020124.004 (#8334)
-    # If we have d_lstat, we should have symlink()
     my $linkname = 'stat-' . rand =~ y/.//dr;
     my $target = $Perl;
     $target =~ s/;\d+\z// if $Is_VMS; # symlinks don't like version numbers
-    symlink $target, $linkname or die "# Can't symlink $0: $!";
+    unless (symlink $target, $linkname) {
+        if ($^O eq "MSWin32") {
+            # likely we don't have permission
+            skip "symlink failed: $!", 2;
+        }
+        die "# Can't symlink $0: $!";
+    }
     lstat $linkname;
     -T _;
     eval { lstat _ };
diff --git a/t/win32/stat.t b/t/win32/stat.t
new file mode 100644 (file)
index 0000000..ad5c5b7
--- /dev/null
@@ -0,0 +1,111 @@
+#!./perl
+
+BEGIN {
+    chdir 't' if -d 't';
+    @INC = '../lib';
+    require "./test.pl";
+}
+
+use strict;
+
+Win32::FsType() eq 'NTFS'
+    or skip_all("need NTFS");
+
+my $tmpfile1 = tempfile();
+
+# test some of the win32 specific stat code, since we
+# don't depend on the CRT for some of it
+
+ok(link($0, $tmpfile1), "make a link to test nlink");
+
+my @st = stat $0;
+open my $fh, "<", $0 or die;
+my @fst = stat $fh;
+close $fh;
+
+# the ucrt stat() is inconsistent here, using an A=0 drive letter for stat()
+# and the fd for fstat(), I assume that's something backward compatible.
+#
+# I don't see anything we could reasonable populate it with either.
+$st[6] = $fst[6] = 0;
+
+is("@st", "@fst", "check named stat vs handle stat");
+
+ok($st[0], "we set dev by default now");
+ok($st[1], "and ino");
+
+# unlikely, but someone else might have linked to win32/stat.t
+cmp_ok($st[3], '>', 1, "should be more than one link");
+
+my $nlink = $st[3];
+
+# check we get nlinks etc for a directory
+@st = stat("win32");
+ok($st[0], "got dev for a directory");
+ok($st[1], "got ino for a directory");
+ok($st[3], "got nlink for a directory");
+
+${^WIN32_SLOPPY_STAT} = 1;
+
+@st = stat $0;
+open my $fh, "<", $0 or die;
+@fst = stat $fh;
+close $fh;
+
+$st[6] = $fst[6] = 0;
+
+is("@st", "@fst", "sloppy check named stat vs handle stat");
+is($st[0], 0, "sloppy no dev");
+is($st[1], 0, "sloppy no ino");
+# don't check nlink, Microsoft might fix it one day
+
+${^WIN32_SLOPPY_STAT} = 0;
+
+# symbolic links
+unlink($tmpfile1); # no more hard link
+
+# mklink is available from Vista onwards
+# this may only work in an admin shell
+# MKLINK [[/D] | [/H] | [/J]] Link Target
+if (system("mklink $tmpfile1 win32\\stat.t") == 0) {
+    ok(-l $tmpfile1, "lstat sees a symlink");
+
+    # check stat on file vs symlink
+    @st = stat $0;
+    my @lst = stat $tmpfile1;
+
+    $st[6] = $lst[6] = 0;
+
+    is("@st", "@lst", "check stat on file vs link");
+
+    # our hard link no longer exists, check that is reflected in nlink
+    is($st[3], $nlink-1, "check nlink updated");
+
+    unlink($tmpfile1);
+}
+
+# similarly for a directory
+if (system("mklink /d $tmpfile1 win32") == 0) {
+    ok(-l $tmpfile1, "lstat sees a symlink on the directory symlink");
+
+    # check stat on directory vs symlink
+    @st = stat "win32";
+    my @lst = stat $tmpfile1;
+
+    $st[6] = $lst[6] = 0;
+
+    is("@st", "@lst", "check stat on dir vs link");
+
+    # for now at least, we need to rmdir symlinks to directories
+    rmdir( $tmpfile1 );
+}
+
+# check a junction doesn't look like a symlink
+
+if (system("mklink /j $tmpfile1 win32") == 0) {
+    ok(!-l $tmpfile1, "lstat doesn't see a symlink on the directory junction");
+
+    rmdir( $tmpfile1 );
+}
+
+done_testing();
index c632ba9..c7e6196 100644 (file)
@@ -358,7 +358,7 @@ d_lrintl='define'
 d_lround='define'
 d_lroundl='define'
 d_lseekproto='define'
-d_lstat='undef'
+d_lstat='define'
 d_madvise='undef'
 d_malloc_good_size='undef'
 d_malloc_size='undef'
index 3f68e75..294cdac 100644 (file)
@@ -358,7 +358,7 @@ d_lrintl='undef'
 d_lround='undef'
 d_lroundl='undef'
 d_lseekproto='define'
-d_lstat='undef'
+d_lstat='define'
 d_madvise='undef'
 d_malloc_good_size='undef'
 d_malloc_size='undef'
index 233eea3..a068b08 100644 (file)
@@ -9,8 +9,8 @@
 
 /* Package name      : perl5
  * Source directory  : 
- * Configuration time: Tue Oct 17 08:44:03 2017
- * Configured by     : shay
+ * Configuration time: Wed Oct  7 16:27:47 2020
+ * Configured by     : tony
  * Target system     : 
  */
 
@@ -32,7 +32,7 @@
  *     This symbol, if defined, indicates that the cbrt() (cube root)
  *     function is available.
  */
-#define HAS_CBRT               /**/
+#define HAS_CBRT       /**/
 
 /* HAS_CHOWN:
  *     This symbol, if defined, indicates that the chown routine is
  *     This symbol, if defined, indicates that the lstat routine is
  *     available to do file stats on symbolic links.
  */
-/*#define HAS_LSTAT            / **/
+#define HAS_LSTAT              /**/
 
 /* HAS_MBLEN:
  *     This symbol, if defined, indicates that the mblen routine is available
  */
 #define HAS_MKTIME             /**/
 
+/* HAS_MSG:
+ *     This symbol, if defined, indicates that the entire msg*(2) library is
+ *     supported (IPC mechanism based on message queues).
+ */
+/*#define HAS_MSG              / **/
+
 /* HAS_MSYNC:
  *     This symbol, if defined, indicates that the msync system call is
  *     available to synchronize a mapped file.
  */
 #define HAS_SELECT     /**/
 
+/* HAS_SEM:
+ *     This symbol, if defined, indicates that the entire sem*(2) library is
+ *     supported.
+ */
+/*#define HAS_SEM              / **/
+
 /* HAS_SETEGID:
  *     This symbol, if defined, indicates that the setegid routine is available
  *     to change the effective gid of the current program.
  */
 /*#define HAS_SETLINEBUF               / **/
 
-/* HAS_SETLOCALE:
- *     This symbol, if defined, indicates that the setlocale routine is
- *     available to handle locale-specific ctype implementations.
- */
-#define HAS_SETLOCALE  /**/
-
 /* HAS_SETPGID:
  *     This symbol, if defined, indicates that the setpgid(pid, gpid)
  *     routine is available to set process group ID.
 /*#define HAS_EACCESS          / **/
 
 /* I_SYS_ACCESS:
- *     This symbol, if defined, indicates to the C program that it should
- *     include <sys/access.h>.
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/access.h>.
  */
 /*#define   I_SYS_ACCESS                / **/
 
 /* I_SYS_SECURITY:
- *     This symbol, if defined, indicates to the C program that it should
- *     include <sys/security.h>.
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/security.h>.
  */
 /*#define   I_SYS_SECURITY     / **/
 
  *     This symbol contains the number of bytes required to align a
  *     double, or a long double when applicable. Usual values are 2,
  *     4 and 8. The default is eight, for safety.  For cross-compiling
- *     or multiarch support, Configure will set a minimum of 8.
+ *     or multiarch support, Configure will set a minimum of 8.
  */
 #define MEM_ALIGNBYTES 8
 
 #    endif
 #  endif
 #else
-#define BYTEORDER 0x1234       /* large digits for MSB */
+#define BYTEORDER 0x12345678   /* large digits for MSB */
 #endif
 
 /* CHARBITS:
  *     the GNU C library is being used.  A better check is to use
  *     the __GLIBC__ and __GLIBC_MINOR__ symbols supplied with glibc.
  */
-/*#define HAS_GNULIBC          / **/
+/*#define HAS_GNULIBC  / **/
 #if defined(HAS_GNULIBC) && !defined(_GNU_SOURCE)
 #   define _GNU_SOURCE
 #endif
  *     This symbol is defined if using the FILE_ptr macro as an lvalue
  *     to increase the pointer by n leaves File_cnt(fp) unchanged.
  */
-#define USE_STDIO_PTR  /**/
+#define USE_STDIO_PTR  /**/
 #ifdef USE_STDIO_PTR
 #define FILE_ptr(fp)   ((fp)->_ptr)
-#define STDIO_PTR_LVALUE               /**/
+#define STDIO_PTR_LVALUE               /**/
 #define FILE_cnt(fp)   ((fp)->_cnt)
-#define STDIO_CNT_LVALUE               /**/
+#define STDIO_CNT_LVALUE               /**/
 /*#define STDIO_PTR_LVAL_SETS_CNT      / **/
 #define STDIO_PTR_LVAL_NOCHANGE_CNT    /**/
 #endif
  *     structure pointed to its argument. This macro will always be defined
  *     if USE_STDIO_BASE is defined.
  */
-#define USE_STDIO_BASE         /**/
+#define USE_STDIO_BASE /**/
 #ifdef USE_STDIO_BASE
 #define FILE_base(fp)  ((fp)->_base)
 #define FILE_bufsiz(fp)        ((fp)->_cnt + (fp)->_ptr - (fp)->_base)
 #define DOUBLESIZE 8           /**/
 
 /* I_TIME:
- *     This symbol, if defined, indicates to the C program that it should
- *     include <time.h>.
+ *     This symbol is always defined, and indicates to the C program that
+ *     it should include <time.h>.
  */
 /* I_SYS_TIME:
  *     This symbol, if defined, indicates to the C program that it should
  *     the compiler supports (void *); otherwise it will be
  *     sizeof(char *).
  */
-#define PTRSIZE 4              /**/
+#define PTRSIZE 8              /**/
 
 /* Drand01:
  *     This macro is to be used to generate uniformly distributed
  *     to get any typedef'ed information.
  *     We will pick a type such that sizeof(SSize_t) == sizeof(Size_t).
  */
-#define SSize_t int     /* signed count of bytes */
+#define SSize_t long long      /* signed count of bytes */
 
 /* EBCDIC:
  *     This symbol, if defined, indicates that this system uses
  *     EBCDIC encoding.
  */
-/*#define      EBCDIC          / **/
+/*#define      EBCDIC          / **/
 
 /* ARCHLIB:
  *     This variable, if defined, holds the name of the directory in
  */
 #define BIN "c:\\perl\\bin"    /**/
 #define BIN_EXP "c:\\perl\\bin"        /**/
-#define PERL_RELOCATABLE_INC "undef"           /**/
+#define PERL_RELOCATABLE_INC "undef"           /**/
 
 /* PERL_INC_VERSION_LIST:
  *     This variable specifies the list of subdirectories in over
 
 /* INSTALL_USR_BIN_PERL:
  *     This symbol, if defined, indicates that Perl is to be installed
- *     also as /usr/bin/perl.
+ *     also as /usr/bin/perl.
  */
 /*#define INSTALL_USR_BIN_PERL / **/
 
  *     feature tests from Configure are generally more reliable.
  */
 #define OSNAME "MSWin32"               /**/
-#define OSVERS "6.1"           /**/
+#define OSVERS "10.0.18363.1082"               /**/
 
 /* CAT2:
  *     This macro concatenates 2 tokens together.
  */
 #if 42 == 1
 #define CAT2(a,b)      a/**/b
-#undef STRINGIFY
 #define STRINGIFY(a)   "a"
 #endif
 #if 42 == 42
 #define PeRl_StGiFy(a) #a
 #define CAT2(a,b)      PeRl_CaTiFy(a,b)
 #define StGiFy(a)      PeRl_StGiFy(a)
-#undef STRINGIFY
 #define STRINGIFY(a)   PeRl_StGiFy(a)
 #endif
 #if 42 != 1 && 42 != 42
 /* CPPSTDIN:
  *     This symbol contains the first part of the string which will invoke
  *     the C preprocessor on the standard input and produce to standard
- *     output.  Typical value of "cc -E" or "/lib/cpp", but it can also
+ *     output.  Typical value of "cc -E" or "/lib/cpp", but it can also
  *     call a wrapper. See CPPRUN.
  */
 /* CPPMINUS:
  */
 #define HAS_ACCESS             /**/
 
-
-/* The HASATTRIBUTE_* defines are left undefined here because they vary from
- * one version of GCC to another.  Instead, they are defined on the basis of
- * the compiler version in <perl.h>.
- */
 /* HASATTRIBUTE_FORMAT:
  *     Can we handle GCC attribute for checking printf-style formats
  */
 /* HASATTRIBUTE_WARN_UNUSED_RESULT:
  *     Can we handle GCC attribute for warning on unused results
  */
+/* HASATTRIBUTE_ALWAYS_INLINE:
+ *     Can we handle GCC attribute for functions that should always be
+ *     inlined.
+ */
 /*#define HASATTRIBUTE_DEPRECATED      / **/
 /*#define HASATTRIBUTE_FORMAT  / **/
 /*#define PRINTF_FORMAT_NULL_OK        / **/
 /*#define HASATTRIBUTE_PURE    / **/
 /*#define HASATTRIBUTE_UNUSED  / **/
 /*#define HASATTRIBUTE_WARN_UNUSED_RESULT      / **/
+/*#define HASATTRIBUTE_ALWAYS_INLINE   / **/
 
 /* HAS_BACKTRACE:
  *     This symbol, if defined, indicates that the backtrace() routine is
  *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE
  *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_BE
  *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_LE
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIAN
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIAN
  *     LONG_DOUBLE_IS_VAX_H_FLOAT
  *     LONG_DOUBLE_IS_UNKNOWN_FORMAT
  *     It is only defined if the system supports long doubles.
  *     This symbol, if defined, indicates that the long double is
  *     the 128-bit VAX format H.
  */
-#define HAS_LDEXPL             /**/
+#define  HAS_LDEXPL            /**/
 #define HAS_LONG_DOUBLE                /**/
 #ifdef HAS_LONG_DOUBLE
-#define LONG_DOUBLESIZE 12             /**/
+#define LONG_DOUBLESIZE 16             /**/
 #define LONG_DOUBLEKIND 3              /**/
 #define LONG_DOUBLE_IS_DOUBLE                          0
 #define LONG_DOUBLE_IS_IEEE_754_128_BIT_LITTLE_ENDIAN  1
  *     available to exclusively create and open a uniquely named
  *     temporary file.
  */
-#if __MINGW64_VERSION_MAJOR >= 4
-#define HAS_MKSTEMP
-#endif
+/*#define HAS_MKSTEMP          / **/
 
 /* HAS_MMAP:
  *     This symbol, if defined, indicates that the mmap system call is
 /*#define HAS_MMAP             / **/
 #define Mmap_t void *  /**/
 
-/* HAS_MSG:
- *     This symbol, if defined, indicates that the entire msg*(2) library is
- *     supported (IPC mechanism based on message queues).
- */
-/*#define HAS_MSG              / **/
-
-/* HAS_SEM:
- *     This symbol, if defined, indicates that the entire sem*(2) library is
- *     supported.
- */
-/*#define HAS_SEM              / **/
-
 /* HAS_SETGRENT:
  *     This symbol, if defined, indicates that the setgrent routine is
  *     available for initializing sequential access of the group database.
  *     This symbol, if defined, indicates the availability of
  *     struct sockaddr_in6;
  */
+/* HAS_SOCKADDR_STORAGE:
+ *     This symbol, if defined, indicates the availability of
+ *     struct sockaddr_storage;
+ */
 /* HAS_SIN6_SCOPE_ID:
  *     This symbol, if defined, indicates that the struct sockaddr_in6
  *     structure has a member called sin6_scope_id.
 /*#define      HAS_SOCKETPAIR  / **/
 /*#define      HAS_SOCKADDR_SA_LEN     / **/
 /*#define      HAS_SOCKADDR_IN6        / **/
+#define        HAS_SOCKADDR_STORAGE    /**/
 #define        HAS_SIN6_SCOPE_ID       /**/
 /*#define      HAS_IP_MREQ     / **/
 /*#define      HAS_IP_MREQ_SOURCE      / **/
  *     st_blksize and st_blocks.
  */
 #ifndef USE_STAT_BLOCKS
-/*#define USE_STAT_BLOCKS      / **/
+/*#define USE_STAT_BLOCKS      / **/
 #endif
 
 /* HAS_SYS_ERRLIST:
  *     This symbol, if defined, indicates that the union semun is
  *     defined by including <sys/sem.h>.  If not, the user code
  *     probably needs to define it as:
- *     union semun {
+ *      union semun {
  *         int val;
  *         struct semid_ds *buf;
  *         unsigned short *array;
- *     }
+ *      }
  */
 /* USE_SEMCTL_SEMUN:
  *     This symbol, if defined, indicates that union semun is
 
 /* Free_t:
  *     This variable contains the return type of free().  It is usually
- * void, but occasionally int.
+ *     void, but occasionally int.
  */
 /* Malloc_t:
  *     This symbol is the type of pointer returned by malloc and realloc.
  *     This symbol, if defined, indicates that the atoll routine is
  *     available to convert strings into long longs.
  */
-/*#define HAS_ATOLL            / **/
+#define HAS_ATOLL              /**/
 
 /* HAS__FWALK:
  *     This symbol, if defined, indicates that the _fwalk system call is
  */
 /*#define HAS__FWALK           / **/
 
+/* HAS_ACCEPT4:
+ *     This symbol, if defined, indicates that the accept4 routine is
+ *     available to accept socket connections.
+ */
+/*#define HAS_ACCEPT4  / **/
+
 /* HAS_ACOSH:
  *     This symbol, if defined, indicates that the acosh routine is
  *     available to do the inverse hyperbolic cosine function.
 /*#define HAS_BUILTIN_EXPECT   / **/
 /*#define HAS_BUILTIN_CHOOSE_EXPR      / **/
 
+/* HAS_BUILTIN_ADD_OVERFLOW:
+ *     This symbol, if defined, indicates that the compiler supports
+ *     __builtin_add_overflow for adding integers with overflow checks.
+ */
+/* HAS_BUILTIN_SUB_OVERFLOW:
+ *     This symbol, if defined, indicates that the compiler supports
+ *     __builtin_sub_overflow for subtracting integers with overflow checks.
+ */
+/* HAS_BUILTIN_MUL_OVERFLOW:
+ *     This symbol, if defined, indicates that the compiler supports
+ *     __builtin_mul_overflow for multiplying integers with overflow checks.
+ */
+/*#define HAS_BUILTIN_ADD_OVERFLOW     / **/
+/*#define HAS_BUILTIN_SUB_OVERFLOW     / **/
+/*#define HAS_BUILTIN_MUL_OVERFLOW     / **/
+
 /* HAS_C99_VARIADIC_MACROS:
  *     If defined, the compiler supports C99 variadic macros.
  */
  *     makes sense if you *have* dlsym, which we will presume is the
  *     case if you're using dl_dlopen.xs.
  */
-/*#define      DLSYM_NEEDS_UNDERSCORE  / **/
+/*#define      DLSYM_NEEDS_UNDERSCORE  / **/
+
+/* HAS_DUP3:
+ *     This symbol, if defined, indicates that the dup3 routine is
+ *     available to duplicate file descriptors.
+ */
+/*#define HAS_DUP3     / **/
 
 /* HAS_ERF:
  *     This symbol, if defined, indicates that the erf routine is
  *     available to classify doubles.  Available for example in HP-UX.
  *     The returned values are defined in <math.h> and are
  *
- *           FP_NORMAL     Normalized
- *           FP_ZERO       Zero
- *           FP_INFINITE   Infinity
- *           FP_SUBNORMAL  Denormalized
- *           FP_NAN        NaN
+ *       FP_NORMAL     Normalized
+ *       FP_ZERO       Zero
+ *       FP_INFINITE   Infinity
+ *       FP_SUBNORMAL  Denormalized
+ *       FP_NAN        NaN
  *
  */
 /* HAS_FP_CLASSIFY:
  *     This symbol, if defined, indicates that the fp_classify routine is
  *     available to classify doubles. The values are defined in <math.h>
  *
- *           FP_NORMAL     Normalized
- *           FP_ZERO       Zero
- *           FP_INFINITE   Infinity
- *           FP_SUBNORMAL  Denormalized
- *           FP_NAN        NaN
+ *       FP_NORMAL     Normalized
+ *       FP_ZERO       Zero
+ *       FP_INFINITE   Infinity
+ *       FP_SUBNORMAL  Denormalized
+ *       FP_NAN        NaN
  *
  */
 /*#define      HAS_FPCLASSIFY          / **/
 /* HAS_FPOS64_T:
  *     This symbol will be defined if the C compiler supports fpos64_t.
  */
-/*#define      HAS_FPOS64_T            / **/
+/*#define      HAS_FPOS64_T    / **/
 
 /* HAS_FREXPL:
  *     This symbol, if defined, indicates that the frexpl routine is
 /*#define HAS_INETPTON         / **/
 
 /* HAS_INT64_T:
- *     This symbol will defined if the C compiler supports int64_t.
- *     Usually the <inttypes.h> needs to be included, but sometimes
+ *     This symbol will defined if the C compiler supports int64_t.
+ *     Usually the <inttypes.h> needs to be included, but sometimes
  *     <sys/types.h> is enough.
  */
 /*#define     HAS_INT64_T               / **/
  *     j0l() function is available for Bessel functions of the first
  *     kind of the order zero, for long doubles.
  */
-#define HAS_J0         /**/
+#define        HAS_J0          /**/
 /*#define      HAS_J0L         / **/
 
 /* HAS_LC_MONETARY_2008:
  *     of significant digits in a long double precision number. Unlike
  *     for DBL_DIG, there's no good guess for LDBL_DIG if it is undefined.
  */
-#define HAS_LDBL_DIG   /**/
+#define HAS_LDBL_DIG   /**/
 
 /* HAS_LGAMMA:
  *     This symbol, if defined, indicates that the lgamma routine is
  *     This symbol, if defined, indicates that the memmem routine is
  *     available to return a pointer to the start of the first occurrence
  *     of a substring in a memory area (or NULL if not found).
+ *     In glibc, memmem is a GNU extension.  The function is visible in
+ *     libc, but the prototype is only visible if _GNU_SOURCE is #defined.
+ *     Thus we only define this if both the prototype and symbol are found.
  */
 /*#define HAS_MEMMEM           / **/
 
  */
 /*#define HAS_MKDTEMP          / **/
 
+/* HAS_MKOSTEMP:
+ *     This symbol, if defined, indicates that the mkostemp routine is
+ *     available to exclusively create and open a uniquely named (with a
+ *     suffix) temporary file.
+ */
+/*#define HAS_MKOSTEMP / **/
+
 /* HAS_MKSTEMPS:
  *     This symbol, if defined, indicates that the mkstemps routine is
  *     available to exclusively create and open a uniquely named
  *     to the program to supply one.
  */
 #define HAS_MODFL              /**/
-/*#define HAS_MODFL_PROTO              / **/
+#define HAS_MODFL_PROTO                /**/
 
 /* HAS_MPROTECT:
  *     This symbol, if defined, indicates that the mprotect system call is
  */
 #define HAS_NAN                /**/
 
+/* HAS_NANOSLEEP:
+ *     This symbol, if defined, indicates that the nanosleep
+ *     system call is available to sleep with 1E-9 sec accuracy.
+ */
+/*#define HAS_NANOSLEEP                / **/
+
 /* HAS_NEARBYINT:
  *     This symbol, if defined, indicates that the nearbyint routine is
  *     available to return the integral value closest to (according to
  *     This symbol, if defined, indicates that the uselocale routine is
  *     available to set the current locale for the calling thread.
  */
+/* HAS_DUPLOCALE:
+ *     This symbol, if defined, indicates that the duplocale routine is
+ *     available to duplicate a locale object.
+ */
 /* HAS_QUERYLOCALE:
  *     This symbol, if defined, indicates that the querylocale routine is
  *     available to return the name of the locale for a category mask.
 /*#define      HAS_NEWLOCALE   / **/
 /*#define      HAS_FREELOCALE  / **/
 /*#define      HAS_USELOCALE   / **/
+/*#define      HAS_DUPLOCALE   / **/
 /*#define      HAS_QUERYLOCALE / **/
 /*#define      I_XLOCALE               / **/
 
 /* HAS_OFF64_T:
  *     This symbol will be defined if the C compiler supports off64_t.
  */
-/*#define      HAS_OFF64_T             / **/
+/*#define      HAS_OFF64_T             / **/
+
+/* HAS_PIPE2:
+ *     This symbol, if defined, indicates that the pipe2 routine is
+ *     available to create an inter-process channel.
+ */
+/*#define HAS_PIPE2            / **/
 
 /* HAS_PRCTL:
  *     This symbol, if defined, indicates that the prctl routine is
 /* HAS_PTRDIFF_T:
  *     This symbol will be defined if the C compiler supports ptrdiff_t.
  */
-#define        HAS_PTRDIFF_T                   /**/
+#define        HAS_PTRDIFF_T           /**/
 
 /* HAS_READV:
  *     This symbol, if defined, indicates that the readv routine is
  */
 /*#define HAS_SETITIMER                / **/
 
+/* HAS_SETLOCALE:
+ *     This symbol, if defined, indicates that the setlocale routine is
+ *     available to handle locale-specific ctype implementations.
+ */
+/* SETLOCALE_ACCEPTS_ANY_LOCALE_NAME:
+ *     This symbol, if defined, indicates that the setlocale routine is
+ *     available and it accepts any input locale name as valid.
+ */
+#define HAS_SETLOCALE  /**/
+/*#define SETLOCALE_ACCEPTS_ANY_LOCALE_NAME    / **/
+
 /* HAS_SETPROCTITLE:
  *     This symbol, if defined, indicates that the setproctitle routine is
  *     available to set process title.
  */
 /*#define HAS_STRLCPY          / **/
 
+/* HAS_STRNLEN:
+ *     This symbol, if defined, indicates that the strnlen () routine is
+ *     available to check the length of a string up to a maximum.
+ */
+/*#define HAS_STRNLEN          / **/
+
 /* HAS_STRTOLD:
  *     This symbol, if defined, indicates that the strtold routine is
  *     available to convert strings to long doubles.
  *     This symbol, if defined, indicates that the strtoll routine is
  *     available to convert strings to long longs.
  */
-/*#define HAS_STRTOLL          / **/
+#define HAS_STRTOLL            /**/
 
 /* HAS_STRTOQ:
  *     This symbol, if defined, indicates that the strtoq routine is
  *     This symbol, if defined, indicates that the strtoull routine is
  *     available to convert strings to unsigned long longs.
  */
-/*#define HAS_STRTOULL         / **/
+#define HAS_STRTOULL           /**/
 
 /* HAS_STRTOUQ:
  *     This symbol, if defined, indicates that the strtouq routine is
  */
 /*#define HAS_TIMEGM           / **/
 
+/* HAS_TOWLOWER:
+ *     This symbol, if defined, indicates that the towlower () routine is
+ *     available to do case conversion.
+ */
+/*#define HAS_TOWLOWER         / **/
+
+/* HAS_TOWUPPER:
+ *     This symbol, if defined, indicates that the towupper () routine is
+ *     available to do case conversion.
+ */
+/*#define HAS_TOWUPPER         / **/
+
 /* HAS_TRUNC:
  *     This symbol, if defined, indicates that the trunc routine is
  *     available to round doubles towards zero.
  */
 #define DEFAULT_INC_EXCLUDES_DOT       /**/
 
+/* USE_STRICT_BY_DEFAULT
+ *     This symbol, if defined, enables additional defaults.
+ *     At this time it only enables implicit strict by default.
+ */
+/*#define USE_STRICT_BY_DEFAULT        / * use strict by default */
+
 /* USE_DYNAMIC_LOADING:
  *     This symbol, if defined, indicates that dynamic loading of
  *     some sort is available.
  *     Note that if fflushNULL is defined, fflushall will not
  *     even be probed for and will be left undefined.
  */
-#define        FFLUSH_NULL             /**/
-/*#define      FFLUSH_ALL              / **/
+#define        FFLUSH_NULL             /**/
+/*#define      FFLUSH_ALL              / **/
 
 /* I_BFD:
  *     This symbol, if defined, indicates that <bfd.h> exists and
  *     For DB version 1 this is always 0.
  */
 #define DB_Hash_t      int             /**/
-#define DB_Prefix_t    int     /**/
-#define DB_VERSION_MAJOR_CFG   0       /**/
-#define DB_VERSION_MINOR_CFG   0       /**/
-#define DB_VERSION_PATCH_CFG   0       /**/
+#define DB_Prefix_t    int             /**/
+#define DB_VERSION_MAJOR_CFG   0       /**/
+#define DB_VERSION_MINOR_CFG   0       /**/
+#define DB_VERSION_PATCH_CFG   0       /**/
 
 /* I_FENV:
  *     This symbol, if defined, indicates to the C program that it should
 /*#define      I_IEEEFP                / **/
 
 /* I_INTTYPES:
- *     This symbol, if defined, indicates to the C program that it should
- *     include <inttypes.h>.
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <inttypes.h>.
  */
 /*#define   I_INTTYPES                / **/
 
 /*#define      I_MNTENT                / **/
 
 /* I_NETINET_TCP:
- *     This symbol, if defined, indicates to the C program that it should
- *     include <netinet/tcp.h>.
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <netinet/tcp.h>.
  */
 /*#define   I_NETINET_TCP                / **/
 
  */
 /*#define      I_USTAT         / **/
 
+/* I_WCHAR:
+ *     This symbol, if defined, indicates to the C program that <wchar.h>
+ *     is available for inclusion
+ */
+/*#define   I_WCHAR    / **/
+
+/* I_WCTYPE:
+ *     This symbol, if defined, indicates that <wctype.h> exists.
+ */
+/*#define      I_WCTYPE                / **/
+
 /* DOUBLEINFBYTES:
  *     This symbol, if defined, is a comma-separated list of
  *     hexadecimal bytes for the double precision infinity.
  */
 #define DOUBLEINFBYTES  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f         /**/
 #define DOUBLENANBYTES  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x7f         /**/
-#define LONGDBLINFBYTES 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x00         /**/
-#define LONGDBLNANBYTES 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00         /**/
+#define LONGDBLINFBYTES 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00         /**/
+#define LONGDBLNANBYTES 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00         /**/
 
 /* PERL_PRIfldbl:
  *     This symbol, if defined, contains the string used by stdio to
  *     This symbol, if defined, indicates that a variable of type NVTYPE
  *     stores 0.0 in memory as all bits zero.
  */
-#define        IVTYPE          long            /**/
-#define        UVTYPE          unsigned long           /**/
+#define        IVTYPE          long long               /**/
+#define        UVTYPE          unsigned long long              /**/
 #define        I8TYPE          char            /**/
 #define        U8TYPE          unsigned char           /**/
 #define        I16TYPE         short   /**/
 #define        U64TYPE         unsigned long long      /**/
 #endif
 #define        NVTYPE          double          /**/
-#define        IVSIZE          4               /**/
-#define        UVSIZE          4               /**/
+#define        IVSIZE          8               /**/
+#define        UVSIZE          8               /**/
 #define        I8SIZE          1               /**/
 #define        U8SIZE          1               /**/
 #define        I16SIZE         2       /**/
 #define        U64SIZE         8       /**/
 #endif
 #define        NVSIZE          8               /**/
-#define        NV_PRESERVES_UV
-#define        NV_PRESERVES_UV_BITS    32
-#define        NV_OVERFLOWS_INTEGERS_AT        256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0
+#undef NV_PRESERVES_UV
+#define        NV_PRESERVES_UV_BITS    53
+#define        NV_OVERFLOWS_INTEGERS_AT        (256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0)
 #define        NV_ZERO_IS_ALLBITS_ZERO
 #if UVSIZE == 8
 #   ifdef BYTEORDER
  *     This symbol defines the format string used for printing a Perl NV
  *     using %g-ish floating point format.
  */
-#define        IVdf            "ld"            /**/
-#define        UVuf            "lu"            /**/
-#define        UVof            "lo"            /**/
-#define        UVxf            "lx"            /**/
-#define        UVXf            "lX"            /**/
+#define        IVdf            "I64d"          /**/
+#define        UVuf            "I64u"          /**/
+#define        UVof            "I64o"          /**/
+#define        UVxf            "I64x"          /**/
+#define        UVXf            "I64X"          /**/
 #define        NVef            "e"             /**/
 #define        NVff            "f"             /**/
 #define        NVgf            "g"             /**/
  *     is either n or 32*ceil(n/32), especially many little-endians do
  *     the latter.  This is only useful if you have select(), naturally.
  */
-#define SELECT_MIN_BITS        32      /**/
+#define SELECT_MIN_BITS        32      /**/
 
 /* ST_INO_SIZE:
  *     This variable contains the size of struct stat's st_ino in bytes.
  *     1 for unsigned, -1 for signed.
  */
 #define ST_INO_SIGN 1  /* st_ino sign */
-#define ST_INO_SIZE 4  /* st_ino size */
+#define ST_INO_SIZE 8  /* st_ino size */
 
 /* STARTPERL:
  *     This variable contains the string to put in front of a perl
  *     you may need at least to reboot your OS to 64-bit mode.
  */
 #ifndef USE_64_BIT_INT
-/*#define      USE_64_BIT_INT          / **/
+#define        USE_64_BIT_INT          /**/
 #endif
 #ifndef USE_64_BIT_ALL
 /*#define      USE_64_BIT_ALL          / **/
 /* USE_KERN_PROC_PATHNAME:
  *     This symbol, if defined, indicates that we can use sysctl with
  *     KERN_PROC_PATHNAME to get a full path for the executable, and hence
- *     convert $^X to an absolute path.
+ *     convert $^X to an absolute path.
  */
 /*#define USE_KERN_PROC_PATHNAME       / **/
 
  *     is defined, and 'int *' otherwise.  This is only useful if you
  *     have select(), of course.
  */
-#define Select_fd_set_t        Perl_fd_set *   /**/
+#define Select_fd_set_t        Perl_fd_set *   /**/
 
 /* Sock_size_t:
  *     This symbol holds the type used for the size argument of
  *     where library files may be held under a private library, for
  *     instance.
  */
-#define ARCHNAME "MSWin32-x86-perlio"          /**/
+#define ARCHNAME "MSWin32-x64-perlio"          /**/
 
 /* HAS_ASCTIME_R:
  *     This symbol, if defined, indicates that the asctime_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_asctime_r
  *     is defined.
  */
-/*#define HAS_ASCTIME_R           / **/
-#define ASCTIME_R_PROTO 0         /**/
+/*#define HAS_ASCTIME_R        / **/
+#define ASCTIME_R_PROTO 0      /**/
 
 /* HAS_CRYPT_R:
  *     This symbol, if defined, indicates that the crypt_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_crypt_r
  *     is defined.
  */
-/*#define HAS_CRYPT_R     / **/
-#define CRYPT_R_PROTO 0           /**/
+/*#define HAS_CRYPT_R  / **/
+#define CRYPT_R_PROTO 0        /**/
 
 /* HAS_CTERMID_R:
  *     This symbol, if defined, indicates that the ctermid_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_ctermid_r
  *     is defined.
  */
-/*#define HAS_CTERMID_R           / **/
-#define CTERMID_R_PROTO 0         /**/
+/*#define HAS_CTERMID_R        / **/
+#define CTERMID_R_PROTO 0      /**/
 
 /* HAS_CTIME_R:
  *     This symbol, if defined, indicates that the ctime_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_ctime_r
  *     is defined.
  */
-/*#define HAS_CTIME_R     / **/
-#define CTIME_R_PROTO 0           /**/
+/*#define HAS_CTIME_R  / **/
+#define CTIME_R_PROTO 0        /**/
 
 /* HAS_DRAND48_R:
  *     This symbol, if defined, indicates that the drand48_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_drand48_r
  *     is defined.
  */
-/*#define HAS_DRAND48_R           / **/
-#define DRAND48_R_PROTO 0         /**/
+/*#define HAS_DRAND48_R        / **/
+#define DRAND48_R_PROTO 0      /**/
 
 /* HAS_ENDGRENT_R:
  *     This symbol, if defined, indicates that the endgrent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_endgrent_r
  *     is defined.
  */
-/*#define HAS_ENDGRENT_R          / **/
-#define ENDGRENT_R_PROTO 0        /**/
+/*#define HAS_ENDGRENT_R       / **/
+#define ENDGRENT_R_PROTO 0     /**/
 
 /* HAS_ENDHOSTENT_R:
  *     This symbol, if defined, indicates that the endhostent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_endhostent_r
  *     is defined.
  */
-/*#define HAS_ENDHOSTENT_R        / **/
-#define ENDHOSTENT_R_PROTO 0      /**/
+/*#define HAS_ENDHOSTENT_R     / **/
+#define ENDHOSTENT_R_PROTO 0   /**/
 
 /* HAS_ENDNETENT_R:
  *     This symbol, if defined, indicates that the endnetent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_endnetent_r
  *     is defined.
  */
-/*#define HAS_ENDNETENT_R         / **/
-#define ENDNETENT_R_PROTO 0       /**/
+/*#define HAS_ENDNETENT_R      / **/
+#define ENDNETENT_R_PROTO 0    /**/
 
 /* HAS_ENDPROTOENT_R:
  *     This symbol, if defined, indicates that the endprotoent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_endprotoent_r
  *     is defined.
  */
-/*#define HAS_ENDPROTOENT_R       / **/
-#define ENDPROTOENT_R_PROTO 0     /**/
+/*#define HAS_ENDPROTOENT_R    / **/
+#define ENDPROTOENT_R_PROTO 0  /**/
 
 /* HAS_ENDPWENT_R:
  *     This symbol, if defined, indicates that the endpwent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_endpwent_r
  *     is defined.
  */
-/*#define HAS_ENDPWENT_R          / **/
-#define ENDPWENT_R_PROTO 0        /**/
+/*#define HAS_ENDPWENT_R       / **/
+#define ENDPWENT_R_PROTO 0     /**/
 
 /* HAS_ENDSERVENT_R:
  *     This symbol, if defined, indicates that the endservent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_endservent_r
  *     is defined.
  */
-/*#define HAS_ENDSERVENT_R        / **/
-#define ENDSERVENT_R_PROTO 0      /**/
+/*#define HAS_ENDSERVENT_R     / **/
+#define ENDSERVENT_R_PROTO 0   /**/
 
 /* HAS_GETGRENT_R:
  *     This symbol, if defined, indicates that the getgrent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrent_r
  *     is defined.
  */
-/*#define HAS_GETGRENT_R          / **/
-#define GETGRENT_R_PROTO 0        /**/
+/*#define HAS_GETGRENT_R       / **/
+#define GETGRENT_R_PROTO 0     /**/
 
 /* HAS_GETGRGID_R:
  *     This symbol, if defined, indicates that the getgrgid_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrgid_r
  *     is defined.
  */
-/*#define HAS_GETGRGID_R          / **/
-#define GETGRGID_R_PROTO 0        /**/
+/*#define HAS_GETGRGID_R       / **/
+#define GETGRGID_R_PROTO 0     /**/
 
 /* HAS_GETGRNAM_R:
  *     This symbol, if defined, indicates that the getgrnam_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrnam_r
  *     is defined.
  */
-/*#define HAS_GETGRNAM_R          / **/
-#define GETGRNAM_R_PROTO 0        /**/
+/*#define HAS_GETGRNAM_R       / **/
+#define GETGRNAM_R_PROTO 0     /**/
 
 /* HAS_GETHOSTBYADDR_R:
  *     This symbol, if defined, indicates that the gethostbyaddr_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostbyaddr_r
  *     is defined.
  */
-/*#define HAS_GETHOSTBYADDR_R     / **/
-#define GETHOSTBYADDR_R_PROTO 0           /**/
+/*#define HAS_GETHOSTBYADDR_R  / **/
+#define GETHOSTBYADDR_R_PROTO 0        /**/
 
 /* HAS_GETHOSTBYNAME_R:
  *     This symbol, if defined, indicates that the gethostbyname_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostbyname_r
  *     is defined.
  */
-/*#define HAS_GETHOSTBYNAME_R     / **/
-#define GETHOSTBYNAME_R_PROTO 0           /**/
+/*#define HAS_GETHOSTBYNAME_R  / **/
+#define GETHOSTBYNAME_R_PROTO 0        /**/
 
 /* HAS_GETHOSTENT_R:
  *     This symbol, if defined, indicates that the gethostent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostent_r
  *     is defined.
  */
-/*#define HAS_GETHOSTENT_R        / **/
-#define GETHOSTENT_R_PROTO 0      /**/
+/*#define HAS_GETHOSTENT_R     / **/
+#define GETHOSTENT_R_PROTO 0   /**/
 
 /* HAS_GETLOGIN_R:
  *     This symbol, if defined, indicates that the getlogin_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getlogin_r
  *     is defined.
  */
-/*#define HAS_GETLOGIN_R          / **/
-#define GETLOGIN_R_PROTO 0        /**/
+/*#define HAS_GETLOGIN_R       / **/
+#define GETLOGIN_R_PROTO 0     /**/
 
 /* HAS_GETNETBYADDR_R:
  *     This symbol, if defined, indicates that the getnetbyaddr_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetbyaddr_r
  *     is defined.
  */
-/*#define HAS_GETNETBYADDR_R      / **/
-#define GETNETBYADDR_R_PROTO 0    /**/
+/*#define HAS_GETNETBYADDR_R   / **/
+#define GETNETBYADDR_R_PROTO 0 /**/
 
 /* HAS_GETNETBYNAME_R:
  *     This symbol, if defined, indicates that the getnetbyname_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetbyname_r
  *     is defined.
  */
-/*#define HAS_GETNETBYNAME_R      / **/
-#define GETNETBYNAME_R_PROTO 0    /**/
+/*#define HAS_GETNETBYNAME_R   / **/
+#define GETNETBYNAME_R_PROTO 0 /**/
 
 /* HAS_GETNETENT_R:
  *     This symbol, if defined, indicates that the getnetent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetent_r
  *     is defined.
  */
-/*#define HAS_GETNETENT_R         / **/
-#define GETNETENT_R_PROTO 0       /**/
+/*#define HAS_GETNETENT_R      / **/
+#define GETNETENT_R_PROTO 0    /**/
 
 /* HAS_GETPROTOBYNAME_R:
  *     This symbol, if defined, indicates that the getprotobyname_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotobyname_r
  *     is defined.
  */
-/*#define HAS_GETPROTOBYNAME_R    / **/
-#define GETPROTOBYNAME_R_PROTO 0          /**/
+/*#define HAS_GETPROTOBYNAME_R / **/
+#define GETPROTOBYNAME_R_PROTO 0       /**/
 
 /* HAS_GETPROTOBYNUMBER_R:
  *     This symbol, if defined, indicates that the getprotobynumber_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotobynumber_r
  *     is defined.
  */
-/*#define HAS_GETPROTOBYNUMBER_R          / **/
-#define GETPROTOBYNUMBER_R_PROTO 0        /**/
+/*#define HAS_GETPROTOBYNUMBER_R       / **/
+#define GETPROTOBYNUMBER_R_PROTO 0     /**/
 
 /* HAS_GETPROTOENT_R:
  *     This symbol, if defined, indicates that the getprotoent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotoent_r
  *     is defined.
  */
-/*#define HAS_GETPROTOENT_R       / **/
-#define GETPROTOENT_R_PROTO 0     /**/
+/*#define HAS_GETPROTOENT_R    / **/
+#define GETPROTOENT_R_PROTO 0  /**/
 
 /* HAS_GETPWENT_R:
  *     This symbol, if defined, indicates that the getpwent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwent_r
  *     is defined.
  */
-/*#define HAS_GETPWENT_R          / **/
-#define GETPWENT_R_PROTO 0        /**/
+/*#define HAS_GETPWENT_R       / **/
+#define GETPWENT_R_PROTO 0     /**/
 
 /* HAS_GETPWNAM_R:
  *     This symbol, if defined, indicates that the getpwnam_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwnam_r
  *     is defined.
  */
-/*#define HAS_GETPWNAM_R          / **/
-#define GETPWNAM_R_PROTO 0        /**/
+/*#define HAS_GETPWNAM_R       / **/
+#define GETPWNAM_R_PROTO 0     /**/
 
 /* HAS_GETPWUID_R:
  *     This symbol, if defined, indicates that the getpwuid_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwuid_r
  *     is defined.
  */
-/*#define HAS_GETPWUID_R          / **/
-#define GETPWUID_R_PROTO 0        /**/
+/*#define HAS_GETPWUID_R       / **/
+#define GETPWUID_R_PROTO 0     /**/
 
 /* HAS_GETSERVBYNAME_R:
  *     This symbol, if defined, indicates that the getservbyname_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservbyname_r
  *     is defined.
  */
-/*#define HAS_GETSERVBYNAME_R     / **/
-#define GETSERVBYNAME_R_PROTO 0           /**/
+/*#define HAS_GETSERVBYNAME_R  / **/
+#define GETSERVBYNAME_R_PROTO 0        /**/
 
 /* HAS_GETSERVBYPORT_R:
  *     This symbol, if defined, indicates that the getservbyport_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservbyport_r
  *     is defined.
  */
-/*#define HAS_GETSERVBYPORT_R     / **/
-#define GETSERVBYPORT_R_PROTO 0           /**/
+/*#define HAS_GETSERVBYPORT_R  / **/
+#define GETSERVBYPORT_R_PROTO 0        /**/
 
 /* HAS_GETSERVENT_R:
  *     This symbol, if defined, indicates that the getservent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservent_r
  *     is defined.
  */
-/*#define HAS_GETSERVENT_R        / **/
-#define GETSERVENT_R_PROTO 0      /**/
+/*#define HAS_GETSERVENT_R     / **/
+#define GETSERVENT_R_PROTO 0   /**/
 
 /* HAS_GETSPNAM_R:
  *     This symbol, if defined, indicates that the getspnam_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getspnam_r
  *     is defined.
  */
-/*#define HAS_GETSPNAM_R          / **/
-#define GETSPNAM_R_PROTO 0        /**/
+/*#define HAS_GETSPNAM_R       / **/
+#define GETSPNAM_R_PROTO 0     /**/
 
 /* HAS_GMTIME_R:
  *     This symbol, if defined, indicates that the gmtime_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_gmtime_r
  *     is defined.
  */
-/*#define HAS_GMTIME_R    / **/
-#define GMTIME_R_PROTO 0          /**/
+/*#define HAS_GMTIME_R / **/
+#define GMTIME_R_PROTO 0       /**/
+
+/* HAS_LOCALECONV_L:
+ *     This symbol, if defined, indicates that the localeconv_l routine is
+ *     available to query certain information about a locale.
+ */
+/*#define HAS_LOCALECONV_L             / **/
 
 /* HAS_LOCALTIME_R:
  *     This symbol, if defined, indicates that the localtime_r routine
 #define L_R_TZSET
 #endif
 
+/* L_R_TZSET:
+ *     If localtime_r() needs tzset, it is defined in this define
+ */
 /* LOCALTIME_R_PROTO:
  *     This symbol encodes the prototype of localtime_r.
  *     It is zero if d_localtime_r is undef, and one of the
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_localtime_r
  *     is defined.
  */
-/*#define HAS_LOCALTIME_R         / **/
-#define LOCALTIME_R_PROTO 0       /**/
+/*#define HAS_LOCALTIME_R      / **/
+#define LOCALTIME_R_PROTO 0    /**/
+
+/* HAS_MBRLEN:
+ *     This symbol, if defined, indicates that the mbrlen routine is
+ *     available to get the length of multi-byte character strings.
+ */
+/*#define HAS_MBRLEN   / **/
+
+/* HAS_MBRTOWC:
+ *     This symbol, if defined, indicates that the mbrtowc routine is
+ *     available to convert a multi-byte character into a wide character.
+ */
+/*#define HAS_MBRTOWC  / **/
+
+/* HAS_THREAD_SAFE_NL_LANGINFO_L:
+ *     This symbol, when defined, indicates presence of the nl_langinfo_l()
+ *     function, and that it is thread-safe.
+ */
+/*#define HAS_THREAD_SAFE_NL_LANGINFO_L        / **/
 
 /* OLD_PTHREAD_CREATE_JOINABLE:
  *     This symbol, if defined, indicates how to create pthread
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_random_r
  *     is defined.
  */
-/*#define HAS_RANDOM_R    / **/
-#define RANDOM_R_PROTO 0          /**/
+/*#define HAS_RANDOM_R / **/
+#define RANDOM_R_PROTO 0       /**/
 
 /* HAS_READDIR64_R:
  *     This symbol, if defined, indicates that the readdir64_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_readdir64_r
  *     is defined.
  */
-/*#define HAS_READDIR64_R         / **/
-#define READDIR64_R_PROTO 0       /**/
+/*#define HAS_READDIR64_R      / **/
+#define READDIR64_R_PROTO 0    /**/
 
 /* HAS_READDIR_R:
  *     This symbol, if defined, indicates that the readdir_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_readdir_r
  *     is defined.
  */
-/*#define HAS_READDIR_R           / **/
-#define READDIR_R_PROTO 0         /**/
+/*#define HAS_READDIR_R        / **/
+#define READDIR_R_PROTO 0      /**/
 
 /* HAS_SETGRENT_R:
  *     This symbol, if defined, indicates that the setgrent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_setgrent_r
  *     is defined.
  */
-/*#define HAS_SETGRENT_R          / **/
-#define SETGRENT_R_PROTO 0        /**/
+/*#define HAS_SETGRENT_R       / **/
+#define SETGRENT_R_PROTO 0     /**/
 
 /* HAS_SETHOSTENT_R:
  *     This symbol, if defined, indicates that the sethostent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_sethostent_r
  *     is defined.
  */
-/*#define HAS_SETHOSTENT_R        / **/
-#define SETHOSTENT_R_PROTO 0      /**/
+/*#define HAS_SETHOSTENT_R     / **/
+#define SETHOSTENT_R_PROTO 0   /**/
 
 /* HAS_SETLOCALE_R:
  *     This symbol, if defined, indicates that the setlocale_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_setlocale_r
  *     is defined.
  */
-/*#define HAS_SETLOCALE_R         / **/
-#define SETLOCALE_R_PROTO 0       /**/
+/*#define HAS_SETLOCALE_R      / **/
+#define SETLOCALE_R_PROTO 0    /**/
 
 /* HAS_SETNETENT_R:
  *     This symbol, if defined, indicates that the setnetent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_setnetent_r
  *     is defined.
  */
-/*#define HAS_SETNETENT_R         / **/
-#define SETNETENT_R_PROTO 0       /**/
+/*#define HAS_SETNETENT_R      / **/
+#define SETNETENT_R_PROTO 0    /**/
 
 /* HAS_SETPROTOENT_R:
  *     This symbol, if defined, indicates that the setprotoent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_setprotoent_r
  *     is defined.
  */
-/*#define HAS_SETPROTOENT_R       / **/
-#define SETPROTOENT_R_PROTO 0     /**/
+/*#define HAS_SETPROTOENT_R    / **/
+#define SETPROTOENT_R_PROTO 0  /**/
 
 /* HAS_SETPWENT_R:
  *     This symbol, if defined, indicates that the setpwent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_setpwent_r
  *     is defined.
  */
-/*#define HAS_SETPWENT_R          / **/
-#define SETPWENT_R_PROTO 0        /**/
+/*#define HAS_SETPWENT_R       / **/
+#define SETPWENT_R_PROTO 0     /**/
 
 /* HAS_SETSERVENT_R:
  *     This symbol, if defined, indicates that the setservent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_setservent_r
  *     is defined.
  */
-/*#define HAS_SETSERVENT_R        / **/
-#define SETSERVENT_R_PROTO 0      /**/
+/*#define HAS_SETSERVENT_R     / **/
+#define SETSERVENT_R_PROTO 0   /**/
 
 /* HAS_SRAND48_R:
  *     This symbol, if defined, indicates that the srand48_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_srand48_r
  *     is defined.
  */
-/*#define HAS_SRAND48_R           / **/
-#define SRAND48_R_PROTO 0         /**/
+/*#define HAS_SRAND48_R        / **/
+#define SRAND48_R_PROTO 0      /**/
 
 /* HAS_SRANDOM_R:
  *     This symbol, if defined, indicates that the srandom_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_srandom_r
  *     is defined.
  */
-/*#define HAS_SRANDOM_R           / **/
-#define SRANDOM_R_PROTO 0         /**/
+/*#define HAS_SRANDOM_R        / **/
+#define SRANDOM_R_PROTO 0      /**/
 
 /* HAS_STRERROR_R:
  *     This symbol, if defined, indicates that the strerror_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_strerror_r
  *     is defined.
  */
-/*#define HAS_STRERROR_R          / **/
-#define STRERROR_R_PROTO 0        /**/
+/*#define HAS_STRERROR_R       / **/
+#define STRERROR_R_PROTO 0     /**/
+
+/* HAS_STRTOD_L:
+ *     This symbol, if defined, indicates that the strtod_l routine is
+ *     available to convert strings to long doubles.
+ */
+/*#define HAS_STRTOD_L         / **/
+
+/* HAS_STRTOLD_L:
+ *     This symbol, if defined, indicates that the strtold_l routine is
+ *     available to convert strings to long doubles.
+ */
+/*#define HAS_STRTOLD_L                / **/
 
 /* HAS_TMPNAM_R:
  *     This symbol, if defined, indicates that the tmpnam_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_tmpnam_r
  *     is defined.
  */
-/*#define HAS_TMPNAM_R    / **/
-#define TMPNAM_R_PROTO 0          /**/
+/*#define HAS_TMPNAM_R / **/
+#define TMPNAM_R_PROTO 0       /**/
 
 /* HAS_TTYNAME_R:
  *     This symbol, if defined, indicates that the ttyname_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_ttyname_r
  *     is defined.
  */
-/*#define HAS_TTYNAME_R           / **/
-#define TTYNAME_R_PROTO 0         /**/
+/*#define HAS_TTYNAME_R        / **/
+#define TTYNAME_R_PROTO 0      /**/
+
+/* HAS_WCRTOMB:
+ *     This symbol, if defined, indicates that the wcrtomb routine is
+ *     available to convert a wide character into a multi-byte character.
+ */
+/*#define HAS_WCRTOMB  / **/
 
 /* I_MACH_CTHREADS:
- *     This symbol, if defined, indicates to the C program that it should
- *     include <mach/cthreads.h>.
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <mach/cthreads.h>.
  */
 /*#define   I_MACH_CTHREADS    / **/
 
 /* I_PTHREAD:
- *     This symbol, if defined, indicates to the C program that it should
- *     include <pthread.h>.
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <pthread.h>.
  */
 /*#define   I_PTHREAD  / **/
 
 /* HAS_TIMES:
  *     This symbol, if defined, indicates that the times() routine exists.
  *     Note that this became obsolete on some systems (SUNOS), which now
- * use getrusage(). It may be necessary to include <sys/times.h>.
+ *     use getrusage(). It may be necessary to include <sys/times.h>.
  */
 #define HAS_TIMES              /**/
 
 /* Size_t_size:
  *     This symbol holds the size of a Size_t in bytes.
  */
-#define Size_t_size 4          /**/
+#define Size_t_size 8          /**/
 
 /* Size_t:
  *     This symbol holds the type used to declare length parameters
index 62addd1..4b88f66 100644 (file)
@@ -9,8 +9,8 @@
 
 /* Package name      : perl5
  * Source directory  : 
- * Configuration time: Tue Oct 17 08:29:51 2017
- * Configured by     : shay
+ * Configuration time: Wed Oct  7 16:25:12 2020
+ * Configured by     : tony
  * Target system     : 
  */
 
  *     This symbol, if defined, indicates that the lstat routine is
  *     available to do file stats on symbolic links.
  */
-/*#define HAS_LSTAT            / **/
+#define HAS_LSTAT              /**/
 
 /* HAS_MBLEN:
  *     This symbol, if defined, indicates that the mblen routine is available
  */
 #define HAS_MKTIME             /**/
 
+/* HAS_MSG:
+ *     This symbol, if defined, indicates that the entire msg*(2) library is
+ *     supported (IPC mechanism based on message queues).
+ */
+/*#define HAS_MSG              / **/
+
 /* HAS_MSYNC:
  *     This symbol, if defined, indicates that the msync system call is
  *     available to synchronize a mapped file.
  */
 #define HAS_SELECT     /**/
 
+/* HAS_SEM:
+ *     This symbol, if defined, indicates that the entire sem*(2) library is
+ *     supported.
+ */
+/*#define HAS_SEM              / **/
+
 /* HAS_SETEGID:
  *     This symbol, if defined, indicates that the setegid routine is available
  *     to change the effective gid of the current program.
  */
 /*#define HAS_SETLINEBUF               / **/
 
-/* HAS_SETLOCALE:
- *     This symbol, if defined, indicates that the setlocale routine is
- *     available to handle locale-specific ctype implementations.
- */
-#define HAS_SETLOCALE  /**/
-
 /* HAS_SETPGID:
  *     This symbol, if defined, indicates that the setpgid(pid, gpid)
  *     routine is available to set process group ID.
 /*#define HAS_EACCESS          / **/
 
 /* I_SYS_ACCESS:
- *     This symbol, if defined, indicates to the C program that it should
- *     include <sys/access.h>.
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/access.h>.
  */
 /*#define   I_SYS_ACCESS                / **/
 
 /* I_SYS_SECURITY:
- *     This symbol, if defined, indicates to the C program that it should
- *     include <sys/security.h>.
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/security.h>.
  */
 /*#define   I_SYS_SECURITY     / **/
 
  *     This symbol contains the number of bytes required to align a
  *     double, or a long double when applicable. Usual values are 2,
  *     4 and 8. The default is eight, for safety.  For cross-compiling
- *     or multiarch support, Configure will set a minimum of 8.
+ *     or multiarch support, Configure will set a minimum of 8.
  */
 #define MEM_ALIGNBYTES 8
 
 #    endif
 #  endif
 #else
-#define BYTEORDER 0x1234       /* large digits for MSB */
+#define BYTEORDER 0x12345678   /* large digits for MSB */
 #endif
 
 /* CHARBITS:
  *     the GNU C library is being used.  A better check is to use
  *     the __GLIBC__ and __GLIBC_MINOR__ symbols supplied with glibc.
  */
-/*#define HAS_GNULIBC          / **/
+/*#define HAS_GNULIBC  / **/
 #if defined(HAS_GNULIBC) && !defined(_GNU_SOURCE)
 #   define _GNU_SOURCE
 #endif
  *     This symbol is defined if using the FILE_ptr macro as an lvalue
  *     to increase the pointer by n leaves File_cnt(fp) unchanged.
  */
-#define USE_STDIO_PTR  /**/
+#define USE_STDIO_PTR  /**/
 #ifdef USE_STDIO_PTR
-#define FILE_ptr(fp)   ((fp)->_ptr)
-#define STDIO_PTR_LVALUE               /**/
-#define FILE_cnt(fp)   ((fp)->_cnt)
-#define STDIO_CNT_LVALUE               /**/
+#define FILE_ptr(fp)   PERLIO_FILE_ptr(fp)
+#define STDIO_PTR_LVALUE               /**/
+#define FILE_cnt(fp)   PERLIO_FILE_cnt(fp)
+#define STDIO_CNT_LVALUE               /**/
 /*#define STDIO_PTR_LVAL_SETS_CNT      / **/
 #define STDIO_PTR_LVAL_NOCHANGE_CNT    /**/
 #endif
  *     structure pointed to its argument. This macro will always be defined
  *     if USE_STDIO_BASE is defined.
  */
-#define USE_STDIO_BASE         /**/
+#define USE_STDIO_BASE /**/
 #ifdef USE_STDIO_BASE
-#define FILE_base(fp)  ((fp)->_base)
-#define FILE_bufsiz(fp)        ((fp)->_cnt + (fp)->_ptr - (fp)->_base)
+#define FILE_base(fp)  PERLIO_FILE_base(fp)
+#define FILE_bufsiz(fp)        (PERLIO_FILE_cnt(fp) + PERLIO_FILE_ptr(fp) - PERLIO_FILE_base(fp))
 #endif
 
 /* DOUBLESIZE:
 #define DOUBLESIZE 8           /**/
 
 /* I_TIME:
- *     This symbol, if defined, indicates to the C program that it should
- *     include <time.h>.
+ *     This symbol is always defined, and indicates to the C program that
+ *     it should include <time.h>.
  */
 /* I_SYS_TIME:
  *     This symbol, if defined, indicates to the C program that it should
  *     the compiler supports (void *); otherwise it will be
  *     sizeof(char *).
  */
-#define PTRSIZE 4              /**/
+#define PTRSIZE 8              /**/
 
 /* Drand01:
  *     This macro is to be used to generate uniformly distributed
  *     to get any typedef'ed information.
  *     We will pick a type such that sizeof(SSize_t) == sizeof(Size_t).
  */
-#define SSize_t int     /* signed count of bytes */
+#define SSize_t __int64        /* signed count of bytes */
 
 /* EBCDIC:
  *     This symbol, if defined, indicates that this system uses
  *     EBCDIC encoding.
  */
-/*#define      EBCDIC          / **/
+/*#define      EBCDIC          / **/
 
 /* ARCHLIB:
  *     This variable, if defined, holds the name of the directory in
  */
 #define BIN "c:\\perl\\bin"    /**/
 #define BIN_EXP "c:\\perl\\bin"        /**/
-#define PERL_RELOCATABLE_INC "undef"           /**/
+#define PERL_RELOCATABLE_INC "undef"           /**/
 
 /* PERL_INC_VERSION_LIST:
  *     This variable specifies the list of subdirectories in over
 
 /* INSTALL_USR_BIN_PERL:
  *     This symbol, if defined, indicates that Perl is to be installed
- *     also as /usr/bin/perl.
+ *     also as /usr/bin/perl.
  */
 /*#define INSTALL_USR_BIN_PERL / **/
 
  *     feature tests from Configure are generally more reliable.
  */
 #define OSNAME "MSWin32"               /**/
-#define OSVERS "6.1"           /**/
+#define OSVERS "10.0.18363.1082"               /**/
 
 /* CAT2:
  *     This macro concatenates 2 tokens together.
 /* CPPSTDIN:
  *     This symbol contains the first part of the string which will invoke
  *     the C preprocessor on the standard input and produce to standard
- *     output.  Typical value of "cc -E" or "/lib/cpp", but it can also
+ *     output.  Typical value of "cc -E" or "/lib/cpp", but it can also
  *     call a wrapper. See CPPRUN.
  */
 /* CPPMINUS:
 /* HASATTRIBUTE_WARN_UNUSED_RESULT:
  *     Can we handle GCC attribute for warning on unused results
  */
+/* HASATTRIBUTE_ALWAYS_INLINE:
+ *     Can we handle GCC attribute for functions that should always be
+ *     inlined.
+ */
 /*#define HASATTRIBUTE_DEPRECATED      / **/
 /*#define HASATTRIBUTE_FORMAT  / **/
 /*#define PRINTF_FORMAT_NULL_OK        / **/
 /*#define HASATTRIBUTE_PURE    / **/
 /*#define HASATTRIBUTE_UNUSED  / **/
 /*#define HASATTRIBUTE_WARN_UNUSED_RESULT      / **/
+/*#define HASATTRIBUTE_ALWAYS_INLINE   / **/
 
 /* HAS_BACKTRACE:
  *     This symbol, if defined, indicates that the backtrace() routine is
  *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE
  *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_BE
  *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_LE
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIAN
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIAN
  *     LONG_DOUBLE_IS_VAX_H_FLOAT
  *     LONG_DOUBLE_IS_UNKNOWN_FORMAT
  *     It is only defined if the system supports long doubles.
 /*#define HAS_MMAP             / **/
 #define Mmap_t void *  /**/
 
-/* HAS_MSG:
- *     This symbol, if defined, indicates that the entire msg*(2) library is
- *     supported (IPC mechanism based on message queues).
- */
-/*#define HAS_MSG              / **/
-
-/* HAS_SEM:
- *     This symbol, if defined, indicates that the entire sem*(2) library is
- *     supported.
- */
-/*#define HAS_SEM              / **/
-
 /* HAS_SETGRENT:
  *     This symbol, if defined, indicates that the setgrent routine is
  *     available for initializing sequential access of the group database.
  *     This symbol, if defined, indicates the availability of
  *     struct sockaddr_in6;
  */
+/* HAS_SOCKADDR_STORAGE:
+ *     This symbol, if defined, indicates the availability of
+ *     struct sockaddr_storage;
+ */
 /* HAS_SIN6_SCOPE_ID:
  *     This symbol, if defined, indicates that the struct sockaddr_in6
  *     structure has a member called sin6_scope_id.
 /*#define      HAS_SOCKETPAIR  / **/
 /*#define      HAS_SOCKADDR_SA_LEN     / **/
 /*#define      HAS_SOCKADDR_IN6        / **/
+#define        HAS_SOCKADDR_STORAGE    /**/
 #define        HAS_SIN6_SCOPE_ID       /**/
 /*#define      HAS_IP_MREQ     / **/
 /*#define      HAS_IP_MREQ_SOURCE      / **/
  *     st_blksize and st_blocks.
  */
 #ifndef USE_STAT_BLOCKS
-/*#define USE_STAT_BLOCKS      / **/
+/*#define USE_STAT_BLOCKS      / **/
 #endif
 
 /* HAS_SYS_ERRLIST:
  *     This symbol, if defined, indicates that the union semun is
  *     defined by including <sys/sem.h>.  If not, the user code
  *     probably needs to define it as:
- *     union semun {
+ *      union semun {
  *         int val;
  *         struct semid_ds *buf;
  *         unsigned short *array;
- *     }
+ *      }
  */
 /* USE_SEMCTL_SEMUN:
  *     This symbol, if defined, indicates that union semun is
 
 /* Free_t:
  *     This variable contains the return type of free().  It is usually
- * void, but occasionally int.
+ *     void, but occasionally int.
  */
 /* Malloc_t:
  *     This symbol is the type of pointer returned by malloc and realloc.
  *     This symbol, if defined, indicates that the atoll routine is
  *     available to convert strings into long longs.
  */
-/*#define HAS_ATOLL            / **/
+#define HAS_ATOLL              /**/
 
 /* HAS__FWALK:
  *     This symbol, if defined, indicates that the _fwalk system call is
  */
 /*#define HAS__FWALK           / **/
 
+/* HAS_ACCEPT4:
+ *     This symbol, if defined, indicates that the accept4 routine is
+ *     available to accept socket connections.
+ */
+/*#define HAS_ACCEPT4  / **/
+
 /* HAS_ACOSH:
  *     This symbol, if defined, indicates that the acosh routine is
  *     available to do the inverse hyperbolic cosine function.
 /*#define HAS_BUILTIN_EXPECT   / **/
 /*#define HAS_BUILTIN_CHOOSE_EXPR      / **/
 
+/* HAS_BUILTIN_ADD_OVERFLOW:
+ *     This symbol, if defined, indicates that the compiler supports
+ *     __builtin_add_overflow for adding integers with overflow checks.
+ */
+/* HAS_BUILTIN_SUB_OVERFLOW:
+ *     This symbol, if defined, indicates that the compiler supports
+ *     __builtin_sub_overflow for subtracting integers with overflow checks.
+ */
+/* HAS_BUILTIN_MUL_OVERFLOW:
+ *     This symbol, if defined, indicates that the compiler supports
+ *     __builtin_mul_overflow for multiplying integers with overflow checks.
+ */
+/*#define HAS_BUILTIN_ADD_OVERFLOW     / **/
+/*#define HAS_BUILTIN_SUB_OVERFLOW     / **/
+/*#define HAS_BUILTIN_MUL_OVERFLOW     / **/
+
 /* HAS_C99_VARIADIC_MACROS:
  *     If defined, the compiler supports C99 variadic macros.
  */
  *     makes sense if you *have* dlsym, which we will presume is the
  *     case if you're using dl_dlopen.xs.
  */
-/*#define      DLSYM_NEEDS_UNDERSCORE  / **/
+/*#define      DLSYM_NEEDS_UNDERSCORE  / **/
+
+/* HAS_DUP3:
+ *     This symbol, if defined, indicates that the dup3 routine is
+ *     available to duplicate file descriptors.
+ */
+/*#define HAS_DUP3     / **/
 
 /* HAS_ERF:
  *     This symbol, if defined, indicates that the erf routine is
  *     available to classify doubles.  Available for example in HP-UX.
  *     The returned values are defined in <math.h> and are
  *
- *           FP_NORMAL     Normalized
- *           FP_ZERO       Zero
- *           FP_INFINITE   Infinity
- *           FP_SUBNORMAL  Denormalized
- *           FP_NAN        NaN
+ *       FP_NORMAL     Normalized
+ *       FP_ZERO       Zero
+ *       FP_INFINITE   Infinity
+ *       FP_SUBNORMAL  Denormalized
+ *       FP_NAN        NaN
  *
  */
 /* HAS_FP_CLASSIFY:
  *     This symbol, if defined, indicates that the fp_classify routine is
  *     available to classify doubles. The values are defined in <math.h>
  *
- *           FP_NORMAL     Normalized
- *           FP_ZERO       Zero
- *           FP_INFINITE   Infinity
- *           FP_SUBNORMAL  Denormalized
- *           FP_NAN        NaN
+ *       FP_NORMAL     Normalized
+ *       FP_ZERO       Zero
+ *       FP_INFINITE   Infinity
+ *       FP_SUBNORMAL  Denormalized
+ *       FP_NAN        NaN
  *
  */
 /*#define      HAS_FPCLASSIFY          / **/
 /* HAS_FPOS64_T:
  *     This symbol will be defined if the C compiler supports fpos64_t.
  */
-/*#define      HAS_FPOS64_T            / **/
+/*#define      HAS_FPOS64_T    / **/
 
 /* HAS_FREXPL:
  *     This symbol, if defined, indicates that the frexpl routine is
 /*#define HAS_INETPTON         / **/
 
 /* HAS_INT64_T:
- *     This symbol will defined if the C compiler supports int64_t.
- *     Usually the <inttypes.h> needs to be included, but sometimes
+ *     This symbol will defined if the C compiler supports int64_t.
+ *     Usually the <inttypes.h> needs to be included, but sometimes
  *     <sys/types.h> is enough.
  */
 /*#define     HAS_INT64_T               / **/
  *     of significant digits in a long double precision number. Unlike
  *     for DBL_DIG, there's no good guess for LDBL_DIG if it is undefined.
  */
-#define HAS_LDBL_DIG   /**/
+#define HAS_LDBL_DIG   /**/
 
 /* HAS_LGAMMA:
  *     This symbol, if defined, indicates that the lgamma routine is
  *     This symbol, if defined, indicates that the memmem routine is
  *     available to return a pointer to the start of the first occurrence
  *     of a substring in a memory area (or NULL if not found).
+ *     In glibc, memmem is a GNU extension.  The function is visible in
+ *     libc, but the prototype is only visible if _GNU_SOURCE is #defined.
+ *     Thus we only define this if both the prototype and symbol are found.
  */
 /*#define HAS_MEMMEM           / **/
 
  */
 /*#define HAS_MKDTEMP          / **/
 
+/* HAS_MKOSTEMP:
+ *     This symbol, if defined, indicates that the mkostemp routine is
+ *     available to exclusively create and open a uniquely named (with a
+ *     suffix) temporary file.
+ */
+/*#define HAS_MKOSTEMP / **/
+
 /* HAS_MKSTEMPS:
  *     This symbol, if defined, indicates that the mkstemps routine is
  *     available to exclusively create and open a uniquely named
  */
 /*#define HAS_NAN              / **/
 
+/* HAS_NANOSLEEP:
+ *     This symbol, if defined, indicates that the nanosleep
+ *     system call is available to sleep with 1E-9 sec accuracy.
+ */
+/*#define HAS_NANOSLEEP                / **/
+
 /* HAS_NEARBYINT:
  *     This symbol, if defined, indicates that the nearbyint routine is
  *     available to return the integral value closest to (according to
  *     This symbol, if defined, indicates that the uselocale routine is
  *     available to set the current locale for the calling thread.
  */
+/* HAS_DUPLOCALE:
+ *     This symbol, if defined, indicates that the duplocale routine is
+ *     available to duplicate a locale object.
+ */
 /* HAS_QUERYLOCALE:
  *     This symbol, if defined, indicates that the querylocale routine is
  *     available to return the name of the locale for a category mask.
 /*#define      HAS_NEWLOCALE   / **/
 /*#define      HAS_FREELOCALE  / **/
 /*#define      HAS_USELOCALE   / **/
+/*#define      HAS_DUPLOCALE   / **/
 /*#define      HAS_QUERYLOCALE / **/
 /*#define      I_XLOCALE               / **/
 
 /* HAS_OFF64_T:
  *     This symbol will be defined if the C compiler supports off64_t.
  */
-/*#define      HAS_OFF64_T             / **/
+/*#define      HAS_OFF64_T             / **/
+
+/* HAS_PIPE2:
+ *     This symbol, if defined, indicates that the pipe2 routine is
+ *     available to create an inter-process channel.
+ */
+/*#define HAS_PIPE2            / **/
 
 /* HAS_PRCTL:
  *     This symbol, if defined, indicates that the prctl routine is
 /* HAS_PTRDIFF_T:
  *     This symbol will be defined if the C compiler supports ptrdiff_t.
  */
-#define        HAS_PTRDIFF_T                   /**/
+#define        HAS_PTRDIFF_T           /**/
 
 /* HAS_READV:
  *     This symbol, if defined, indicates that the readv routine is
  */
 /*#define HAS_SETITIMER                / **/
 
+/* HAS_SETLOCALE:
+ *     This symbol, if defined, indicates that the setlocale routine is
+ *     available to handle locale-specific ctype implementations.
+ */
+/* SETLOCALE_ACCEPTS_ANY_LOCALE_NAME:
+ *     This symbol, if defined, indicates that the setlocale routine is
+ *     available and it accepts any input locale name as valid.
+ */
+#define HAS_SETLOCALE  /**/
+/*#define SETLOCALE_ACCEPTS_ANY_LOCALE_NAME    / **/
+
 /* HAS_SETPROCTITLE:
  *     This symbol, if defined, indicates that the setproctitle routine is
  *     available to set process title.
  */
 /*#define HAS_STRLCPY          / **/
 
+/* HAS_STRNLEN:
+ *     This symbol, if defined, indicates that the strnlen () routine is
+ *     available to check the length of a string up to a maximum.
+ */
+/*#define HAS_STRNLEN          / **/
+
 /* HAS_STRTOLD:
  *     This symbol, if defined, indicates that the strtold routine is
  *     available to convert strings to long doubles.
  *     This symbol, if defined, indicates that the strtoll routine is
  *     available to convert strings to long longs.
  */
-/*#define HAS_STRTOLL          / **/
+#define HAS_STRTOLL            /**/
 
 /* HAS_STRTOQ:
  *     This symbol, if defined, indicates that the strtoq routine is
  *     This symbol, if defined, indicates that the strtoull routine is
  *     available to convert strings to unsigned long longs.
  */
-/*#define HAS_STRTOULL         / **/
+#define HAS_STRTOULL           /**/
 
 /* HAS_STRTOUQ:
  *     This symbol, if defined, indicates that the strtouq routine is
  */
 /*#define HAS_TIMEGM           / **/
 
+/* HAS_TOWLOWER:
+ *     This symbol, if defined, indicates that the towlower () routine is
+ *     available to do case conversion.
+ */
+/*#define HAS_TOWLOWER         / **/
+
+/* HAS_TOWUPPER:
+ *     This symbol, if defined, indicates that the towupper () routine is
+ *     available to do case conversion.
+ */
+/*#define HAS_TOWUPPER         / **/
+
 /* HAS_TRUNC:
  *     This symbol, if defined, indicates that the trunc routine is
  *     available to round doubles towards zero.
  */
 #define DEFAULT_INC_EXCLUDES_DOT       /**/
 
+/* USE_STRICT_BY_DEFAULT
+ *     This symbol, if defined, enables additional defaults.
+ *     At this time it only enables implicit strict by default.
+ */
+/*#define USE_STRICT_BY_DEFAULT        / * use strict by default */
+
 /* USE_DYNAMIC_LOADING:
  *     This symbol, if defined, indicates that dynamic loading of
  *     some sort is available.
  *     Note that if fflushNULL is defined, fflushall will not
  *     even be probed for and will be left undefined.
  */
-#define        FFLUSH_NULL             /**/
-/*#define      FFLUSH_ALL              / **/
+#define        FFLUSH_NULL             /**/
+/*#define      FFLUSH_ALL              / **/
 
 /* I_BFD:
  *     This symbol, if defined, indicates that <bfd.h> exists and
  *     For DB version 1 this is always 0.
  */
 #define DB_Hash_t      int             /**/
-#define DB_Prefix_t    int     /**/
-#define DB_VERSION_MAJOR_CFG   0       /**/
-#define DB_VERSION_MINOR_CFG   0       /**/
-#define DB_VERSION_PATCH_CFG   0       /**/
+#define DB_Prefix_t    int             /**/
+#define DB_VERSION_MAJOR_CFG   0       /**/
+#define DB_VERSION_MINOR_CFG   0       /**/
+#define DB_VERSION_PATCH_CFG   0       /**/
 
 /* I_FENV:
  *     This symbol, if defined, indicates to the C program that it should
 /*#define      I_IEEEFP                / **/
 
 /* I_INTTYPES:
- *     This symbol, if defined, indicates to the C program that it should
- *     include <inttypes.h>.
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <inttypes.h>.
  */
 /*#define   I_INTTYPES                / **/
 
 /*#define      I_MNTENT                / **/
 
 /* I_NETINET_TCP:
- *     This symbol, if defined, indicates to the C program that it should
- *     include <netinet/tcp.h>.
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <netinet/tcp.h>.
  */
 /*#define   I_NETINET_TCP                / **/
 
  *     This symbol, if defined, indicates that <stdbool.h> exists and
  *     can be included.
  */
-/*#define      I_STDBOOL               / **/
+#define        I_STDBOOL               /**/
 
 /* I_STDINT:
  *     This symbol, if defined, indicates that <stdint.h> exists and
  *     should be included.
  */
-/*#define I_STDINT             / **/
+#define I_STDINT               /**/
 
 /* I_SUNMATH:
  *     This symbol, if defined, indicates that <sunmath.h> exists and
  */
 /*#define      I_USTAT         / **/
 
+/* I_WCHAR:
+ *     This symbol, if defined, indicates to the C program that <wchar.h>
+ *     is available for inclusion
+ */
+/*#define   I_WCHAR    / **/
+
+/* I_WCTYPE:
+ *     This symbol, if defined, indicates that <wctype.h> exists.
+ */
+/*#define      I_WCTYPE                / **/
+
 /* DOUBLEINFBYTES:
  *     This symbol, if defined, is a comma-separated list of
  *     hexadecimal bytes for the double precision infinity.
  *     This symbol, if defined, indicates that a variable of type NVTYPE
  *     stores 0.0 in memory as all bits zero.
  */
-#define        IVTYPE          long            /**/
-#define        UVTYPE          unsigned long           /**/
+#define        IVTYPE          __int64         /**/
+#define        UVTYPE          unsigned __int64                /**/
 #define        I8TYPE          char            /**/
 #define        U8TYPE          unsigned char           /**/
 #define        I16TYPE         short   /**/
 #define        U64TYPE         unsigned __int64        /**/
 #endif
 #define        NVTYPE          double          /**/
-#define        IVSIZE          4               /**/
-#define        UVSIZE          4               /**/
+#define        IVSIZE          8               /**/
+#define        UVSIZE          8               /**/
 #define        I8SIZE          1               /**/
 #define        U8SIZE          1               /**/
 #define        I16SIZE         2       /**/
 #define        U64SIZE         8       /**/
 #endif
 #define        NVSIZE          8               /**/
-#define        NV_PRESERVES_UV
-#define        NV_PRESERVES_UV_BITS    32
-#define        NV_OVERFLOWS_INTEGERS_AT        256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0
+#undef NV_PRESERVES_UV
+#define        NV_PRESERVES_UV_BITS    53
+#define        NV_OVERFLOWS_INTEGERS_AT        (256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0)
 #define        NV_ZERO_IS_ALLBITS_ZERO
 #if UVSIZE == 8
 #   ifdef BYTEORDER
  *     This symbol defines the format string used for printing a Perl NV
  *     using %g-ish floating point format.
  */
-#define        IVdf            "ld"            /**/
-#define        UVuf            "lu"            /**/
-#define        UVof            "lo"            /**/
-#define        UVxf            "lx"            /**/
-#define        UVXf            "lX"            /**/
+#define        IVdf            "I64d"          /**/
+#define        UVuf            "I64u"          /**/
+#define        UVof            "I64o"          /**/
+#define        UVxf            "I64x"          /**/
+#define        UVXf            "I64X"          /**/
 #define        NVef            "e"             /**/
 #define        NVff            "f"             /**/
 #define        NVgf            "g"             /**/
  *     is either n or 32*ceil(n/32), especially many little-endians do
  *     the latter.  This is only useful if you have select(), naturally.
  */
-#define SELECT_MIN_BITS        32      /**/
+#define SELECT_MIN_BITS        32      /**/
 
 /* ST_INO_SIZE:
  *     This variable contains the size of struct stat's st_ino in bytes.
  *     1 for unsigned, -1 for signed.
  */
 #define ST_INO_SIGN 1  /* st_ino sign */
-#define ST_INO_SIZE 4  /* st_ino size */
+#define ST_INO_SIZE 8  /* st_ino size */
 
 /* STARTPERL:
  *     This variable contains the string to put in front of a perl
  *     This symbol contains the minimum value for the time_t offset that
  *     the system function localtime () accepts, and defaults to 0
  */
-#define GMTIME_MAX             2147483647      /**/
+#define GMTIME_MAX             32535291599     /**/
 #define GMTIME_MIN             0       /**/
-#define LOCALTIME_MAX  2147483647      /**/
+#define LOCALTIME_MAX  32535244799     /**/
 #define LOCALTIME_MIN  0       /**/
 
 /* USE_64_BIT_INT:
  *     you may need at least to reboot your OS to 64-bit mode.
  */
 #ifndef USE_64_BIT_INT
-/*#define      USE_64_BIT_INT          / **/
+#define        USE_64_BIT_INT          /**/
 #endif
 #ifndef USE_64_BIT_ALL
 /*#define      USE_64_BIT_ALL          / **/
 /* USE_KERN_PROC_PATHNAME:
  *     This symbol, if defined, indicates that we can use sysctl with
  *     KERN_PROC_PATHNAME to get a full path for the executable, and hence
- *     convert $^X to an absolute path.
+ *     convert $^X to an absolute path.
  */
 /*#define USE_KERN_PROC_PATHNAME       / **/
 
  *     is defined, and 'int *' otherwise.  This is only useful if you
  *     have select(), of course.
  */
-#define Select_fd_set_t        Perl_fd_set *   /**/
+#define Select_fd_set_t        Perl_fd_set *   /**/
 
 /* Sock_size_t:
  *     This symbol holds the type used for the size argument of
  *     where library files may be held under a private library, for
  *     instance.
  */
-#define ARCHNAME "MSWin32-x86-perlio"          /**/
+#define ARCHNAME "MSWin32-x64-perlio"          /**/
 
 /* HAS_ASCTIME_R:
  *     This symbol, if defined, indicates that the asctime_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_asctime_r
  *     is defined.
  */
-/*#define HAS_ASCTIME_R           / **/
-#define ASCTIME_R_PROTO 0         /**/
+/*#define HAS_ASCTIME_R        / **/
+#define ASCTIME_R_PROTO 0      /**/
 
 /* HAS_CRYPT_R:
  *     This symbol, if defined, indicates that the crypt_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_crypt_r
  *     is defined.
  */
-/*#define HAS_CRYPT_R     / **/
-#define CRYPT_R_PROTO 0           /**/
+/*#define HAS_CRYPT_R  / **/
+#define CRYPT_R_PROTO 0        /**/
 
 /* HAS_CTERMID_R:
  *     This symbol, if defined, indicates that the ctermid_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_ctermid_r
  *     is defined.
  */
-/*#define HAS_CTERMID_R           / **/
-#define CTERMID_R_PROTO 0         /**/
+/*#define HAS_CTERMID_R        / **/
+#define CTERMID_R_PROTO 0      /**/
 
 /* HAS_CTIME_R:
  *     This symbol, if defined, indicates that the ctime_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_ctime_r
  *     is defined.
  */
-/*#define HAS_CTIME_R     / **/
-#define CTIME_R_PROTO 0           /**/
+/*#define HAS_CTIME_R  / **/
+#define CTIME_R_PROTO 0        /**/
 
 /* HAS_DRAND48_R:
  *     This symbol, if defined, indicates that the drand48_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_drand48_r
  *     is defined.
  */
-/*#define HAS_DRAND48_R           / **/
-#define DRAND48_R_PROTO 0         /**/
+/*#define HAS_DRAND48_R        / **/
+#define DRAND48_R_PROTO 0      /**/
 
 /* HAS_ENDGRENT_R:
  *     This symbol, if defined, indicates that the endgrent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_endgrent_r
  *     is defined.
  */
-/*#define HAS_ENDGRENT_R          / **/
-#define ENDGRENT_R_PROTO 0        /**/
+/*#define HAS_ENDGRENT_R       / **/
+#define ENDGRENT_R_PROTO 0     /**/
 
 /* HAS_ENDHOSTENT_R:
  *     This symbol, if defined, indicates that the endhostent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_endhostent_r
  *     is defined.
  */
-/*#define HAS_ENDHOSTENT_R        / **/
-#define ENDHOSTENT_R_PROTO 0      /**/
+/*#define HAS_ENDHOSTENT_R     / **/
+#define ENDHOSTENT_R_PROTO 0   /**/
 
 /* HAS_ENDNETENT_R:
  *     This symbol, if defined, indicates that the endnetent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_endnetent_r
  *     is defined.
  */
-/*#define HAS_ENDNETENT_R         / **/
-#define ENDNETENT_R_PROTO 0       /**/
+/*#define HAS_ENDNETENT_R      / **/
+#define ENDNETENT_R_PROTO 0    /**/
 
 /* HAS_ENDPROTOENT_R:
  *     This symbol, if defined, indicates that the endprotoent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_endprotoent_r
  *     is defined.
  */
-/*#define HAS_ENDPROTOENT_R       / **/
-#define ENDPROTOENT_R_PROTO 0     /**/
+/*#define HAS_ENDPROTOENT_R    / **/
+#define ENDPROTOENT_R_PROTO 0  /**/
 
 /* HAS_ENDPWENT_R:
  *     This symbol, if defined, indicates that the endpwent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_endpwent_r
  *     is defined.
  */
-/*#define HAS_ENDPWENT_R          / **/
-#define ENDPWENT_R_PROTO 0        /**/
+/*#define HAS_ENDPWENT_R       / **/
+#define ENDPWENT_R_PROTO 0     /**/
 
 /* HAS_ENDSERVENT_R:
  *     This symbol, if defined, indicates that the endservent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_endservent_r
  *     is defined.
  */
-/*#define HAS_ENDSERVENT_R        / **/
-#define ENDSERVENT_R_PROTO 0      /**/
+/*#define HAS_ENDSERVENT_R     / **/
+#define ENDSERVENT_R_PROTO 0   /**/
 
 /* HAS_GETGRENT_R:
  *     This symbol, if defined, indicates that the getgrent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrent_r
  *     is defined.
  */
-/*#define HAS_GETGRENT_R          / **/
-#define GETGRENT_R_PROTO 0        /**/
+/*#define HAS_GETGRENT_R       / **/
+#define GETGRENT_R_PROTO 0     /**/
 
 /* HAS_GETGRGID_R:
  *     This symbol, if defined, indicates that the getgrgid_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrgid_r
  *     is defined.
  */
-/*#define HAS_GETGRGID_R          / **/
-#define GETGRGID_R_PROTO 0        /**/
+/*#define HAS_GETGRGID_R       / **/
+#define GETGRGID_R_PROTO 0     /**/
 
 /* HAS_GETGRNAM_R:
  *     This symbol, if defined, indicates that the getgrnam_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrnam_r
  *     is defined.
  */
-/*#define HAS_GETGRNAM_R          / **/
-#define GETGRNAM_R_PROTO 0        /**/
+/*#define HAS_GETGRNAM_R       / **/
+#define GETGRNAM_R_PROTO 0     /**/
 
 /* HAS_GETHOSTBYADDR_R:
  *     This symbol, if defined, indicates that the gethostbyaddr_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostbyaddr_r
  *     is defined.
  */
-/*#define HAS_GETHOSTBYADDR_R     / **/
-#define GETHOSTBYADDR_R_PROTO 0           /**/
+/*#define HAS_GETHOSTBYADDR_R  / **/
+#define GETHOSTBYADDR_R_PROTO 0        /**/
 
 /* HAS_GETHOSTBYNAME_R:
  *     This symbol, if defined, indicates that the gethostbyname_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostbyname_r
  *     is defined.
  */
-/*#define HAS_GETHOSTBYNAME_R     / **/
-#define GETHOSTBYNAME_R_PROTO 0           /**/
+/*#define HAS_GETHOSTBYNAME_R  / **/
+#define GETHOSTBYNAME_R_PROTO 0        /**/
 
 /* HAS_GETHOSTENT_R:
  *     This symbol, if defined, indicates that the gethostent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostent_r
  *     is defined.
  */
-/*#define HAS_GETHOSTENT_R        / **/
-#define GETHOSTENT_R_PROTO 0      /**/
+/*#define HAS_GETHOSTENT_R     / **/
+#define GETHOSTENT_R_PROTO 0   /**/
 
 /* HAS_GETLOGIN_R:
  *     This symbol, if defined, indicates that the getlogin_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getlogin_r
  *     is defined.
  */
-/*#define HAS_GETLOGIN_R          / **/
-#define GETLOGIN_R_PROTO 0        /**/
+/*#define HAS_GETLOGIN_R       / **/
+#define GETLOGIN_R_PROTO 0     /**/
 
 /* HAS_GETNETBYADDR_R:
  *     This symbol, if defined, indicates that the getnetbyaddr_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetbyaddr_r
  *     is defined.
  */
-/*#define HAS_GETNETBYADDR_R      / **/
-#define GETNETBYADDR_R_PROTO 0    /**/
+/*#define HAS_GETNETBYADDR_R   / **/
+#define GETNETBYADDR_R_PROTO 0 /**/
 
 /* HAS_GETNETBYNAME_R:
  *     This symbol, if defined, indicates that the getnetbyname_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetbyname_r
  *     is defined.
  */
-/*#define HAS_GETNETBYNAME_R      / **/
-#define GETNETBYNAME_R_PROTO 0    /**/
+/*#define HAS_GETNETBYNAME_R   / **/
+#define GETNETBYNAME_R_PROTO 0 /**/
 
 /* HAS_GETNETENT_R:
  *     This symbol, if defined, indicates that the getnetent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetent_r
  *     is defined.
  */
-/*#define HAS_GETNETENT_R         / **/
-#define GETNETENT_R_PROTO 0       /**/
+/*#define HAS_GETNETENT_R      / **/
+#define GETNETENT_R_PROTO 0    /**/
 
 /* HAS_GETPROTOBYNAME_R:
  *     This symbol, if defined, indicates that the getprotobyname_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotobyname_r
  *     is defined.
  */
-/*#define HAS_GETPROTOBYNAME_R    / **/
-#define GETPROTOBYNAME_R_PROTO 0          /**/
+/*#define HAS_GETPROTOBYNAME_R / **/
+#define GETPROTOBYNAME_R_PROTO 0       /**/
 
 /* HAS_GETPROTOBYNUMBER_R:
  *     This symbol, if defined, indicates that the getprotobynumber_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotobynumber_r
  *     is defined.
  */
-/*#define HAS_GETPROTOBYNUMBER_R          / **/
-#define GETPROTOBYNUMBER_R_PROTO 0        /**/
+/*#define HAS_GETPROTOBYNUMBER_R       / **/
+#define GETPROTOBYNUMBER_R_PROTO 0     /**/
 
 /* HAS_GETPROTOENT_R:
  *     This symbol, if defined, indicates that the getprotoent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotoent_r
  *     is defined.
  */
-/*#define HAS_GETPROTOENT_R       / **/
-#define GETPROTOENT_R_PROTO 0     /**/
+/*#define HAS_GETPROTOENT_R    / **/
+#define GETPROTOENT_R_PROTO 0  /**/
 
 /* HAS_GETPWENT_R:
  *     This symbol, if defined, indicates that the getpwent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwent_r
  *     is defined.
  */
-/*#define HAS_GETPWENT_R          / **/
-#define GETPWENT_R_PROTO 0        /**/
+/*#define HAS_GETPWENT_R       / **/
+#define GETPWENT_R_PROTO 0     /**/
 
 /* HAS_GETPWNAM_R:
  *     This symbol, if defined, indicates that the getpwnam_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwnam_r
  *     is defined.
  */
-/*#define HAS_GETPWNAM_R          / **/
-#define GETPWNAM_R_PROTO 0        /**/
+/*#define HAS_GETPWNAM_R       / **/
+#define GETPWNAM_R_PROTO 0     /**/
 
 /* HAS_GETPWUID_R:
  *     This symbol, if defined, indicates that the getpwuid_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwuid_r
  *     is defined.
  */
-/*#define HAS_GETPWUID_R          / **/
-#define GETPWUID_R_PROTO 0        /**/
+/*#define HAS_GETPWUID_R       / **/
+#define GETPWUID_R_PROTO 0     /**/
 
 /* HAS_GETSERVBYNAME_R:
  *     This symbol, if defined, indicates that the getservbyname_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservbyname_r
  *     is defined.
  */
-/*#define HAS_GETSERVBYNAME_R     / **/
-#define GETSERVBYNAME_R_PROTO 0           /**/
+/*#define HAS_GETSERVBYNAME_R  / **/
+#define GETSERVBYNAME_R_PROTO 0        /**/
 
 /* HAS_GETSERVBYPORT_R:
  *     This symbol, if defined, indicates that the getservbyport_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservbyport_r
  *     is defined.
  */
-/*#define HAS_GETSERVBYPORT_R     / **/
-#define GETSERVBYPORT_R_PROTO 0           /**/
+/*#define HAS_GETSERVBYPORT_R  / **/
+#define GETSERVBYPORT_R_PROTO 0        /**/
 
 /* HAS_GETSERVENT_R:
  *     This symbol, if defined, indicates that the getservent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservent_r
  *     is defined.
  */
-/*#define HAS_GETSERVENT_R        / **/
-#define GETSERVENT_R_PROTO 0      /**/
+/*#define HAS_GETSERVENT_R     / **/
+#define GETSERVENT_R_PROTO 0   /**/
 
 /* HAS_GETSPNAM_R:
  *     This symbol, if defined, indicates that the getspnam_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_getspnam_r
  *     is defined.
  */
-/*#define HAS_GETSPNAM_R          / **/
-#define GETSPNAM_R_PROTO 0        /**/
+/*#define HAS_GETSPNAM_R       / **/
+#define GETSPNAM_R_PROTO 0     /**/
 
 /* HAS_GMTIME_R:
  *     This symbol, if defined, indicates that the gmtime_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_gmtime_r
  *     is defined.
  */
-/*#define HAS_GMTIME_R    / **/
-#define GMTIME_R_PROTO 0          /**/
+/*#define HAS_GMTIME_R / **/
+#define GMTIME_R_PROTO 0       /**/
+
+/* HAS_LOCALECONV_L:
+ *     This symbol, if defined, indicates that the localeconv_l routine is
+ *     available to query certain information about a locale.
+ */
+/*#define HAS_LOCALECONV_L             / **/
 
 /* HAS_LOCALTIME_R:
  *     This symbol, if defined, indicates that the localtime_r routine
 #define L_R_TZSET
 #endif
 
+/* L_R_TZSET:
+ *     If localtime_r() needs tzset, it is defined in this define
+ */
 /* LOCALTIME_R_PROTO:
  *     This symbol encodes the prototype of localtime_r.
  *     It is zero if d_localtime_r is undef, and one of the
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_localtime_r
  *     is defined.
  */
-/*#define HAS_LOCALTIME_R         / **/
-#define LOCALTIME_R_PROTO 0       /**/
+/*#define HAS_LOCALTIME_R      / **/
+#define LOCALTIME_R_PROTO 0    /**/
+
+/* HAS_MBRLEN:
+ *     This symbol, if defined, indicates that the mbrlen routine is
+ *     available to get the length of multi-byte character strings.
+ */
+/*#define HAS_MBRLEN   / **/
+
+/* HAS_MBRTOWC:
+ *     This symbol, if defined, indicates that the mbrtowc routine is
+ *     available to convert a multi-byte character into a wide character.
+ */
+/*#define HAS_MBRTOWC  / **/
+
+/* HAS_THREAD_SAFE_NL_LANGINFO_L:
+ *     This symbol, when defined, indicates presence of the nl_langinfo_l()
+ *     function, and that it is thread-safe.
+ */
+/*#define HAS_THREAD_SAFE_NL_LANGINFO_L        / **/
 
 /* OLD_PTHREAD_CREATE_JOINABLE:
  *     This symbol, if defined, indicates how to create pthread
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_random_r
  *     is defined.
  */
-/*#define HAS_RANDOM_R    / **/
-#define RANDOM_R_PROTO 0          /**/
+/*#define HAS_RANDOM_R / **/
+#define RANDOM_R_PROTO 0       /**/
 
 /* HAS_READDIR64_R:
  *     This symbol, if defined, indicates that the readdir64_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_readdir64_r
  *     is defined.
  */
-/*#define HAS_READDIR64_R         / **/
-#define READDIR64_R_PROTO 0       /**/
+/*#define HAS_READDIR64_R      / **/
+#define READDIR64_R_PROTO 0    /**/
 
 /* HAS_READDIR_R:
  *     This symbol, if defined, indicates that the readdir_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_readdir_r
  *     is defined.
  */
-/*#define HAS_READDIR_R           / **/
-#define READDIR_R_PROTO 0         /**/
+/*#define HAS_READDIR_R        / **/
+#define READDIR_R_PROTO 0      /**/
 
 /* HAS_SETGRENT_R:
  *     This symbol, if defined, indicates that the setgrent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_setgrent_r
  *     is defined.
  */
-/*#define HAS_SETGRENT_R          / **/
-#define SETGRENT_R_PROTO 0        /**/
+/*#define HAS_SETGRENT_R       / **/
+#define SETGRENT_R_PROTO 0     /**/
 
 /* HAS_SETHOSTENT_R:
  *     This symbol, if defined, indicates that the sethostent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_sethostent_r
  *     is defined.
  */
-/*#define HAS_SETHOSTENT_R        / **/
-#define SETHOSTENT_R_PROTO 0      /**/
+/*#define HAS_SETHOSTENT_R     / **/
+#define SETHOSTENT_R_PROTO 0   /**/
 
 /* HAS_SETLOCALE_R:
  *     This symbol, if defined, indicates that the setlocale_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_setlocale_r
  *     is defined.
  */
-/*#define HAS_SETLOCALE_R         / **/
-#define SETLOCALE_R_PROTO 0       /**/
+/*#define HAS_SETLOCALE_R      / **/
+#define SETLOCALE_R_PROTO 0    /**/
 
 /* HAS_SETNETENT_R:
  *     This symbol, if defined, indicates that the setnetent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_setnetent_r
  *     is defined.
  */
-/*#define HAS_SETNETENT_R         / **/
-#define SETNETENT_R_PROTO 0       /**/
+/*#define HAS_SETNETENT_R      / **/
+#define SETNETENT_R_PROTO 0    /**/
 
 /* HAS_SETPROTOENT_R:
  *     This symbol, if defined, indicates that the setprotoent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_setprotoent_r
  *     is defined.
  */
-/*#define HAS_SETPROTOENT_R       / **/
-#define SETPROTOENT_R_PROTO 0     /**/
+/*#define HAS_SETPROTOENT_R    / **/
+#define SETPROTOENT_R_PROTO 0  /**/
 
 /* HAS_SETPWENT_R:
  *     This symbol, if defined, indicates that the setpwent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_setpwent_r
  *     is defined.
  */
-/*#define HAS_SETPWENT_R          / **/
-#define SETPWENT_R_PROTO 0        /**/
+/*#define HAS_SETPWENT_R       / **/
+#define SETPWENT_R_PROTO 0     /**/
 
 /* HAS_SETSERVENT_R:
  *     This symbol, if defined, indicates that the setservent_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_setservent_r
  *     is defined.
  */
-/*#define HAS_SETSERVENT_R        / **/
-#define SETSERVENT_R_PROTO 0      /**/
+/*#define HAS_SETSERVENT_R     / **/
+#define SETSERVENT_R_PROTO 0   /**/
 
 /* HAS_SRAND48_R:
  *     This symbol, if defined, indicates that the srand48_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_srand48_r
  *     is defined.
  */
-/*#define HAS_SRAND48_R           / **/
-#define SRAND48_R_PROTO 0         /**/
+/*#define HAS_SRAND48_R        / **/
+#define SRAND48_R_PROTO 0      /**/
 
 /* HAS_SRANDOM_R:
  *     This symbol, if defined, indicates that the srandom_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_srandom_r
  *     is defined.
  */
-/*#define HAS_SRANDOM_R           / **/
-#define SRANDOM_R_PROTO 0         /**/
+/*#define HAS_SRANDOM_R        / **/
+#define SRANDOM_R_PROTO 0      /**/
 
 /* HAS_STRERROR_R:
  *     This symbol, if defined, indicates that the strerror_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_strerror_r
  *     is defined.
  */
-/*#define HAS_STRERROR_R          / **/
-#define STRERROR_R_PROTO 0        /**/
+/*#define HAS_STRERROR_R       / **/
+#define STRERROR_R_PROTO 0     /**/
+
+/* HAS_STRTOD_L:
+ *     This symbol, if defined, indicates that the strtod_l routine is
+ *     available to convert strings to long doubles.
+ */
+/*#define HAS_STRTOD_L         / **/
+
+/* HAS_STRTOLD_L:
+ *     This symbol, if defined, indicates that the strtold_l routine is
+ *     available to convert strings to long doubles.
+ */
+/*#define HAS_STRTOLD_L                / **/
 
 /* HAS_TMPNAM_R:
  *     This symbol, if defined, indicates that the tmpnam_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_tmpnam_r
  *     is defined.
  */
-/*#define HAS_TMPNAM_R    / **/
-#define TMPNAM_R_PROTO 0          /**/
+/*#define HAS_TMPNAM_R / **/
+#define TMPNAM_R_PROTO 0       /**/
 
 /* HAS_TTYNAME_R:
  *     This symbol, if defined, indicates that the ttyname_r routine
  *     REENTRANT_PROTO_T_ABC macros of reentr.h if d_ttyname_r
  *     is defined.
  */
-/*#define HAS_TTYNAME_R           / **/
-#define TTYNAME_R_PROTO 0         /**/
+/*#define HAS_TTYNAME_R        / **/
+#define TTYNAME_R_PROTO 0      /**/
+
+/* HAS_WCRTOMB:
+ *     This symbol, if defined, indicates that the wcrtomb routine is
+ *     available to convert a wide character into a multi-byte character.
+ */
+/*#define HAS_WCRTOMB  / **/
 
 /* I_MACH_CTHREADS:
- *     This symbol, if defined, indicates to the C program that it should
- *     include <mach/cthreads.h>.
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <mach/cthreads.h>.
  */
 /*#define   I_MACH_CTHREADS    / **/
 
 /* I_PTHREAD:
- *     This symbol, if defined, indicates to the C program that it should
- *     include <pthread.h>.
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <pthread.h>.
  */
 /*#define   I_PTHREAD  / **/
 
 /* HAS_TIMES:
  *     This symbol, if defined, indicates that the times() routine exists.
  *     Note that this became obsolete on some systems (SUNOS), which now
- * use getrusage(). It may be necessary to include <sys/times.h>.
+ *     use getrusage(). It may be necessary to include <sys/times.h>.
  */
 #define HAS_TIMES              /**/
 
 /* Size_t_size:
  *     This symbol holds the size of a Size_t in bytes.
  */
-#define Size_t_size 4          /**/
+#define Size_t_size 8          /**/
 
 /* Size_t:
  *     This symbol holds the type used to declare length parameters
index f5ffca0..d00240f 100644 (file)
@@ -995,7 +995,7 @@ PerlLIOLseek(struct IPerlLIO* piPerl, int handle, Off_t offset, int origin)
 int
 PerlLIOLstat(struct IPerlLIO* piPerl, const char *path, Stat_t *buffer)
 {
-    return win32_stat(path, buffer);
+    return win32_lstat(path, buffer);
 }
 
 char*
index 80b4008..b757715 100644 (file)
@@ -39,6 +39,7 @@
 #include <tlhelp32.h>
 #include <io.h>
 #include <signal.h>
+#include <winioctl.h>
 
 /* #include "config.h" */
 
@@ -1462,7 +1463,10 @@ win32_stat(const char *path, Stat_t *sbuf)
     dTHX;
     int                res;
     int         nlink = 1;
+    unsigned __int64 ino = 0;
+    DWORD       vol = 0;
     BOOL        expect_dir = FALSE;
+    struct _stati64 st;
 
     if (l > 1) {
        switch(path[l - 1]) {
@@ -1508,11 +1512,16 @@ win32_stat(const char *path, Stat_t *sbuf)
         /* We must open & close the file once; otherwise file attribute changes  */
         /* might not yet have propagated to "other" hard links of the same file. */
         /* This also gives us an opportunity to determine the number of links.   */
-        HANDLE handle = CreateFileA(path, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
+        HANDLE handle = CreateFileA(path, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
         if (handle != INVALID_HANDLE_VALUE) {
             BY_HANDLE_FILE_INFORMATION bhi;
-            if (GetFileInformationByHandle(handle, &bhi))
+            if (GetFileInformationByHandle(handle, &bhi)) {
                 nlink = bhi.nNumberOfLinks;
+                ino = bhi.nFileIndexHigh;
+                ino <<= 32;
+                ino |= bhi.nFileIndexLow;
+                vol = bhi.dwVolumeSerialNumber;
+            }
             CloseHandle(handle);
         }
        else {
@@ -1527,7 +1536,17 @@ win32_stat(const char *path, Stat_t *sbuf)
 
     /* path will be mapped correctly above */
     res = _stati64(path, sbuf);
+    sbuf->st_dev = vol;
+    sbuf->st_ino = ino;
+    sbuf->st_mode = st.st_mode;
     sbuf->st_nlink = nlink;
+    sbuf->st_uid = st.st_uid;
+    sbuf->st_gid = st.st_gid;
+    sbuf->st_rdev = st.st_rdev;
+    sbuf->st_size = st.st_size;
+    sbuf->st_atime = st.st_atime;
+    sbuf->st_mtime = st.st_mtime;
+    sbuf->st_ctime = st.st_ctime;
 
     if (res < 0) {
        /* CRT is buggy on sharenames, so make sure it really isn't.
@@ -1575,6 +1594,147 @@ win32_stat(const char *path, Stat_t *sbuf)
     return res;
 }
 
+static void
+translate_to_errno(void)
+{
+    /* This isn't perfect, eg. Win32 returns ERROR_ACCESS_DENIED for
+       both permissions errors and if the source is a directory, while
+       POSIX wants EACCES and EPERM respectively.
+
+       Determined by experimentation on Windows 7 x64 SP1, since MS
+       don't document what error codes are returned.
+    */
+    switch (GetLastError()) {
+    case ERROR_BAD_NET_NAME:
+    case ERROR_BAD_NETPATH:
+    case ERROR_BAD_PATHNAME:
+    case ERROR_FILE_NOT_FOUND:
+    case ERROR_FILENAME_EXCED_RANGE:
+    case ERROR_INVALID_DRIVE:
+    case ERROR_PATH_NOT_FOUND:
+      errno = ENOENT;
+      break;
+    case ERROR_ALREADY_EXISTS:
+      errno = EEXIST;
+      break;
+    case ERROR_ACCESS_DENIED:
+    case ERROR_PRIVILEGE_NOT_HELD:
+      errno = EACCES;
+      break;
+    case ERROR_NOT_SAME_DEVICE:
+      errno = EXDEV;
+      break;
+    case ERROR_DISK_FULL:
+      errno = ENOSPC;
+      break;
+    case ERROR_NOT_ENOUGH_QUOTA:
+      errno = EDQUOT;
+      break;
+    default:
+      /* ERROR_INVALID_FUNCTION - eg. symlink on a FAT volume */
+      errno = EINVAL;
+      break;
+    }
+}
+
+/* Adapted from:
+
+https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_reparse_data_buffer
+
+Renamed to avoid conflicts, apparently some SDKs define this
+structure.
+
+Hoisted the symlink data into a new type to allow us to make a pointer
+to it, and to avoid C++ scoping issues.
+
+*/
+
+typedef struct {
+    USHORT SubstituteNameOffset;
+    USHORT SubstituteNameLength;
+    USHORT PrintNameOffset;
+    USHORT PrintNameLength;
+    ULONG  Flags;
+    WCHAR  PathBuffer[MAX_PATH*3];
+} MY_SYMLINK_REPARSE_BUFFER, *PMY_SYMLINK_REPARSE_BUFFER;
+
+typedef struct {
+  ULONG  ReparseTag;
+  USHORT ReparseDataLength;
+  USHORT Reserved;
+  union {
+    MY_SYMLINK_REPARSE_BUFFER SymbolicLinkReparseBuffer;
+    struct {
+      USHORT SubstituteNameOffset;
+      USHORT SubstituteNameLength;
+      USHORT PrintNameOffset;
+      USHORT PrintNameLength;
+      WCHAR  PathBuffer[1];
+    } MountPointReparseBuffer;
+    struct {
+      UCHAR DataBuffer[1];
+    } GenericReparseBuffer;
+  } Data;
+} MY_REPARSE_DATA_BUFFER, *PMY_REPARSE_DATA_BUFFER;
+
+static BOOL
+is_symlink(HANDLE h) {
+    MY_REPARSE_DATA_BUFFER linkdata;
+    const MY_SYMLINK_REPARSE_BUFFER * const sd =
+        &linkdata.Data.SymbolicLinkReparseBuffer;
+    DWORD linkdata_returned;
+
+    if (!DeviceIoControl(h, FSCTL_GET_REPARSE_POINT, NULL, 0, &linkdata, sizeof(linkdata), &linkdata_returned, NULL)) {
+        return FALSE;
+    }
+
+    if (linkdata_returned < offsetof(MY_REPARSE_DATA_BUFFER, Data.SymbolicLinkReparseBuffer.PathBuffer)
+        || linkdata.ReparseTag != IO_REPARSE_TAG_SYMLINK) {
+        /* some other type of reparse point */
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+DllExport int
+win32_lstat(const char *path, Stat_t *sbuf)
+{
+    HANDLE f;
+    int fd;
+    int result;
+    DWORD attr = GetFileAttributes(path); /* doesn't follow symlinks */
+
+    if (attr == INVALID_FILE_ATTRIBUTES) {
+        translate_to_errno();
+        return -1;
+    }
+
+    if (!(attr & FILE_ATTRIBUTE_REPARSE_POINT)) {
+        return win32_stat(path, sbuf);
+    }
+
+    f = CreateFileA(path, GENERIC_READ, 0, NULL, OPEN_EXISTING,
+                           FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, 0);
+    if (f == INVALID_HANDLE_VALUE) {
+        translate_to_errno();
+        return -1;
+    }
+
+    if (!is_symlink(f)) {
+        CloseHandle(f);
+        return win32_stat(path, sbuf);
+    }
+
+    fd = win32_open_osfhandle((intptr_t)f, 0);
+    result = win32_fstat(fd, sbuf);
+    if (result != -1){
+        sbuf->st_mode = (sbuf->st_mode & ~_S_IFMT) | _S_IFLNK;
+    }
+    close(fd);
+    return result;
+}
+
 #define isSLASH(c) ((c) == '/' || (c) == '\\')
 #define SKIP_SLASHES(s) \
     STMT_START {                               \
@@ -1668,7 +1828,6 @@ win32_longpath(char *path)
        }
        else {
            /* failed a step, just return without side effects */
-           /*PerlIO_printf(Perl_debug_log, "Failed to find %s\n", path);*/
            errno = EINVAL;
            return NULL;
        }
@@ -2955,7 +3114,39 @@ win32_abort(void)
 DllExport int
 win32_fstat(int fd, Stat_t *sbufptr)
 {
-    return _fstati64(fd, sbufptr);
+    int result;
+    struct _stati64 st;
+    dTHX;
+    result = _fstati64(fd, &st);
+    if (result == 0) {
+        sbufptr->st_mode = st.st_mode;
+        sbufptr->st_uid = st.st_uid;
+        sbufptr->st_gid = st.st_gid;
+        sbufptr->st_rdev = st.st_rdev;
+        sbufptr->st_size = st.st_size;
+        sbufptr->st_atime = st.st_atime;
+        sbufptr->st_mtime = st.st_mtime;
+        sbufptr->st_ctime = st.st_ctime;
+
+        if (w32_sloppystat) {
+            sbufptr->st_nlink = st.st_nlink;
+            sbufptr->st_dev = st.st_dev;
+            sbufptr->st_ino = st.st_ino;
+        }
+        else {
+            HANDLE handle = (HANDLE)win32_get_osfhandle(fd);
+            BY_HANDLE_FILE_INFORMATION bhi;
+            if (GetFileInformationByHandle(handle, &bhi)) {
+                sbufptr->st_nlink = bhi.nNumberOfLinks;
+                sbufptr->st_ino = bhi.nFileIndexHigh;
+                sbufptr->st_ino <<= 32;
+                sbufptr->st_ino |= bhi.nFileIndexLow;
+                sbufptr->st_dev = bhi.dwVolumeSerialNumber;
+            }
+        }
+    }
+    
+    return result;
 }
 
 DllExport int
index 00d052a..171cbfb 100644 (file)
@@ -731,5 +731,37 @@ DllExport void *win32_signal_context(void);
 #  define O_ACCMODE (O_RDWR | O_WRONLY | O_RDONLY)
 #endif
 
+/* ucrt at least seems to allocate a whole bit per type,
+   just mask off one bit from the mask for our symlink
+   file type.
+*/
+#define _S_IFLNK ((unsigned)(_S_IFMT ^ (_S_IFMT & -_S_IFMT)))
+#undef S_ISLNK
+#define S_ISLNK(mode) (((mode) & _S_IFMT) == _S_IFLNK)
+
+/*
+
+The default CRT struct stat uses unsigned short for st_dev and st_ino
+which obviously isn't enough, so we define our own structure.
+
+ */
+
+typedef DWORD Dev_t;
+typedef unsigned __int64 Ino_t;
+
+struct w32_stat {
+    Dev_t st_dev;
+    Ino_t st_ino;
+    unsigned short st_mode;
+    DWORD st_nlink;
+    short st_uid;
+    short st_gid;
+    Dev_t st_rdev;
+    Off_t st_size;
+    time_t st_atime;
+    time_t st_mtime;
+    time_t st_ctime;
+};
+
 #endif /* _INC_WIN32_PERL5 */
 
index 559e1f9..84fe1e5 100644 (file)
@@ -69,6 +69,7 @@ DllExport  FILE*      win32_tmpfile(void);
 DllExport  void                win32_abort(void);
 DllExport  int         win32_fstat(int fd,Stat_t *sbufptr);
 DllExport  int         win32_stat(const char *name,Stat_t *sbufptr);
+DllExport  int         win32_lstat(const char *name,Stat_t *sbufptr);
 DllExport  int         win32_pipe( int *phandles, unsigned int psize, int textmode );
 DllExport  PerlIO*     win32_popen( const char *command, const char *mode );
 DllExport  PerlIO*     win32_popenlist(const char *mode, IV narg, SV **args);
@@ -241,6 +242,7 @@ END_EXTERN_C
 #  undef stat
 #endif
 #define stat(pth,bufptr)       win32_stat(pth,bufptr)
+#define lstat(pth,bufptr)      win32_lstat(pth,bufptr)
 #define longpath(pth)          win32_longpath(pth)
 #define ansipath(pth)          win32_ansipath(pth)
 #define rename(old,new)                win32_rename(old,new)