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