This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
more complete support for implicit thread/interpreter pointer,
[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
9d8a25dc 12#ifdef PERL_OBJECT
e9ee4811
DL
13# define DYNAMIC_ENV_FETCH
14# define ENV_HV_NAME "___ENV_HV_NAME___"
a6c40364 15# define HAS_GETENV_LEN
e9ee4811 16# define prime_env_iter()
ab39fa9d
GS
17# define WIN32IO_IS_STDIO /* don't pull in custom stdio layer */
18# ifdef PERL_GLOBAL_STRUCT
19# error PERL_GLOBAL_STRUCT cannot be defined with PERL_OBJECT
20# endif
e5a95ffb 21# define win32_get_privlib PerlEnv_lib_path
ab39fa9d 22# define win32_get_sitelib PerlEnv_sitelib_path
9d8a25dc
DL
23#endif
24
a835ef8a 25#ifdef __GNUC__
7a9ec5a3 26// typedef long long __int64;
db15561c 27# define Win32_Winsock
22239a37
NIS
28/* GCC does not do __declspec() - render it a nop
29 * and turn on options to avoid importing data
30 */
b1d1613b 31#ifndef __declspec
db15561c 32# define __declspec(x)
b1d1613b 33#endif
db15561c
GS
34# ifndef PERL_OBJECT
35# define PERL_GLOBAL_STRUCT
b86a2fa7
GS
36# ifndef MULTIPLICITY
37# define MULTIPLICITY
38# endif
db15561c 39# endif
a835ef8a
NIS
40#endif
41
22239a37
NIS
42/* Define DllExport akin to perl's EXT,
43 * If we are in the DLL or mimicing the DLL for Win95 work round
44 * then Export the symbol,
45 * otherwise import it.
46 */
47
c69f6586
GS
48#if defined(PERL_OBJECT)
49#define DllExport
50#else
22239a37 51#if defined(PERLDLL) || defined(WIN95FIX)
852c2e52
GS
52#define DllExport
53/*#define DllExport __declspec(dllexport)*/ /* noises with VC5+sp3 */
22239a37
NIS
54#else
55#define DllExport __declspec(dllimport)
56#endif
c69f6586 57#endif
c69f112c 58
0a753a76
PP
59#define WIN32_LEAN_AND_MEAN
60#include <windows.h>
61
68dc0745
PP
62#ifdef WIN32_LEAN_AND_MEAN /* C file is NOT a Perl5 original. */
63#define CONTEXT PERL_CONTEXT /* Avoid conflict of CONTEXT defs. */
68dc0745 64#endif /*WIN32_LEAN_AND_MEAN */
0a753a76 65
eda5ff31
GS
66#ifndef TLS_OUT_OF_INDEXES
67#define TLS_OUT_OF_INDEXES (DWORD)0xFFFFFFFF
68#endif
69
0a753a76
PP
70#include <dirent.h>
71#include <io.h>
72#include <process.h>
73#include <stdio.h>
74#include <direct.h>
390b85e7
GS
75#include <stdlib.h>
76#ifndef EXT
77#include "EXTERN.h"
78#endif
79
c69f112c
NIS
80struct tms {
81 long tms_utime;
82 long tms_stime;
83 long tms_cutime;
84 long tms_cstime;
85};
86
b2af26b1
GS
87#ifndef SYS_NMLN
88#define SYS_NMLN 257
89#endif
90
91struct utsname {
92 char sysname[SYS_NMLN];
93 char nodename[SYS_NMLN];
94 char release[SYS_NMLN];
95 char version[SYS_NMLN];
96 char machine[SYS_NMLN];
97};
98
390b85e7 99#ifndef START_EXTERN_C
b3e5c95e 100#undef EXTERN_C
390b85e7
GS
101#ifdef __cplusplus
102# define START_EXTERN_C extern "C" {
103# define END_EXTERN_C }
104# define EXTERN_C extern "C"
105#else
106# define START_EXTERN_C
107# define END_EXTERN_C
108# define EXTERN_C
109#endif
110#endif
111
112#define STANDARD_C 1
113#define DOSISH 1 /* no escaping our roots */
114#define OP_BINARY O_BINARY /* mistake in in pp_sys.c? */
0a753a76 115
f3986ebb
GS
116/* Define USE_SOCKETS_AS_HANDLES to enable emulation of windows sockets as
117 * real filehandles. XXX Should always be defined (the other version is untested) */
118#define USE_SOCKETS_AS_HANDLES
119
a7092146
GS
120/* read() and write() aren't transparent for socket handles */
121#define PERL_SOCK_SYSREAD_IS_RECV
122#define PERL_SOCK_SYSWRITE_IS_SEND
123
124
f3986ebb
GS
125/* if USE_WIN32_RTL_ENV is not defined, Perl uses direct Win32 calls
126 * to read the environment, bypassing the runtime's (usually broken)
127 * facilities for accessing the same. See note in util.c/my_setenv(). */
128/*#define USE_WIN32_RTL_ENV */
0a753a76 129
f3986ebb
GS
130/* Define USE_FIXED_OSFHANDLE to fix VC's _open_osfhandle() on W95.
131 * Can only enable it if not using the DLL CRT (it doesn't expose internals) */
132#if defined(_MSC_VER) && !defined(_DLL) && defined(_M_IX86)
133#define USE_FIXED_OSFHANDLE
134#endif
135
902173a3
GS
136#define ENV_IS_CASELESS
137
d41de25a 138#ifndef VER_PLATFORM_WIN32_WINDOWS /* VC-2.0 headers don't have this */
f3986ebb
GS
139#define VER_PLATFORM_WIN32_WINDOWS 1
140#endif
141
d41de25a
GS
142#ifndef FILE_SHARE_DELETE /* VC-4.0 headers don't have this */
143#define FILE_SHARE_DELETE 0x00000004
144#endif
145
327c3667
GS
146/* access() mode bits */
147#ifndef R_OK
148# define R_OK 4
149# define W_OK 2
150# define X_OK 1
151# define F_OK 0
152#endif
153
f3986ebb
GS
154/* Compiler-specific stuff. */
155
910dfcc8 156#ifdef __BORLANDC__ /* Borland C++ */
3e3baf6d
TB
157
158#define _access access
159#define _chdir chdir
160#include <sys/types.h>
161
84902520
TB
162#ifndef DllMain
163#define DllMain DllEntryPoint
164#endif
165
189b2af5
GS
166#pragma warn -ccc /* "condition is always true/false" */
167#pragma warn -rch /* "unreachable code" */
168#pragma warn -sig /* "conversion may lose significant digits" */
169#pragma warn -pia /* "possibly incorrect assignment" */
170#pragma warn -par /* "parameter 'foo' is never used" */
171#pragma warn -aus /* "'foo' is assigned a value that is never used" */
172#pragma warn -use /* "'foo' is declared but never used" */
173#pragma warn -csu /* "comparing signed and unsigned values" */
174#pragma warn -pro /* "call to function with no prototype" */
327c3667 175#pragma warn -stu /* "undefined structure 'foo'" */
3e3baf6d 176
ac4c12e7
GS
177/* Borland is picky about a bare member function name used as its ptr */
178#ifdef PERL_OBJECT
179#define FUNC_NAME_TO_PTR(name) &(name)
180#endif
181
910dfcc8 182#endif
3e3baf6d 183
f3986ebb
GS
184#ifdef _MSC_VER /* Microsoft Visual C++ */
185
0a753a76
PP
186typedef long uid_t;
187typedef long gid_t;
a6c40364 188typedef unsigned short mode_t;
f3986ebb
GS
189#pragma warning(disable: 4018 4035 4101 4102 4244 4245 4761)
190
0f4eea8f
DL
191#ifndef PERL_OBJECT
192
193/* Visual C thinks that a pointer to a member variable is 16 bytes in size. */
194#define STRUCT_MGVTBL_DEFINITION \
195struct mgvtbl { \
196 union { \
20ce7b12 197 int (CPERLscope(*svt_get)) (SV *sv, MAGIC* mg); \
0f4eea8f
DL
198 char handle_VC_problem1[16]; \
199 }; \
200 union { \
20ce7b12 201 int (CPERLscope(*svt_set)) (SV *sv, MAGIC* mg); \
0f4eea8f
DL
202 char handle_VC_problem2[16]; \
203 }; \
204 union { \
20ce7b12 205 U32 (CPERLscope(*svt_len)) (SV *sv, MAGIC* mg); \
0f4eea8f
DL
206 char handle_VC_problem3[16]; \
207 }; \
208 union { \
20ce7b12 209 int (CPERLscope(*svt_clear)) (SV *sv, MAGIC* mg); \
0f4eea8f
DL
210 char handle_VC_problem4[16]; \
211 }; \
212 union { \
20ce7b12 213 int (CPERLscope(*svt_free)) (SV *sv, MAGIC* mg); \
0f4eea8f
DL
214 char handle_VC_problem5[16]; \
215 }; \
216}
217
218#define BASEOP_DEFINITION \
219 OP* op_next; \
220 OP* op_sibling; \
20ce7b12 221 OP* (CPERLscope(*op_ppaddr))(ARGSproto); \
0f4eea8f
DL
222 char handle_VC_problem[12]; \
223 PADOFFSET op_targ; \
224 OPCODE op_type; \
225 U16 op_seq; \
226 U8 op_flags; \
227 U8 op_private;
228
229#define UNION_ANY_DEFINITION union any { \
230 void* any_ptr; \
231 I32 any_i32; \
232 IV any_iv; \
233 long any_long; \
20ce7b12 234 void (CPERLscope(*any_dptr)) (void*); \
0f4eea8f
DL
235 char handle_VC_problem[16]; \
236}
237
238#endif /* PERL_OBJECT */
239
f3986ebb
GS
240#endif /* _MSC_VER */
241
910dfcc8
GS
242#ifdef __MINGW32__ /* Minimal Gnu-Win32 */
243
244typedef long uid_t;
245typedef long gid_t;
b1d1613b 246#ifndef _environ
3730b96e 247#define _environ environ
b1d1613b 248#endif
3730b96e
GS
249#define flushall _flushall
250#define fcloseall _fcloseall
910dfcc8 251
db15561c
GS
252#ifdef PERL_OBJECT
253#define FUNC_NAME_TO_PTR(name) &(name)
254#endif
255
ac4c12e7
GS
256#ifndef _O_NOINHERIT
257# define _O_NOINHERIT 0x0080
258# ifndef _NO_OLDNAMES
259# define O_NOINHERIT _O_NOINHERIT
260# endif
261#endif
262
ba3eb2af
GS
263#ifndef _O_NOINHERIT
264# define _O_NOINHERIT 0x0080
265# ifndef _NO_OLDNAMES
266# define O_NOINHERIT _O_NOINHERIT
267# endif
268#endif
269
910dfcc8
GS
270#endif /* __MINGW32__ */
271
f3986ebb 272/* compatibility stuff for other compilers goes here */
0a753a76 273
0a753a76 274
390b85e7 275START_EXTERN_C
f3986ebb
GS
276
277/* For UNIX compatibility. */
278
0a753a76
PP
279extern uid_t getuid(void);
280extern gid_t getgid(void);
281extern uid_t geteuid(void);
282extern gid_t getegid(void);
0a753a76
PP
283extern int setuid(uid_t uid);
284extern int setgid(gid_t gid);
285extern int kill(int pid, int sig);
161b471a 286extern void *sbrk(int need);
e34ffe5a 287extern char * getlogin(void);
b990f8c8 288extern int chown(const char *p, uid_t o, gid_t g);
d55594ae 289
f3986ebb
GS
290#undef Stat
291#define Stat win32_stat
3e3baf6d 292
f3986ebb
GS
293#undef init_os_extras
294#define init_os_extras Perl_init_os_extras
390b85e7 295
22239a37
NIS
296DllExport void Perl_win32_init(int *argcp, char ***argvp);
297DllExport void Perl_init_os_extras(void);
3730b96e 298DllExport void win32_str_os_error(void *sv, DWORD err);
0551aaa8 299
f3986ebb
GS
300#ifndef USE_SOCKETS_AS_HANDLES
301extern FILE * my_fdopen(int, char *);
d55594ae 302#endif
f3986ebb 303extern int my_fclose(FILE *);
2d7a9237 304extern int do_aspawn(void *really, void **mark, void **sp);
f3986ebb 305extern int do_spawn(char *cmd);
2d7a9237 306extern int do_spawn_nowait(char *cmd);
f3986ebb 307extern char do_exec(char *cmd);
e5a95ffb 308extern char * win32_get_privlib(char *pl);
00dc2f4f 309extern char * win32_get_sitelib(char *pl);
f3986ebb
GS
310extern int IsWin95(void);
311extern int IsWinNT(void);
d55594ae 312
f3986ebb 313extern char * staticlinkmodules[];
390b85e7
GS
314
315END_EXTERN_C
d55594ae 316
68dc0745 317typedef char * caddr_t; /* In malloc.c (core address). */
0a753a76 318
68dc0745 319/*
68dc0745
PP
320 * handle socket stuff, assuming socket is always available
321 */
0a753a76
PP
322#include <sys/socket.h>
323#include <netdb.h>
324
bbc8f9de
NIS
325#ifdef MYMALLOC
326#define EMBEDMYMALLOC /**/
327/* #define USE_PERL_SBRK /**/
328/* #define PERL_SBRK_VIA_MALLOC /**/
329#endif
330
c31fac66 331#if defined(PERLDLL) && !defined(PERL_CORE)
bbc8f9de
NIS
332#define PERL_CORE
333#endif
334
a868473f
NIS
335#ifdef USE_BINMODE_SCRIPTS
336#define PERL_SCRIPT_MODE "rb"
337EXT void win32_strip_return(struct sv *sv);
338#else
339#define PERL_SCRIPT_MODE "r"
340#define win32_strip_return(sv) NOOP
341#endif
342
4b556e6c 343#define HAVE_INTERP_INTERN
0aaad0ff
GS
344typedef struct {
345 long num;
346 DWORD pids[MAXIMUM_WAIT_OBJECTS];
347} child_tab;
348
4b556e6c 349struct interp_intern {
0aaad0ff
GS
350 char * perlshell_tokens;
351 char ** perlshell_vec;
352 long perlshell_items;
353 struct av * fdpid;
354 child_tab * children;
355 HANDLE child_handles[MAXIMUM_WAIT_OBJECTS];
4b556e6c
JD
356};
357
4b556e6c 358
0aaad0ff
GS
359#define w32_perlshell_tokens (PL_sys_intern.perlshell_tokens)
360#define w32_perlshell_vec (PL_sys_intern.perlshell_vec)
361#define w32_perlshell_items (PL_sys_intern.perlshell_items)
362#define w32_fdpid (PL_sys_intern.fdpid)
363#define w32_children (PL_sys_intern.children)
364#define w32_num_children (w32_children->num)
365#define w32_child_pids (w32_children->pids)
366#define w32_child_handles (PL_sys_intern.child_handles)
4b556e6c 367
c53bd28a
NIS
368/*
369 * Now Win32 specific per-thread data stuff
370 */
371
372#ifdef USE_THREADS
e34ffe5a
GS
373# ifndef USE_DECLSPEC_THREAD
374# define HAVE_THREAD_INTERN
375
376struct thread_intern {
377 /* XXX can probably use one buffer instead of several */
378 char Wstrerror_buffer[512];
379 struct servent Wservent;
380 char Wgetlogin_buffer[128];
4b556e6c 381 char Ww32_perllib_root[MAX_PATH+1];
401ef382
SN
382# ifdef USE_SOCKETS_AS_HANDLES
383 int Winit_socktype;
384# endif
e34ffe5a
GS
385# ifdef HAVE_DES_FCRYPT
386 char Wcrypt_buffer[30];
387# endif
2d7a9237
GS
388# ifdef USE_RTL_THREAD_API
389 void * retv; /* slot for thread return value */
390# endif
c53bd28a 391};
e34ffe5a
GS
392# endif /* !USE_DECLSPEC_THREAD */
393#endif /* USE_THREADS */
c53bd28a 394
7fac1903
GS
395/* UNICODE<>ANSI translation helpers */
396/* Use CP_ACP when mode is ANSI */
397/* Use CP_UTF8 when mode is UTF8 */
398
399#define A2WHELPER(lpa, lpw, nChars, acp)\
400 lpw[0] = 0, MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars)
401
402#define W2AHELPER(lpw, lpa, nChars, acp)\
403 lpa[0] = '\0', WideCharToMultiByte(acp, 0, lpw, -1, lpa, nChars, NULL, NULL)
404
405/* place holders for now */
406#define USING_WIDE() 0
407#define GETINTERPMODE() CP_ACP
408
68dc0745 409#endif /* _INC_WIN32_PERL5 */
7a9ec5a3 410