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
[perl5.git] / win32 / win32.h
1 /* WIN32.H
2  *
3  * (c) 1995 Microsoft Corporation. All rights reserved.
4  *              Developed by hip communications inc.
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  */
9 #ifndef  _INC_WIN32_PERL5
10 #define  _INC_WIN32_PERL5
11
12 #ifndef _WIN32_WINNT
13 #  define _WIN32_WINNT 0x0500     /* needed for CreateHardlink() etc. */
14 #endif
15
16 /* Win32 only optimizations for faster building */
17 #ifdef PERL_IS_MINIPERL
18 /* this macro will remove Winsock only on miniperl, PERL_IMPLICIT_SYS and
19  * makedef.pl create dependencies that will keep Winsock linked in even with
20  * this macro defined, even though sockets will be umimplemented from a script
21  * level in full perl
22  */
23 #  define WIN32_NO_SOCKETS
24 /* less I/O calls during each require */
25 #  define PERL_DISABLE_PMC
26
27 /* unnecessery for miniperl to lookup anything from an "installed" perl */
28 #  define WIN32_NO_REGISTRY
29
30 /* allow minitest to work */
31 #  define PERL_TEXTMODE_SCRIPTS
32 #endif
33
34 #ifdef WIN32_NO_SOCKETS
35 #  undef HAS_SOCKET
36 #  undef HAS_GETPROTOBYNAME
37 #  undef HAS_GETPROTOBYNUMBER
38 #  undef HAS_GETPROTOENT
39 #  undef HAS_GETNETBYNAME
40 #  undef HAS_GETNETBYADDR
41 #  undef HAS_GETNETENT
42 #  undef HAS_GETSERVBYNAME
43 #  undef HAS_GETSERVBYPORT
44 #  undef HAS_GETSERVENT
45 #  undef HAS_GETHOSTBYNAME
46 #  undef HAS_GETHOSTBYADDR
47 #  undef HAS_GETHOSTENT
48 #  undef HAS_SELECT
49 #  undef HAS_IOCTL
50 #  undef HAS_NTOHL
51 #  undef HAS_HTONL
52 #  undef HAS_HTONS
53 #  undef HAS_NTOHS
54 #  define WIN32SCK_IS_STDSCK
55 #endif
56
57 #if defined(PERL_IMPLICIT_SYS)
58 #  define DYNAMIC_ENV_FETCH
59 #  define HAS_GETENV_LEN
60 #  define prime_env_iter()
61 #  define WIN32IO_IS_STDIO              /* don't pull in custom stdio layer */
62 #  define WIN32SCK_IS_STDSCK            /* don't pull in custom wsock layer */
63 #endif
64
65 #ifdef __GNUC__
66 #  ifndef __int64               /* some versions seem to #define it already */
67 #    define __int64 long long
68 #  endif
69 #  define Win32_Winsock
70 #endif
71
72
73 /* Define DllExport akin to perl's EXT,
74  * If we are in the DLL then Export the symbol,
75  * otherwise import it.
76  */
77
78 /* now even GCC supports __declspec() */
79 /* miniperl has no reason to export anything */
80 #if defined(PERL_IS_MINIPERL)
81 #  define DllExport
82 #else
83 #  if defined(PERLDLL)
84 #    define DllExport __declspec(dllexport)
85 #  else
86 #    define DllExport __declspec(dllimport)
87 #  endif
88 #endif
89
90 /* The Perl APIs can only be called directly inside the perl5xx.dll.
91  * All other code has to import them.  By declaring them as "dllimport"
92  * we tell the compiler to generate an indirect call instruction and
93  * avoid redirection through a call thunk.
94  *
95  * The XS code in the re extension is special, in that it redefines
96  * core APIs locally, so don't mark them as "dllimport" because GCC
97  * cannot handle this situation.
98  *
99  * Certain old GCCs will not allow the function pointer of dllimport marked
100  * function to be "const". This was fixed later on. Since this is a
101  * deoptimization, target "gcc version 3.4.5 (mingw-vista special r3)" only,
102  * The GCC bug was fixed in GCC patch "varasm.c (initializer_constant_valid_p):
103  * Don't deny DECL_DLLIMPORT_P on functions", which probably was first released
104  * in GCC 4.3.0, this #if can be expanded upto but not including 4.3.0 if more
105  * deployed GCC are found that wont build with the follow error, initializer
106  * element is a PerlIO func exported from perl5xx.dll.
107  *
108  * encoding.xs:610: error: initializer element is not constant
109  * encoding.xs:610: error: (near initialization for `PerlIO_encode.Open')
110  */
111
112 #if (defined(__GNUC__) && defined(__MINGW32__) && \
113      !defined(__MINGW64_VERSION_MAJOR) && !defined(__clang__) && \
114         ((__GNUC__ < 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ <= 5))))
115 /* use default fallbacks from perl.h for this particular GCC */
116 #else
117 #  if !defined(PERLDLL) && !defined(PERL_EXT_RE_BUILD)
118 #    ifdef __cplusplus
119 #      define PERL_CALLCONV extern "C" __declspec(dllimport)
120 #      ifdef _MSC_VER
121 #        define PERL_CALLCONV_NO_RET extern "C" __declspec(dllimport) __declspec(noreturn)
122 #      endif
123 #    else
124 #      define PERL_CALLCONV __declspec(dllimport)
125 #      ifdef _MSC_VER
126 #        define PERL_CALLCONV_NO_RET __declspec(dllimport) __declspec(noreturn)
127 #      endif
128 #    endif
129 #  else /* MSVC noreturn support inside the interp */
130 #    ifdef _MSC_VER
131 #      define PERL_CALLCONV_NO_RET __declspec(noreturn)
132 #    endif
133 #  endif
134 #endif
135
136 #ifdef _MSC_VER
137 #  define PERL_STATIC_NO_RET __declspec(noreturn) static
138 #  define PERL_STATIC_INLINE_NO_RET __declspec(noreturn) PERL_STATIC_INLINE
139 #  define PERL_STATIC_FORCE_INLINE __forceinline static
140 #  define PERL_STATIC_FORCE_INLINE_NO_RET __declspec(noreturn) __forceinline static
141 #endif
142
143 #define  WIN32_LEAN_AND_MEAN
144 #include <windows.h>
145
146 /*
147  * Bug in winbase.h in mingw-w64 4.4.0-1 at least... they
148  * do #define GetEnvironmentStringsA GetEnvironmentStrings and fail
149  * to declare GetEnvironmentStringsA.
150  */
151 #if defined(__MINGW64__) && defined(GetEnvironmentStringsA) && !defined(UNICODE)
152 #ifdef __cplusplus
153 extern "C" {
154 #endif
155 #undef GetEnvironmentStringsA
156 WINBASEAPI LPCH WINAPI GetEnvironmentStringsA(VOID);
157 #define GetEnvironmentStrings GetEnvironmentStringsA
158 #ifdef __cplusplus
159 }
160 #endif
161 #endif
162
163 #ifdef   WIN32_LEAN_AND_MEAN            /* C file is NOT a Perl5 original. */
164 #define  CONTEXT        PERL_CONTEXT    /* Avoid conflict of CONTEXT defs. */
165 #endif /*WIN32_LEAN_AND_MEAN */
166
167 #ifndef TLS_OUT_OF_INDEXES
168 #define TLS_OUT_OF_INDEXES (DWORD)0xFFFFFFFF
169 #endif
170
171 #include <dirent.h>
172 #include <io.h>
173 #include <process.h>
174 #include <stdio.h>
175 #include <direct.h>
176 #include <stdlib.h>
177 #include <stddef.h>
178 #include <fcntl.h>
179 #ifndef EXT
180 #include "EXTERN.h"
181 #endif
182
183 struct tms {
184         long    tms_utime;
185         long    tms_stime;
186         long    tms_cutime;
187         long    tms_cstime;
188 };
189
190 #ifndef SYS_NMLN
191 #define SYS_NMLN        257
192 #endif
193
194 struct utsname {
195     char sysname[SYS_NMLN];
196     char nodename[SYS_NMLN];
197     char release[SYS_NMLN];
198     char version[SYS_NMLN];
199     char machine[SYS_NMLN];
200 };
201
202 #ifndef START_EXTERN_C
203 #undef EXTERN_C
204 #ifdef __cplusplus
205 #  define START_EXTERN_C extern "C" {
206 #  define END_EXTERN_C }
207 #  define EXTERN_C extern "C"
208 #else
209 #  define START_EXTERN_C
210 #  define END_EXTERN_C
211 #  define EXTERN_C
212 #endif
213 #endif
214
215 #define  DOSISH         1               /* no escaping our roots */
216 #define  OP_BINARY      O_BINARY        /* mistake in in pp_sys.c? */
217
218 /* read() and write() aren't transparent for socket handles */
219 #ifndef WIN32_NO_SOCKETS
220 #  define PERL_SOCK_SYSREAD_IS_RECV
221 #  define PERL_SOCK_SYSWRITE_IS_SEND
222 #endif
223
224 #ifdef WIN32_NO_REGISTRY
225 /* the last _ in WIN32_NO_REGISTRY_M_ is like the _ in aTHX_ */
226 #  define WIN32_NO_REGISTRY_M_(x)
227 #else
228 #  define WIN32_NO_REGISTRY_M_(x) x,
229 #endif
230
231 #define ENV_IS_CASELESS
232
233 #define PIPESOCK_MODE   "b"             /* pipes, sockets default to binmode */
234
235 /* access() mode bits */
236 #ifndef R_OK
237 #  define       R_OK    4
238 #  define       W_OK    2
239 #  define       X_OK    1
240 #  define       F_OK    0
241 #endif
242
243 /* for waitpid() */
244 #ifndef WNOHANG
245 #  define WNOHANG       1
246 #endif
247
248 #define PERL_GET_CONTEXT_DEFINED
249
250 /* Compiler-specific stuff. */
251
252 /* VC uses non-standard way to determine the size and alignment if bit-fields */
253 /* MinGW will compile with -mms-bitfields, so should use the same types */
254 #define PERL_BITFIELD8  U8
255 #define PERL_BITFIELD16 U16
256 #define PERL_BITFIELD32 U32
257
258 #ifdef _MSC_VER                 /* Microsoft Visual C++ */
259
260 typedef long            uid_t;
261 typedef long            gid_t;
262 typedef unsigned short  mode_t;
263
264 #if _MSC_VER < 1800
265 #define isnan           _isnan  /* Defined already in VC++ 12.0 */
266 #endif
267 #define snprintf        _snprintf
268 #define vsnprintf       _vsnprintf
269
270 /* on VS2003, msvcrt.lib is missing these symbols */
271 #if _MSC_VER >= 1300 && _MSC_VER < 1400
272 #  pragma intrinsic(_rotl64,_rotr64)
273 #endif
274
275 MSVC_DIAG_IGNORE(4756 4056)
276 PERL_STATIC_INLINE
277 double S_Infinity() {
278     /* this is a real C literal which can get further constant folded
279        unlike using HUGE_VAL/_HUGE which are data symbol imports from the CRT
280        and therefore can not by folded by VC, an example of constant
281        folding INF is creating -INF */
282     return (DBL_MAX+DBL_MAX);
283 }
284 MSVC_DIAG_RESTORE
285
286 #define NV_INF S_Infinity()
287
288 /* selectany allows duplicate and unused data symbols to be removed by
289    VC linker, if this were static, each translation unit will have its own,
290    usually unused __PL_nan_u, if this were plain extern it will cause link
291    to fail due to multiple definitions, since we dont know if we are being
292    compiled as static or DLL XS, selectany simply always works, the cost of
293    importing __PL_nan_u across DLL boundaries in size in the importing DLL
294    will be more than the 8 bytes it will take up being in each XS DLL if
295    that DLL actually uses __PL_nan_u */
296 extern const __declspec(selectany) union { unsigned __int64 __q; double __d; }
297 __PL_nan_u = { 0x7FF8000000000000UI64 };
298 #define NV_NAN ((NV)__PL_nan_u.__d)
299
300 /* The CRT was rewritten in VS2015. */
301 #if _MSC_VER >= 1900
302
303 /* No longer declared in stdio.h */
304 EXTERN_C char *gets(char* buffer);
305
306 #define tzname _tzname
307
308 /* From corecrt_internal_stdio.h: */
309 typedef struct
310 {
311     union
312     {
313         FILE  _public_file;
314         char* _ptr;
315     };
316
317     char*            _base;
318     int              _cnt;
319     long             _flags;
320     long             _file;
321     int              _charbuf;
322     int              _bufsiz;
323     char*            _tmpfname;
324     CRITICAL_SECTION _lock;
325 } __crt_stdio_stream_data;
326
327 #define PERLIO_FILE_flag_RD 0x0001 /* _IOREAD   */
328 #define PERLIO_FILE_flag_WR 0x0002 /* _IOWRITE  */
329 #define PERLIO_FILE_flag_RW 0x0004 /* _IOUPDATE */
330 #define PERLIO_FILE_ptr(f)  (((__crt_stdio_stream_data*)(f))->_ptr)
331 #define PERLIO_FILE_base(f) (((__crt_stdio_stream_data*)(f))->_base)
332 #define PERLIO_FILE_cnt(f)  (((__crt_stdio_stream_data*)(f))->_cnt)
333 #define PERLIO_FILE_flag(f) ((int)(((__crt_stdio_stream_data*)(f))->_flags))
334 #define PERLIO_FILE_file(f) (*(int*)(&((__crt_stdio_stream_data*)(f))->_file))
335
336 #endif
337
338 #endif /* _MSC_VER */
339
340 #if (!defined(_MSC_VER)) || (defined(_MSC_VER) && _MSC_VER < 1900)
341
342 /* Note: PERLIO_FILE_ptr/base/cnt are not actually used for GCC or <VS2015
343  * since FILE_ptr/base/cnt do the same thing anyway but it doesn't hurt to
344  * define them all here for completeness. */
345 #define PERLIO_FILE_flag_RD _IOREAD /* 0x001 */
346 #define PERLIO_FILE_flag_WR _IOWRT  /* 0x002 */
347 #define PERLIO_FILE_flag_RW _IORW   /* 0x080 */
348 #define PERLIO_FILE_ptr(f)  ((f)->_ptr)
349 #define PERLIO_FILE_base(f) ((f)->_base)
350 #define PERLIO_FILE_cnt(f)  ((f)->_cnt)
351 #define PERLIO_FILE_flag(f) ((f)->_flag)
352 #define PERLIO_FILE_file(f) ((f)->_file)
353
354 #endif
355
356 #ifdef __MINGW32__              /* Minimal Gnu-Win32 */
357
358 typedef long            uid_t;
359 typedef long            gid_t;
360 #ifndef _environ
361 #define _environ        environ
362 #endif
363 #define flushall        _flushall
364 #define fcloseall       _fcloseall
365 #ifndef isnan
366 #define isnan           _isnan  /* ...same libraries as MSVC */
367 #endif
368
369 #ifndef _O_NOINHERIT
370 #  define _O_NOINHERIT  0x0080
371 #  ifndef _NO_OLDNAMES
372 #    define O_NOINHERIT _O_NOINHERIT
373 #  endif
374 #endif
375
376 /* <stdint.h>, pulled in by <io.h> as of mingw-runtime-3.3, typedef's
377  * (u)intptr_t but doesn't set the _(U)INTPTR_T_DEFINED defines */
378 #ifdef _STDINT_H
379 #  ifndef _INTPTR_T_DEFINED
380 #    define _INTPTR_T_DEFINED
381 #  endif
382 #  ifndef _UINTPTR_T_DEFINED
383 #    define _UINTPTR_T_DEFINED
384 #  endif
385 #endif
386
387 #ifndef CP_UTF8
388 #  define CP_UTF8       65001
389 #endif
390
391 #endif /* __MINGW32__ */
392
393 #ifndef _INTPTR_T_DEFINED
394 typedef int             intptr_t;
395 #  define _INTPTR_T_DEFINED
396 #endif
397
398 #ifndef _UINTPTR_T_DEFINED
399 typedef unsigned int    uintptr_t;
400 #  define _UINTPTR_T_DEFINED
401 #endif
402
403 START_EXTERN_C
404
405 /* For UNIX compatibility. */
406
407 #ifdef PERL_CORE
408 extern  uid_t   getuid(void);
409 extern  gid_t   getgid(void);
410 extern  uid_t   geteuid(void);
411 extern  gid_t   getegid(void);
412 extern  int     setuid(uid_t uid);
413 extern  int     setgid(gid_t gid);
414 extern  int     kill(int pid, int sig);
415 #ifndef USE_PERL_SBRK
416 extern  void    *sbrk(ptrdiff_t need);
417 #  define HAS_SBRK_PROTO
418 #endif
419 extern  char *  getlogin(void);
420 extern  int     chown(const char *p, uid_t o, gid_t g);
421 #if !defined(__MINGW64_VERSION_MAJOR) || __MINGW64_VERSION_MAJOR < 4
422 extern  int     mkstemp(const char *path);
423 #endif
424 #endif
425
426 #undef   Stat
427 #define  Stat           win32_stat
428
429 #undef   init_os_extras
430 #define  init_os_extras Perl_init_os_extras
431
432 DllExport void          Perl_win32_init(int *argcp, char ***argvp);
433 DllExport void          Perl_win32_term(void);
434 DllExport void          Perl_init_os_extras(void);
435 DllExport void          win32_str_os_error(void *sv, DWORD err);
436 DllExport int           RunPerl(int argc, char **argv, char **env);
437
438 typedef struct {
439     HANDLE      childStdIn;
440     HANDLE      childStdOut;
441     HANDLE      childStdErr;
442     /*
443      * the following correspond to the fields of the same name
444      * in the STARTUPINFO structure. Embedders can use these to
445      * control the spawning process' look.
446      * Example - to hide the window of the spawned process:
447      *    dwFlags = STARTF_USESHOWWINDOW;
448      *    wShowWindow = SW_HIDE;
449      */
450     DWORD       dwFlags;
451     DWORD       dwX;
452     DWORD       dwY;
453     DWORD       dwXSize;
454     DWORD       dwYSize;
455     DWORD       dwXCountChars;
456     DWORD       dwYCountChars;
457     DWORD       dwFillAttribute;
458     WORD        wShowWindow;
459 } child_IO_table;
460
461 DllExport void          win32_get_child_IO(child_IO_table* ptr);
462 DllExport HWND          win32_create_message_window(void);
463 DllExport int           win32_async_check(pTHX);
464
465 extern int              my_fclose(FILE *);
466 extern char *           win32_get_privlib(WIN32_NO_REGISTRY_M_(const char *pl) STRLEN *const len);
467 extern char *           win32_get_sitelib(const char *pl, STRLEN *const len);
468 extern char *           win32_get_vendorlib(const char *pl, STRLEN *const len);
469
470 #ifdef PERL_IMPLICIT_SYS
471 extern void             win32_delete_internal_host(void *h);
472 #endif
473
474 extern int              win32_get_errno(int err);
475
476 extern const char * const               staticlinkmodules[];
477
478 END_EXTERN_C
479
480 typedef  char *         caddr_t;        /* In malloc.c (core address). */
481
482 /*
483  * handle socket stuff, assuming socket is always available
484  */
485 #include <sys/socket.h>
486 #include <netdb.h>
487
488 #ifdef MYMALLOC
489 #define EMBEDMYMALLOC   /**/
490 /* #define USE_PERL_SBRK        / **/
491 /* #define PERL_SBRK_VIA_MALLOC / **/
492 #endif
493
494 #ifdef PERL_TEXTMODE_SCRIPTS
495 #  define PERL_SCRIPT_MODE              "r"
496 #else
497 #  define PERL_SCRIPT_MODE              "rb"
498 #endif
499
500 /*
501  * Now Win32 specific per-thread data stuff
502  */
503
504 /* Leave the first couple ids after WM_USER unused because they
505  * might be used by an embedding application, and on Windows
506  * version before 2000 we might end up eating those messages
507  * if they were not meant for us.
508  */
509 #define WM_USER_MIN     (WM_USER+30)
510 #define WM_USER_MESSAGE (WM_USER_MIN)
511 #define WM_USER_KILL    (WM_USER_MIN+1)
512 #define WM_USER_MAX     (WM_USER_MIN+1)
513
514 struct thread_intern {
515     /* XXX can probably use one buffer instead of several */
516     char                Wstrerror_buffer[512];
517     struct servent      Wservent;
518     char                Wgetlogin_buffer[128];
519     int                 Winit_socktype;
520     char                Wcrypt_buffer[30];
521 #    ifdef USE_RTL_THREAD_API
522     void *              retv;   /* slot for thread return value */
523 #    endif
524     BOOL               Wuse_showwindow;
525     WORD               Wshowwindow;
526 };
527
528 #define HAVE_INTERP_INTERN
529 typedef struct {
530     long        num;
531     DWORD       pids[MAXIMUM_WAIT_OBJECTS];
532     HANDLE      handles[MAXIMUM_WAIT_OBJECTS];
533 } child_tab;
534
535 #ifdef USE_ITHREADS
536 typedef struct {
537     long        num;
538     DWORD       pids[MAXIMUM_WAIT_OBJECTS];
539     HANDLE      handles[MAXIMUM_WAIT_OBJECTS];
540     HWND        message_hwnds[MAXIMUM_WAIT_OBJECTS];
541     char        sigterm[MAXIMUM_WAIT_OBJECTS];
542 } pseudo_child_tab;
543 #endif
544
545 #ifndef Sighandler_t
546 typedef Signal_t (*Sighandler_t) (int);
547 #define Sighandler_t    Sighandler_t
548 #endif
549
550 struct interp_intern {
551     char *      perlshell_tokens;
552     char **     perlshell_vec;
553     long        perlshell_items;
554     struct av * fdpid;
555     child_tab * children;
556 #ifdef USE_ITHREADS
557     DWORD       pseudo_id;
558     pseudo_child_tab * pseudo_children;
559 #endif
560     void *      internal_host;
561     struct thread_intern        thr_intern;
562     HWND        message_hwnd;
563     UINT        timerid;
564     unsigned    poll_count;
565     Sighandler_t sigtable[SIG_SIZE];
566     bool sloppystat;
567 };
568
569 #define WIN32_POLL_INTERVAL 32768
570 #define PERL_ASYNC_CHECK() if (w32_do_async || PL_sig_pending) win32_async_check(aTHX)
571
572 #define w32_perlshell_tokens    (PL_sys_intern.perlshell_tokens)
573 #define w32_perlshell_vec       (PL_sys_intern.perlshell_vec)
574 #define w32_perlshell_items     (PL_sys_intern.perlshell_items)
575 #define w32_fdpid               (PL_sys_intern.fdpid)
576 #define w32_children            (PL_sys_intern.children)
577 #define w32_num_children        (w32_children->num)
578 #define w32_child_pids          (w32_children->pids)
579 #define w32_child_handles       (w32_children->handles)
580 #define w32_pseudo_id           (PL_sys_intern.pseudo_id)
581 #define w32_pseudo_children     (PL_sys_intern.pseudo_children)
582 #define w32_num_pseudo_children         (w32_pseudo_children->num)
583 #define w32_pseudo_child_pids           (w32_pseudo_children->pids)
584 #define w32_pseudo_child_handles        (w32_pseudo_children->handles)
585 #define w32_pseudo_child_message_hwnds  (w32_pseudo_children->message_hwnds)
586 #define w32_pseudo_child_sigterm        (w32_pseudo_children->sigterm)
587 #define w32_internal_host               (PL_sys_intern.internal_host)
588 #define w32_timerid                     (PL_sys_intern.timerid)
589 #define w32_message_hwnd                (PL_sys_intern.message_hwnd)
590 #define w32_sighandler                  (PL_sys_intern.sigtable)
591 #define w32_poll_count                  (PL_sys_intern.poll_count)
592 #define w32_do_async                    (w32_poll_count++ > WIN32_POLL_INTERVAL)
593 #define w32_strerror_buffer     (PL_sys_intern.thr_intern.Wstrerror_buffer)
594 #define w32_getlogin_buffer     (PL_sys_intern.thr_intern.Wgetlogin_buffer)
595 #define w32_crypt_buffer        (PL_sys_intern.thr_intern.Wcrypt_buffer)
596 #define w32_servent             (PL_sys_intern.thr_intern.Wservent)
597 #define w32_init_socktype       (PL_sys_intern.thr_intern.Winit_socktype)
598 #define w32_use_showwindow      (PL_sys_intern.thr_intern.Wuse_showwindow)
599 #define w32_showwindow  (PL_sys_intern.thr_intern.Wshowwindow)
600 #define w32_sloppystat  (PL_sys_intern.sloppystat)
601
602 #ifdef USE_ITHREADS
603 void win32_wait_for_children(pTHX);
604 #  define PERL_WAIT_FOR_CHILDREN win32_wait_for_children(aTHX)
605 #endif
606
607 /* The following ioinfo struct manipulations had been removed but were
608  * reinstated to fix RT#120091/118059. However, they do not work with
609  * the rewritten CRT in VS2015 so they are removed once again for VS2015
610  * onwards, which will therefore suffer from the reintroduction of the
611  * close socket bug. */
612 #if (!defined(_MSC_VER)) || (defined(_MSC_VER) && _MSC_VER < 1900)
613
614 #ifdef PERL_CORE
615
616 /* C doesn't like repeat struct definitions */
617 #if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION>=3)
618 #  undef _CRTIMP
619 #endif
620 #ifndef _CRTIMP
621 #  define _CRTIMP __declspec(dllimport)
622 #endif
623
624
625 /* VS2005 has multiple ioinfo struct definitions through VS2005's release life
626  * VS2008-2012 have been stable but do not assume future VSs will have the
627  * same ioinfo struct, just because past struct stability. If research is done
628  * on the CRTs of future VSs, the version check can be bumped up so the newer
629  * VS uses a fixed ioinfo size. (Actually, only VS2013 (_MSC_VER 1800) hasn't
630  * been looked at; after that we cannot use the ioinfo struct anyway (see the
631  * #if above).)
632  */
633 #if ! (_MSC_VER < 1400 || (_MSC_VER >= 1500 && _MSC_VER <= 1700) \
634   || defined(__MINGW32__))
635 /* size of ioinfo struct is determined at runtime */
636 #  define WIN32_DYN_IOINFO_SIZE
637 #endif
638
639 #ifndef WIN32_DYN_IOINFO_SIZE
640 /*
641  * Control structure for lowio file handles
642  */
643 typedef struct {
644     intptr_t osfhnd;/* underlying OS file HANDLE */
645     char osfile;    /* attributes of file (e.g., open in text mode?) */
646     char pipech;    /* one char buffer for handles opened on pipes */
647     int lockinitflag;
648     CRITICAL_SECTION lock;
649 /* this struct definition breaks ABI compatibility with
650  * not using, cl.exe's native VS version specitfic CRT. */
651 #  if _MSC_VER >= 1400 && _MSC_VER < 1500
652 #    error "This ioinfo struct is incomplete for Visual C 2005"
653 #  endif
654 /* VS2005 CRT has at least 3 different definitions of this struct based on the
655  * CRT DLL's build number. */
656 #  if _MSC_VER >= 1500
657 #    ifndef _SAFECRT_IMPL
658     /* Not used in the safecrt downlevel. We do not define them, so we cannot
659      * use them accidentally */
660     char textmode : 7;/* __IOINFO_TM_ANSI or __IOINFO_TM_UTF8 or __IOINFO_TM_UTF16LE */
661     char unicode : 1; /* Was the file opened as unicode? */
662     char pipech2[2];  /* 2 more peak ahead chars for UNICODE mode */
663     __int64 startpos;      /* File position that matches buffer start */
664     BOOL utf8translations; /* Buffer contains translations other than CRLF*/
665     char dbcsBuffer;       /* Buffer for the lead byte of dbcs when converting from dbcs to unicode */
666     BOOL dbcsBufferUsed;   /* Bool for the lead byte buffer is used or not */
667 #    endif
668 #  endif
669 } ioinfo;
670 #else
671 typedef intptr_t ioinfo;
672 #endif
673
674 /*
675  * Array of arrays of control structures for lowio files.
676  */
677 EXTERN_C _CRTIMP ioinfo* __pioinfo[];
678
679 /*
680  * Definition of IOINFO_L2E, the log base 2 of the number of elements in each
681  * array of ioinfo structs.
682  */
683 #define IOINFO_L2E          5
684
685 /*
686  * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array
687  */
688 #define IOINFO_ARRAY_ELTS   (1 << IOINFO_L2E)
689
690 /*
691  * Access macros for getting at an ioinfo struct and its fields from a
692  * file handle
693  */
694 #ifdef WIN32_DYN_IOINFO_SIZE
695 #  define _pioinfo(i) ((intptr_t *) \
696      (((Size_t)__pioinfo[(i) >> IOINFO_L2E])/* * to head of array ioinfo [] */\
697       /* offset to the head of a particular ioinfo struct */ \
698       + (((i) & (IOINFO_ARRAY_ELTS - 1)) * w32_ioinfo_size)) \
699    )
700 /* first slice of ioinfo is always the OS handle */
701 #  define _osfhnd(i)  (*(_pioinfo(i)))
702 #else
703 #  define _pioinfo(i) (__pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)))
704 #  define _osfhnd(i)  (_pioinfo(i)->osfhnd)
705 #endif
706
707 /* since we are not doing a dup2(), this works fine */
708 #define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = (intptr_t)osfh)
709
710 #endif /* PERL_CORE */
711
712 #endif /* !defined(_MSC_VER) || _MSC_VER<1900 */
713
714 /* IO.xs and POSIX.xs define PERLIO_NOT_STDIO to 1 */
715 #if defined(PERL_EXT_IO) || defined(PERL_EXT_POSIX)
716 #undef  PERLIO_NOT_STDIO
717 #endif
718 #define PERLIO_NOT_STDIO 0
719
720 #define EXEC_ARGV_CAST(x) ((const char *const *) x)
721
722 DllExport void *win32_signal_context(void);
723 #define PERL_GET_SIG_CONTEXT win32_signal_context()
724
725 #define Win_GetModuleHandle   GetModuleHandle
726 #define Win_GetProcAddress    GetProcAddress
727 #define Win_GetModuleFileName GetModuleFileName
728 #define Win_CreateSemaphore   CreateSemaphore
729
730 #if defined(PERL_CORE) && !defined(O_ACCMODE)
731 #  define O_ACCMODE (O_RDWR | O_WRONLY | O_RDONLY)
732 #endif
733
734 /* ucrt at least seems to allocate a whole bit per type,
735    just mask off one bit from the mask for our symlink
736    file type.
737 */
738 #define _S_IFLNK ((unsigned)(_S_IFMT ^ (_S_IFMT & -_S_IFMT)))
739 #undef S_ISLNK
740 #define S_ISLNK(mode) (((mode) & _S_IFMT) == _S_IFLNK)
741
742 /*
743
744 The default CRT struct stat uses unsigned short for st_dev and st_ino
745 which obviously isn't enough, so we define our own structure.
746
747  */
748
749 typedef DWORD Dev_t;
750 typedef unsigned __int64 Ino_t;
751
752 struct w32_stat {
753     Dev_t st_dev;
754     Ino_t st_ino;
755     unsigned short st_mode;
756     DWORD st_nlink;
757     short st_uid;
758     short st_gid;
759     Dev_t st_rdev;
760     Off_t st_size;
761     time_t st_atime;
762     time_t st_mtime;
763     time_t st_ctime;
764 };
765
766 #endif /* _INC_WIN32_PERL5 */
767