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