1 /* WIN32.H 2 * 3 * (c) 1995 Microsoft Corporation. All rights reserved. 4 * Developed by hip communications inc., http://info.hip.com/info/ 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 0x0400 /* needed for TryEnterCriticalSection() etc. */ 14 #endif 15 16 #if defined(PERL_OBJECT) || defined(PERL_IMPLICIT_SYS) || defined(PERL_CAPI) 17 # define DYNAMIC_ENV_FETCH 18 # define ENV_HV_NAME "___ENV_HV_NAME___" 19 # define HAS_GETENV_LEN 20 # define prime_env_iter() 21 # define WIN32IO_IS_STDIO /* don't pull in custom stdio layer */ 22 # define WIN32SCK_IS_STDSCK /* don't pull in custom wsock layer */ 23 # ifdef PERL_GLOBAL_STRUCT 24 # error PERL_GLOBAL_STRUCT cannot be defined with PERL_IMPLICIT_SYS 25 # endif 26 # define win32_get_privlib PerlEnv_lib_path 27 # define win32_get_sitelib PerlEnv_sitelib_path 28 # define win32_get_vendorlib PerlEnv_vendorlib_path 29 #endif 30 31 #ifdef __GNUC__ 32 # ifndef __int64 /* some versions seem to #define it already */ 33 # define __int64 long long 34 # endif 35 # define Win32_Winsock 36 #endif 37 38 /* Define DllExport akin to perl's EXT, 39 * If we are in the DLL or mimicing the DLL for Win95 work round 40 * then Export the symbol, 41 * otherwise import it. 42 */ 43 44 /* now even GCC supports __declspec() */ 45 46 #if defined(PERL_OBJECT) 47 #define DllExport 48 #else 49 #if defined(PERLDLL) || defined(WIN95FIX) 50 #define DllExport 51 /*#define DllExport __declspec(dllexport)*/ /* noises with VC5+sp3 */ 52 #else 53 #define DllExport __declspec(dllimport) 54 #endif 55 #endif 56 57 #define WIN32_LEAN_AND_MEAN 58 #include <windows.h> 59 60 #ifdef WIN32_LEAN_AND_MEAN /* C file is NOT a Perl5 original. */ 61 #define CONTEXT PERL_CONTEXT /* Avoid conflict of CONTEXT defs. */ 62 #endif /*WIN32_LEAN_AND_MEAN */ 63 64 #ifndef TLS_OUT_OF_INDEXES 65 #define TLS_OUT_OF_INDEXES (DWORD)0xFFFFFFFF 66 #endif 67 68 #include <dirent.h> 69 #include <io.h> 70 #include <process.h> 71 #include <stdio.h> 72 #include <direct.h> 73 #include <stdlib.h> 74 #include <fcntl.h> 75 #ifndef EXT 76 #include "EXTERN.h" 77 #endif 78 79 struct tms { 80 long tms_utime; 81 long tms_stime; 82 long tms_cutime; 83 long tms_cstime; 84 }; 85 86 #ifndef SYS_NMLN 87 #define SYS_NMLN 257 88 #endif 89 90 struct utsname { 91 char sysname[SYS_NMLN]; 92 char nodename[SYS_NMLN]; 93 char release[SYS_NMLN]; 94 char version[SYS_NMLN]; 95 char machine[SYS_NMLN]; 96 }; 97 98 #ifndef START_EXTERN_C 99 #undef EXTERN_C 100 #ifdef __cplusplus 101 # define START_EXTERN_C extern "C" { 102 # define END_EXTERN_C } 103 # define EXTERN_C extern "C" 104 #else 105 # define START_EXTERN_C 106 # define END_EXTERN_C 107 # define EXTERN_C 108 #endif 109 #endif 110 111 #define STANDARD_C 1 112 #define DOSISH 1 /* no escaping our roots */ 113 #define OP_BINARY O_BINARY /* mistake in in pp_sys.c? */ 114 115 /* Define USE_SOCKETS_AS_HANDLES to enable emulation of windows sockets as 116 * real filehandles. XXX Should always be defined (the other version is untested) */ 117 #define USE_SOCKETS_AS_HANDLES 118 119 /* read() and write() aren't transparent for socket handles */ 120 #define PERL_SOCK_SYSREAD_IS_RECV 121 #define PERL_SOCK_SYSWRITE_IS_SEND 122 123 #define PERL_NO_FORCE_LINK /* no need for PL_force_link_funcs */ 124 125 /* Define USE_FIXED_OSFHANDLE to fix MSVCRT's _open_osfhandle() on W95. 126 It now uses some black magic to work seamlessly with the DLL CRT and 127 works with MSVC++ 4.0+ or GCC/Mingw32 128 -- BKS 1-24-2000 */ 129 #if (defined(_M_IX86) && _MSC_VER >= 1000) || defined(__MINGW32__) 130 #define USE_FIXED_OSFHANDLE 131 #endif 132 133 /* Define PERL_WIN32_SOCK_DLOAD to have Perl dynamically load the winsock 134 DLL when needed. Don't use if your compiler supports delayloading (ie, VC++ 6.0) 135 -- BKS 5-29-2000 */ 136 #if !(defined(_M_IX86) && _MSC_VER >= 1200) 137 #define PERL_WIN32_SOCK_DLOAD 138 #endif 139 #define ENV_IS_CASELESS 140 141 #ifndef VER_PLATFORM_WIN32_WINDOWS /* VC-2.0 headers don't have this */ 142 #define VER_PLATFORM_WIN32_WINDOWS 1 143 #endif 144 145 #ifndef FILE_SHARE_DELETE /* VC-4.0 headers don't have this */ 146 #define FILE_SHARE_DELETE 0x00000004 147 #endif 148 149 /* access() mode bits */ 150 #ifndef R_OK 151 # define R_OK 4 152 # define W_OK 2 153 # define X_OK 1 154 # define F_OK 0 155 #endif 156 157 /* for waitpid() */ 158 #ifndef WNOHANG 159 # define WNOHANG 1 160 #endif 161 162 #define PERL_GET_CONTEXT_DEFINED 163 164 /* Compiler-specific stuff. */ 165 166 #ifdef __BORLANDC__ /* Borland C++ */ 167 168 #if (__BORLANDC__ <= 0x520) 169 #define _access access 170 #define _chdir chdir 171 #endif 172 173 #define _getpid getpid 174 #define wcsicmp _wcsicmp 175 #include <sys/types.h> 176 177 #ifndef DllMain 178 #define DllMain DllEntryPoint 179 #endif 180 181 #pragma warn -ccc /* "condition is always true/false" */ 182 #pragma warn -rch /* "unreachable code" */ 183 #pragma warn -sig /* "conversion may lose significant digits" */ 184 #pragma warn -pia /* "possibly incorrect assignment" */ 185 #pragma warn -par /* "parameter 'foo' is never used" */ 186 #pragma warn -aus /* "'foo' is assigned a value that is never used" */ 187 #pragma warn -use /* "'foo' is declared but never used" */ 188 #pragma warn -csu /* "comparing signed and unsigned values" */ 189 190 /* Borland is picky about a bare member function name used as its ptr */ 191 #ifdef PERL_OBJECT 192 # define MEMBER_TO_FPTR(name) &(name) 193 #endif 194 195 /* Borland C thinks that a pointer to a member variable is 12 bytes in size. */ 196 #define PERL_MEMBER_PTR_SIZE 12 197 198 #define isnan _isnan 199 200 #endif 201 202 #ifdef _MSC_VER /* Microsoft Visual C++ */ 203 204 typedef long uid_t; 205 typedef long gid_t; 206 typedef unsigned short mode_t; 207 #pragma warning(disable: 4018 4035 4101 4102 4244 4245 4761) 208 209 /* Visual C thinks that a pointer to a member variable is 16 bytes in size. */ 210 #define PERL_MEMBER_PTR_SIZE 16 211 212 #define isnan _isnan 213 214 #endif /* _MSC_VER */ 215 216 #ifdef __MINGW32__ /* Minimal Gnu-Win32 */ 217 218 typedef long uid_t; 219 typedef long gid_t; 220 #ifndef _environ 221 #define _environ environ 222 #endif 223 #define flushall _flushall 224 #define fcloseall _fcloseall 225 #define isnan _isnan /* ...same libraries as MSVC */ 226 227 #ifdef PERL_OBJECT 228 # define MEMBER_TO_FPTR(name) &(name) 229 #endif 230 231 #ifndef _O_NOINHERIT 232 # define _O_NOINHERIT 0x0080 233 # ifndef _NO_OLDNAMES 234 # define O_NOINHERIT _O_NOINHERIT 235 # endif 236 #endif 237 238 #endif /* __MINGW32__ */ 239 240 /* both GCC/Mingw32 and MSVC++ 4.0 are missing this, so we put it here */ 241 #ifndef CP_UTF8 242 # define CP_UTF8 65001 243 #endif 244 245 /* compatibility stuff for other compilers goes here */ 246 247 248 #if !defined(PERL_OBJECT) && defined(PERL_CAPI) && defined(PERL_MEMBER_PTR_SIZE) 249 # define STRUCT_MGVTBL_DEFINITION \ 250 struct mgvtbl { \ 251 union { \ 252 int (CPERLscope(*svt_get))(pTHX_ SV *sv, MAGIC* mg); \ 253 char handle_VC_problem1[PERL_MEMBER_PTR_SIZE]; \ 254 }; \ 255 union { \ 256 int (CPERLscope(*svt_set))(pTHX_ SV *sv, MAGIC* mg); \ 257 char handle_VC_problem2[PERL_MEMBER_PTR_SIZE]; \ 258 }; \ 259 union { \ 260 U32 (CPERLscope(*svt_len))(pTHX_ SV *sv, MAGIC* mg); \ 261 char handle_VC_problem3[PERL_MEMBER_PTR_SIZE]; \ 262 }; \ 263 union { \ 264 int (CPERLscope(*svt_clear))(pTHX_ SV *sv, MAGIC* mg); \ 265 char handle_VC_problem4[PERL_MEMBER_PTR_SIZE]; \ 266 }; \ 267 union { \ 268 int (CPERLscope(*svt_free))(pTHX_ SV *sv, MAGIC* mg); \ 269 char handle_VC_problem5[PERL_MEMBER_PTR_SIZE]; \ 270 }; \ 271 } 272 273 # define BASEOP_DEFINITION \ 274 OP* op_next; \ 275 OP* op_sibling; \ 276 OP* (CPERLscope(*op_ppaddr))(pTHX); \ 277 char handle_VC_problem[PERL_MEMBER_PTR_SIZE-sizeof(OP*)]; \ 278 PADOFFSET op_targ; \ 279 OPCODE op_type; \ 280 U16 op_seq; \ 281 U8 op_flags; \ 282 U8 op_private; 283 284 #endif /* !PERL_OBJECT && PERL_CAPI && PERL_MEMBER_PTR_SIZE */ 285 286 287 START_EXTERN_C 288 289 /* For UNIX compatibility. */ 290 291 extern uid_t getuid(void); 292 extern gid_t getgid(void); 293 extern uid_t geteuid(void); 294 extern gid_t getegid(void); 295 extern int setuid(uid_t uid); 296 extern int setgid(gid_t gid); 297 extern int kill(int pid, int sig); 298 extern void *sbrk(int need); 299 extern char * getlogin(void); 300 extern int chown(const char *p, uid_t o, gid_t g); 301 302 #undef Stat 303 #define Stat win32_stat 304 305 #undef init_os_extras 306 #define init_os_extras Perl_init_os_extras 307 308 DllExport void Perl_win32_init(int *argcp, char ***argvp); 309 DllExport void Perl_init_os_extras(void); 310 DllExport void win32_str_os_error(void *sv, DWORD err); 311 DllExport int RunPerl(int argc, char **argv, char **env); 312 313 typedef struct { 314 HANDLE childStdIn; 315 HANDLE childStdOut; 316 HANDLE childStdErr; 317 /* 318 * the following correspond to the fields of the same name 319 * in the STARTUPINFO structure. Embedders can use these to 320 * control the spawning process' look. 321 * Example - to hide the window of the spawned process: 322 * dwFlags = STARTF_USESHOWWINDOW; 323 * wShowWindow = SW_HIDE; 324 */ 325 DWORD dwFlags; 326 DWORD dwX; 327 DWORD dwY; 328 DWORD dwXSize; 329 DWORD dwYSize; 330 DWORD dwXCountChars; 331 DWORD dwYCountChars; 332 DWORD dwFillAttribute; 333 WORD wShowWindow; 334 } child_IO_table; 335 336 DllExport void win32_get_child_IO(child_IO_table* ptr); 337 338 #ifndef USE_SOCKETS_AS_HANDLES 339 extern FILE * my_fdopen(int, char *); 340 #endif 341 extern int my_fclose(FILE *); 342 extern int my_fstat(int fd, struct stat *sbufptr); 343 extern int do_aspawn(void *really, void **mark, void **sp); 344 extern int do_spawn(char *cmd); 345 extern int do_spawn_nowait(char *cmd); 346 extern char * win32_get_privlib(const char *pl); 347 extern char * win32_get_sitelib(const char *pl); 348 extern char * win32_get_vendorlib(const char *pl); 349 extern int IsWin95(void); 350 extern int IsWinNT(void); 351 extern void win32_argv2utf8(int argc, char** argv); 352 353 #ifdef PERL_IMPLICIT_SYS 354 extern void win32_delete_internal_host(void *h); 355 #endif 356 357 extern char * staticlinkmodules[]; 358 359 END_EXTERN_C 360 361 typedef char * caddr_t; /* In malloc.c (core address). */ 362 363 /* 364 * handle socket stuff, assuming socket is always available 365 */ 366 #include <sys/socket.h> 367 #include <netdb.h> 368 369 #ifdef MYMALLOC 370 #define EMBEDMYMALLOC /**/ 371 /* #define USE_PERL_SBRK /**/ 372 /* #define PERL_SBRK_VIA_MALLOC /**/ 373 #endif 374 375 #if defined(PERLDLL) && !defined(PERL_CORE) 376 #define PERL_CORE 377 #endif 378 379 #ifdef PERL_TEXTMODE_SCRIPTS 380 # define PERL_SCRIPT_MODE "r" 381 #else 382 # define PERL_SCRIPT_MODE "rb" 383 #endif 384 385 /* 386 * Now Win32 specific per-thread data stuff 387 */ 388 389 struct thread_intern { 390 /* XXX can probably use one buffer instead of several */ 391 char Wstrerror_buffer[512]; 392 struct servent Wservent; 393 char Wgetlogin_buffer[128]; 394 # ifdef USE_SOCKETS_AS_HANDLES 395 int Winit_socktype; 396 # endif 397 # ifdef HAVE_DES_FCRYPT 398 char Wcrypt_buffer[30]; 399 # endif 400 # ifdef USE_RTL_THREAD_API 401 void * retv; /* slot for thread return value */ 402 # endif 403 }; 404 405 #ifdef USE_THREADS 406 # ifndef USE_DECLSPEC_THREAD 407 # define HAVE_THREAD_INTERN 408 # endif /* !USE_DECLSPEC_THREAD */ 409 #endif /* USE_THREADS */ 410 411 #define HAVE_INTERP_INTERN 412 typedef struct { 413 long num; 414 DWORD pids[MAXIMUM_WAIT_OBJECTS]; 415 HANDLE handles[MAXIMUM_WAIT_OBJECTS]; 416 } child_tab; 417 418 struct interp_intern { 419 char * perlshell_tokens; 420 char ** perlshell_vec; 421 long perlshell_items; 422 struct av * fdpid; 423 child_tab * children; 424 #ifdef USE_ITHREADS 425 DWORD pseudo_id; 426 child_tab * pseudo_children; 427 #endif 428 void * internal_host; 429 #ifndef USE_THREADS 430 struct thread_intern thr_intern; 431 #endif 432 }; 433 434 435 #define w32_perlshell_tokens (PL_sys_intern.perlshell_tokens) 436 #define w32_perlshell_vec (PL_sys_intern.perlshell_vec) 437 #define w32_perlshell_items (PL_sys_intern.perlshell_items) 438 #define w32_fdpid (PL_sys_intern.fdpid) 439 #define w32_children (PL_sys_intern.children) 440 #define w32_num_children (w32_children->num) 441 #define w32_child_pids (w32_children->pids) 442 #define w32_child_handles (w32_children->handles) 443 #define w32_pseudo_id (PL_sys_intern.pseudo_id) 444 #define w32_pseudo_children (PL_sys_intern.pseudo_children) 445 #define w32_num_pseudo_children (w32_pseudo_children->num) 446 #define w32_pseudo_child_pids (w32_pseudo_children->pids) 447 #define w32_pseudo_child_handles (w32_pseudo_children->handles) 448 #define w32_internal_host (PL_sys_intern.internal_host) 449 #ifdef USE_THREADS 450 # define w32_strerror_buffer (thr->i.Wstrerror_buffer) 451 # define w32_getlogin_buffer (thr->i.Wgetlogin_buffer) 452 # define w32_crypt_buffer (thr->i.Wcrypt_buffer) 453 # define w32_servent (thr->i.Wservent) 454 # define w32_init_socktype (thr->i.Winit_socktype) 455 #else 456 # define w32_strerror_buffer (PL_sys_intern.thr_intern.Wstrerror_buffer) 457 # define w32_getlogin_buffer (PL_sys_intern.thr_intern.Wgetlogin_buffer) 458 # define w32_crypt_buffer (PL_sys_intern.thr_intern.Wcrypt_buffer) 459 # define w32_servent (PL_sys_intern.thr_intern.Wservent) 460 # define w32_init_socktype (PL_sys_intern.thr_intern.Winit_socktype) 461 #endif /* USE_THREADS */ 462 463 /* UNICODE<>ANSI translation helpers */ 464 /* Use CP_ACP when mode is ANSI */ 465 /* Use CP_UTF8 when mode is UTF8 */ 466 467 #define A2WHELPER_LEN(lpa, alen, lpw, nBytes)\ 468 (lpw[0] = 0, MultiByteToWideChar((IN_BYTE) ? CP_ACP : CP_UTF8, 0, \ 469 lpa, alen, lpw, (nBytes/sizeof(WCHAR)))) 470 #define A2WHELPER(lpa, lpw, nBytes) A2WHELPER_LEN(lpa, -1, lpw, nBytes) 471 472 #define W2AHELPER_LEN(lpw, wlen, lpa, nChars)\ 473 (lpa[0] = '\0', WideCharToMultiByte((IN_BYTE) ? CP_ACP : CP_UTF8, 0, \ 474 lpw, wlen, (LPSTR)lpa, nChars,NULL,NULL)) 475 #define W2AHELPER(lpw, lpa, nChars) W2AHELPER_LEN(lpw, -1, lpa, nChars) 476 477 #define USING_WIDE() (PL_widesyscalls && PerlEnv_os_id() == VER_PLATFORM_WIN32_NT) 478 479 #ifdef USE_ITHREADS 480 # define PERL_WAIT_FOR_CHILDREN \ 481 STMT_START { \ 482 if (w32_pseudo_children && w32_num_pseudo_children) { \ 483 long children = w32_num_pseudo_children; \ 484 WaitForMultipleObjects(children, \ 485 w32_pseudo_child_handles, \ 486 TRUE, INFINITE); \ 487 while (children) \ 488 CloseHandle(w32_pseudo_child_handles[--children]); \ 489 } \ 490 } STMT_END 491 #endif 492 493 #if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX) 494 #ifdef PERL_CORE 495 496 /* C doesn't like repeat struct definitions */ 497 #ifndef _CRTIMP 498 #define _CRTIMP __declspec(dllimport) 499 #endif 500 501 /* 502 * Control structure for lowio file handles 503 */ 504 typedef struct { 505 long osfhnd; /* underlying OS file HANDLE */ 506 char osfile; /* attributes of file (e.g., open in text mode?) */ 507 char pipech; /* one char buffer for handles opened on pipes */ 508 int lockinitflag; 509 CRITICAL_SECTION lock; 510 } ioinfo; 511 512 513 /* 514 * Array of arrays of control structures for lowio files. 515 */ 516 EXTERN_C _CRTIMP ioinfo* __pioinfo[]; 517 518 /* 519 * Definition of IOINFO_L2E, the log base 2 of the number of elements in each 520 * array of ioinfo structs. 521 */ 522 #define IOINFO_L2E 5 523 524 /* 525 * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array 526 */ 527 #define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E) 528 529 /* 530 * Access macros for getting at an ioinfo struct and its fields from a 531 * file handle 532 */ 533 #define _pioinfo(i) (__pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1))) 534 #define _osfhnd(i) (_pioinfo(i)->osfhnd) 535 #define _osfile(i) (_pioinfo(i)->osfile) 536 #define _pipech(i) (_pioinfo(i)->pipech) 537 538 /* since we are not doing a dup2(), this works fine */ 539 #define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = (long)osfh) 540 #endif 541 #endif 542 543 /* 544 * This provides a layer of functions and macros to ensure extensions will 545 * get to use the same RTL functions as the core. 546 */ 547 #include "win32iop.h" 548 549 #define EXEC_ARGV_CAST(x) ((const char *const *) x) 550 551 #endif /* _INC_WIN32_PERL5 */ 552 553