This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[PATCH: perl@11564] introducing perlivp
[perl5.git] / win32 / win32.h
CommitLineData
68dc0745
PP
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 */
0a753a76
PP
9#ifndef _INC_WIN32_PERL5
10#define _INC_WIN32_PERL5
11
5db10396
GS
12#ifndef _WIN32_WINNT
13# define _WIN32_WINNT 0x0400 /* needed for TryEnterCriticalSection() etc. */
14#endif
638eceb6 15
32e30700 16#if defined(PERL_OBJECT) || defined(PERL_IMPLICIT_SYS) || defined(PERL_CAPI)
e9ee4811 17# define DYNAMIC_ENV_FETCH
a6c40364 18# define HAS_GETENV_LEN
e9ee4811 19# define prime_env_iter()
ab39fa9d 20# define WIN32IO_IS_STDIO /* don't pull in custom stdio layer */
c5be433b 21# define WIN32SCK_IS_STDSCK /* don't pull in custom wsock layer */
ab39fa9d 22# ifdef PERL_GLOBAL_STRUCT
32e30700 23# error PERL_GLOBAL_STRUCT cannot be defined with PERL_IMPLICIT_SYS
ab39fa9d 24# endif
e5a95ffb 25# define win32_get_privlib PerlEnv_lib_path
ab39fa9d 26# define win32_get_sitelib PerlEnv_sitelib_path
4ea817c6 27# define win32_get_vendorlib PerlEnv_vendorlib_path
9d8a25dc
DL
28#endif
29
a835ef8a 30#ifdef __GNUC__
b7c82df9
GS
31# ifndef __int64 /* some versions seem to #define it already */
32# define __int64 long long
33# endif
db15561c 34# define Win32_Winsock
a835ef8a
NIS
35#endif
36
22239a37
NIS
37/* Define DllExport akin to perl's EXT,
38 * If we are in the DLL or mimicing the DLL for Win95 work round
39 * then Export the symbol,
40 * otherwise import it.
41 */
42
5db10396
GS
43/* now even GCC supports __declspec() */
44
c69f6586
GS
45#if defined(PERL_OBJECT)
46#define DllExport
47#else
22239a37 48#if defined(PERLDLL) || defined(WIN95FIX)
852c2e52
GS
49#define DllExport
50/*#define DllExport __declspec(dllexport)*/ /* noises with VC5+sp3 */
22239a37
NIS
51#else
52#define DllExport __declspec(dllimport)
53#endif
c69f6586 54#endif
c69f112c 55
0a753a76
PP
56#define WIN32_LEAN_AND_MEAN
57#include <windows.h>
58
68dc0745
PP
59#ifdef WIN32_LEAN_AND_MEAN /* C file is NOT a Perl5 original. */
60#define CONTEXT PERL_CONTEXT /* Avoid conflict of CONTEXT defs. */
68dc0745 61#endif /*WIN32_LEAN_AND_MEAN */
0a753a76 62
eda5ff31
GS
63#ifndef TLS_OUT_OF_INDEXES
64#define TLS_OUT_OF_INDEXES (DWORD)0xFFFFFFFF
65#endif
66
0a753a76
PP
67#include <dirent.h>
68#include <io.h>
69#include <process.h>
70#include <stdio.h>
71#include <direct.h>
390b85e7 72#include <stdlib.h>
7a1f88ac 73#include <fcntl.h>
390b85e7
GS
74#ifndef EXT
75#include "EXTERN.h"
76#endif
77
c69f112c
NIS
78struct tms {
79 long tms_utime;
80 long tms_stime;
81 long tms_cutime;
82 long tms_cstime;
83};
84
b2af26b1
GS
85#ifndef SYS_NMLN
86#define SYS_NMLN 257
87#endif
88
89struct utsname {
90 char sysname[SYS_NMLN];
91 char nodename[SYS_NMLN];
92 char release[SYS_NMLN];
93 char version[SYS_NMLN];
94 char machine[SYS_NMLN];
95};
96
390b85e7 97#ifndef START_EXTERN_C
b3e5c95e 98#undef EXTERN_C
390b85e7
GS
99#ifdef __cplusplus
100# define START_EXTERN_C extern "C" {
101# define END_EXTERN_C }
102# define EXTERN_C extern "C"
103#else
104# define START_EXTERN_C
105# define END_EXTERN_C
106# define EXTERN_C
107#endif
108#endif
109
110#define STANDARD_C 1
111#define DOSISH 1 /* no escaping our roots */
112#define OP_BINARY O_BINARY /* mistake in in pp_sys.c? */
0a753a76 113
f3986ebb
GS
114/* Define USE_SOCKETS_AS_HANDLES to enable emulation of windows sockets as
115 * real filehandles. XXX Should always be defined (the other version is untested) */
116#define USE_SOCKETS_AS_HANDLES
117
a7092146
GS
118/* read() and write() aren't transparent for socket handles */
119#define PERL_SOCK_SYSREAD_IS_RECV
120#define PERL_SOCK_SYSWRITE_IS_SEND
121
682fc664 122#define PERL_NO_FORCE_LINK /* no need for PL_force_link_funcs */
a7092146 123
9e5f57de
GS
124/* Define USE_FIXED_OSFHANDLE to fix MSVCRT's _open_osfhandle() on W95.
125 It now uses some black magic to work seamlessly with the DLL CRT and
126 works with MSVC++ 4.0+ or GCC/Mingw32
127 -- BKS 1-24-2000 */
128#if (defined(_M_IX86) && _MSC_VER >= 1000) || defined(__MINGW32__)
f3986ebb
GS
129#define USE_FIXED_OSFHANDLE
130#endif
131
6940069f
GS
132/* Define PERL_WIN32_SOCK_DLOAD to have Perl dynamically load the winsock
133 DLL when needed. Don't use if your compiler supports delayloading (ie, VC++ 6.0)
134 -- BKS 5-29-2000 */
135#if !(defined(_M_IX86) && _MSC_VER >= 1200)
136#define PERL_WIN32_SOCK_DLOAD
137#endif
902173a3
GS
138#define ENV_IS_CASELESS
139
d41de25a 140#ifndef VER_PLATFORM_WIN32_WINDOWS /* VC-2.0 headers don't have this */
f3986ebb
GS
141#define VER_PLATFORM_WIN32_WINDOWS 1
142#endif
143
d41de25a
GS
144#ifndef FILE_SHARE_DELETE /* VC-4.0 headers don't have this */
145#define FILE_SHARE_DELETE 0x00000004
146#endif
147
327c3667
GS
148/* access() mode bits */
149#ifndef R_OK
150# define R_OK 4
151# define W_OK 2
152# define X_OK 1
153# define F_OK 0
154#endif
155
cc236deb
GS
156/* for waitpid() */
157#ifndef WNOHANG
158# define WNOHANG 1
159#endif
160
c44d3fdb
GS
161#define PERL_GET_CONTEXT_DEFINED
162
f3986ebb
GS
163/* Compiler-specific stuff. */
164
910dfcc8 165#ifdef __BORLANDC__ /* Borland C++ */
3e3baf6d 166
cb359b41 167#if (__BORLANDC__ <= 0x520)
3e3baf6d
TB
168#define _access access
169#define _chdir chdir
cb359b41
JH
170#endif
171
4ce4f76e 172#define _getpid getpid
26871e0a 173#define wcsicmp _wcsicmp
3e3baf6d
TB
174#include <sys/types.h>
175
84902520
TB
176#ifndef DllMain
177#define DllMain DllEntryPoint
178#endif
179
189b2af5
GS
180#pragma warn -ccc /* "condition is always true/false" */
181#pragma warn -rch /* "unreachable code" */
182#pragma warn -sig /* "conversion may lose significant digits" */
183#pragma warn -pia /* "possibly incorrect assignment" */
184#pragma warn -par /* "parameter 'foo' is never used" */
185#pragma warn -aus /* "'foo' is assigned a value that is never used" */
186#pragma warn -use /* "'foo' is declared but never used" */
187#pragma warn -csu /* "comparing signed and unsigned values" */
3e3baf6d 188
ac4c12e7
GS
189/* Borland is picky about a bare member function name used as its ptr */
190#ifdef PERL_OBJECT
0b94c7bb 191# define MEMBER_TO_FPTR(name) &(name)
ac4c12e7
GS
192#endif
193
cd183fd9
GS
194/* Borland C thinks that a pointer to a member variable is 12 bytes in size. */
195#define PERL_MEMBER_PTR_SIZE 12
196
1307044d
VK
197#define isnan _isnan
198
910dfcc8 199#endif
3e3baf6d 200
f3986ebb
GS
201#ifdef _MSC_VER /* Microsoft Visual C++ */
202
0a753a76
PP
203typedef long uid_t;
204typedef long gid_t;
a6c40364 205typedef unsigned short mode_t;
f3986ebb
GS
206#pragma warning(disable: 4018 4035 4101 4102 4244 4245 4761)
207
0f4eea8f 208/* Visual C thinks that a pointer to a member variable is 16 bytes in size. */
cd183fd9 209#define PERL_MEMBER_PTR_SIZE 16
0f4eea8f 210
5fb4d820
GS
211#define isnan _isnan
212
f3986ebb
GS
213#endif /* _MSC_VER */
214
910dfcc8
GS
215#ifdef __MINGW32__ /* Minimal Gnu-Win32 */
216
217typedef long uid_t;
218typedef long gid_t;
b1d1613b 219#ifndef _environ
3730b96e 220#define _environ environ
b1d1613b 221#endif
3730b96e
GS
222#define flushall _flushall
223#define fcloseall _fcloseall
6940069f 224#define isnan _isnan /* ...same libraries as MSVC */
910dfcc8 225
db15561c 226#ifdef PERL_OBJECT
0b94c7bb 227# define MEMBER_TO_FPTR(name) &(name)
db15561c
GS
228#endif
229
ac4c12e7
GS
230#ifndef _O_NOINHERIT
231# define _O_NOINHERIT 0x0080
232# ifndef _NO_OLDNAMES
233# define O_NOINHERIT _O_NOINHERIT
234# endif
235#endif
236
910dfcc8
GS
237#endif /* __MINGW32__ */
238
f8fb7c90
GS
239/* both GCC/Mingw32 and MSVC++ 4.0 are missing this, so we put it here */
240#ifndef CP_UTF8
241# define CP_UTF8 65001
242#endif
243
f3986ebb 244/* compatibility stuff for other compilers goes here */
0a753a76 245
0a753a76 246
dfdd1393 247#if !defined(PERL_OBJECT) && defined(PERL_CAPI) && defined(PERL_MEMBER_PTR_SIZE)
cd183fd9
GS
248# define STRUCT_MGVTBL_DEFINITION \
249struct mgvtbl { \
250 union { \
251 int (CPERLscope(*svt_get))(pTHX_ SV *sv, MAGIC* mg); \
252 char handle_VC_problem1[PERL_MEMBER_PTR_SIZE]; \
253 }; \
254 union { \
255 int (CPERLscope(*svt_set))(pTHX_ SV *sv, MAGIC* mg); \
256 char handle_VC_problem2[PERL_MEMBER_PTR_SIZE]; \
257 }; \
258 union { \
259 U32 (CPERLscope(*svt_len))(pTHX_ SV *sv, MAGIC* mg); \
260 char handle_VC_problem3[PERL_MEMBER_PTR_SIZE]; \
261 }; \
262 union { \
263 int (CPERLscope(*svt_clear))(pTHX_ SV *sv, MAGIC* mg); \
264 char handle_VC_problem4[PERL_MEMBER_PTR_SIZE]; \
265 }; \
266 union { \
267 int (CPERLscope(*svt_free))(pTHX_ SV *sv, MAGIC* mg); \
268 char handle_VC_problem5[PERL_MEMBER_PTR_SIZE]; \
269 }; \
270}
271
272# define BASEOP_DEFINITION \
273 OP* op_next; \
274 OP* op_sibling; \
275 OP* (CPERLscope(*op_ppaddr))(pTHX); \
276 char handle_VC_problem[PERL_MEMBER_PTR_SIZE-sizeof(OP*)]; \
277 PADOFFSET op_targ; \
278 OPCODE op_type; \
279 U16 op_seq; \
280 U8 op_flags; \
281 U8 op_private;
282
dfdd1393 283#endif /* !PERL_OBJECT && PERL_CAPI && PERL_MEMBER_PTR_SIZE */
cd183fd9
GS
284
285
390b85e7 286START_EXTERN_C
f3986ebb
GS
287
288/* For UNIX compatibility. */
289
0a753a76
PP
290extern uid_t getuid(void);
291extern gid_t getgid(void);
292extern uid_t geteuid(void);
293extern gid_t getegid(void);
0a753a76
PP
294extern int setuid(uid_t uid);
295extern int setgid(gid_t gid);
296extern int kill(int pid, int sig);
161b471a 297extern void *sbrk(int need);
e34ffe5a 298extern char * getlogin(void);
b990f8c8 299extern int chown(const char *p, uid_t o, gid_t g);
00b02797 300extern int mkstemp(const char *path);
d55594ae 301
f3986ebb
GS
302#undef Stat
303#define Stat win32_stat
3e3baf6d 304
f3986ebb
GS
305#undef init_os_extras
306#define init_os_extras Perl_init_os_extras
390b85e7 307
22239a37 308DllExport void Perl_win32_init(int *argcp, char ***argvp);
cb359b41 309DllExport void Perl_init_os_extras(void);
c5be433b
GS
310DllExport void win32_str_os_error(void *sv, DWORD err);
311DllExport int RunPerl(int argc, char **argv, char **env);
0551aaa8 312
635bbe87
GS
313typedef struct {
314 HANDLE childStdIn;
315 HANDLE childStdOut;
316 HANDLE childStdErr;
f83751a7
GS
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;
635bbe87
GS
334} child_IO_table;
335
336DllExport void win32_get_child_IO(child_IO_table* ptr);
337
f3986ebb
GS
338#ifndef USE_SOCKETS_AS_HANDLES
339extern FILE * my_fdopen(int, char *);
d55594ae 340#endif
f3986ebb 341extern int my_fclose(FILE *);
ed59ec62 342extern int my_fstat(int fd, struct stat *sbufptr);
c5be433b
GS
343extern int do_aspawn(void *really, void **mark, void **sp);
344extern int do_spawn(char *cmd);
345extern int do_spawn_nowait(char *cmd);
4ea817c6
GS
346extern char * win32_get_privlib(const char *pl);
347extern char * win32_get_sitelib(const char *pl);
348extern char * win32_get_vendorlib(const char *pl);
f3986ebb
GS
349extern int IsWin95(void);
350extern int IsWinNT(void);
c0932edc 351extern void win32_argv2utf8(int argc, char** argv);
d55594ae 352
1c0ca838
GS
353#ifdef PERL_IMPLICIT_SYS
354extern void win32_delete_internal_host(void *h);
355#endif
356
f3986ebb 357extern char * staticlinkmodules[];
390b85e7
GS
358
359END_EXTERN_C
d55594ae 360
68dc0745 361typedef char * caddr_t; /* In malloc.c (core address). */
0a753a76 362
68dc0745 363/*
68dc0745
PP
364 * handle socket stuff, assuming socket is always available
365 */
0a753a76
PP
366#include <sys/socket.h>
367#include <netdb.h>
368
bbc8f9de
NIS
369#ifdef MYMALLOC
370#define EMBEDMYMALLOC /**/
371/* #define USE_PERL_SBRK /**/
372/* #define PERL_SBRK_VIA_MALLOC /**/
373#endif
374
c31fac66 375#if defined(PERLDLL) && !defined(PERL_CORE)
bbc8f9de
NIS
376#define PERL_CORE
377#endif
378
e68cb057 379#ifdef PERL_TEXTMODE_SCRIPTS
c39cd008 380# define PERL_SCRIPT_MODE "r"
a868473f 381#else
c39cd008 382# define PERL_SCRIPT_MODE "rb"
a868473f
NIS
383#endif
384
3352bfcb
GS
385/*
386 * Now Win32 specific per-thread data stuff
387 */
388
389struct 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
4b556e6c 411#define HAVE_INTERP_INTERN
0aaad0ff
GS
412typedef struct {
413 long num;
414 DWORD pids[MAXIMUM_WAIT_OBJECTS];
7766f137 415 HANDLE handles[MAXIMUM_WAIT_OBJECTS];
0aaad0ff
GS
416} child_tab;
417
4b556e6c 418struct interp_intern {
0aaad0ff
GS
419 char * perlshell_tokens;
420 char ** perlshell_vec;
421 long perlshell_items;
422 struct av * fdpid;
423 child_tab * children;
7766f137
GS
424#ifdef USE_ITHREADS
425 DWORD pseudo_id;
426 child_tab * pseudo_children;
427#endif
428 void * internal_host;
3352bfcb
GS
429#ifndef USE_THREADS
430 struct thread_intern thr_intern;
431#endif
4b556e6c
JD
432};
433
4b556e6c 434
0aaad0ff
GS
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)
7766f137
GS
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)
c53bd28a 449#ifdef USE_THREADS
3352bfcb
GS
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)
e34ffe5a 461#endif /* USE_THREADS */
c53bd28a 462
7fac1903
GS
463/* UNICODE<>ANSI translation helpers */
464/* Use CP_ACP when mode is ANSI */
465/* Use CP_UTF8 when mode is UTF8 */
466
e9ff6d27 467#define A2WHELPER_LEN(lpa, alen, lpw, nBytes)\
c8f3d7f8 468 (lpw[0] = 0, MultiByteToWideChar((IN_BYTES) ? CP_ACP : CP_UTF8, 0, \
e9ff6d27
GS
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)\
c8f3d7f8 473 (lpa[0] = '\0', WideCharToMultiByte((IN_BYTES) ? CP_ACP : CP_UTF8, 0, \
e9ff6d27
GS
474 lpw, wlen, (LPSTR)lpa, nChars,NULL,NULL))
475#define W2AHELPER(lpw, lpa, nChars) W2AHELPER_LEN(lpw, -1, lpa, nChars)
7fac1903 476
46487f74 477#define USING_WIDE() (PL_widesyscalls && PerlEnv_os_id() == VER_PLATFORM_WIN32_NT)
7fac1903 478
7766f137
GS
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
a10b7b7e
GS
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 */
504typedef 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 */
516EXTERN_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
adb71456
NIS
543#define PERLIO_NOT_STDIO 0
544
545#include "perlio.h"
546
4f63d024
GS
547/*
548 * This provides a layer of functions and macros to ensure extensions will
549 * get to use the same RTL functions as the core.
550 */
551#include "win32iop.h"
552
b4748376
NIS
553#define EXEC_ARGV_CAST(x) ((const char *const *) x)
554
68dc0745 555#endif /* _INC_WIN32_PERL5 */
7a9ec5a3 556