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