source: trunk/third/perl/win32/win32.h @ 14545

Revision 14545, 13.4 KB checked in by ghudson, 24 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r14544, which included commits to RCS files with non-trunk default branches.
Line 
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
79struct 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
90struct 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/* 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 */
129
130/* Define USE_FIXED_OSFHANDLE to fix MSVCRT's _open_osfhandle() on W95.
131   It now uses some black magic to work seamlessly with the DLL CRT and
132   works with MSVC++ 4.0+ or GCC/Mingw32
133        -- BKS 1-24-2000 */
134#if (defined(_M_IX86) && _MSC_VER >= 1000) || defined(__MINGW32__)
135#define USE_FIXED_OSFHANDLE
136#endif
137
138#define ENV_IS_CASELESS
139
140#ifndef VER_PLATFORM_WIN32_WINDOWS      /* VC-2.0 headers don't have this */
141#define VER_PLATFORM_WIN32_WINDOWS      1
142#endif
143
144#ifndef FILE_SHARE_DELETE               /* VC-4.0 headers don't have this */
145#define FILE_SHARE_DELETE               0x00000004
146#endif
147
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
156#define PERL_GET_CONTEXT_DEFINED
157
158/* Compiler-specific stuff. */
159
160#ifdef __BORLANDC__             /* Borland C++ */
161
162#define _access access
163#define _chdir chdir
164#define _getpid getpid
165#define wcsicmp _wcsicmp
166#include <sys/types.h>
167
168#ifndef DllMain
169#define DllMain DllEntryPoint
170#endif
171
172#pragma warn -ccc       /* "condition is always true/false" */
173#pragma warn -rch       /* "unreachable code" */
174#pragma warn -sig       /* "conversion may lose significant digits" */
175#pragma warn -pia       /* "possibly incorrect assignment" */
176#pragma warn -par       /* "parameter 'foo' is never used" */
177#pragma warn -aus       /* "'foo' is assigned a value that is never used" */
178#pragma warn -use       /* "'foo' is declared but never used" */
179#pragma warn -csu       /* "comparing signed and unsigned values" */
180#pragma warn -pro       /* "call to function with no prototype" */
181#pragma warn -stu       /* "undefined structure 'foo'" */
182
183/* Borland is picky about a bare member function name used as its ptr */
184#ifdef PERL_OBJECT
185#  define MEMBER_TO_FPTR(name)  &(name)
186#endif
187
188/* Borland C thinks that a pointer to a member variable is 12 bytes in size. */
189#define PERL_MEMBER_PTR_SIZE    12
190
191#endif
192
193#ifdef _MSC_VER                 /* Microsoft Visual C++ */
194
195typedef long            uid_t;
196typedef long            gid_t;
197typedef unsigned short  mode_t;
198#pragma  warning(disable: 4018 4035 4101 4102 4244 4245 4761)
199
200/* Visual C thinks that a pointer to a member variable is 16 bytes in size. */
201#define PERL_MEMBER_PTR_SIZE    16
202
203#endif /* _MSC_VER */
204
205#ifdef __MINGW32__              /* Minimal Gnu-Win32 */
206
207typedef long            uid_t;
208typedef long            gid_t;
209#ifndef _environ
210#define _environ        environ
211#endif
212#define flushall        _flushall
213#define fcloseall       _fcloseall
214
215#ifdef PERL_OBJECT
216#  define MEMBER_TO_FPTR(name)  &(name)
217#endif
218
219#ifndef _O_NOINHERIT
220#  define _O_NOINHERIT  0x0080
221#  ifndef _NO_OLDNAMES
222#    define O_NOINHERIT _O_NOINHERIT
223#  endif
224#endif
225
226#endif /* __MINGW32__ */
227
228/* both GCC/Mingw32 and MSVC++ 4.0 are missing this, so we put it here */
229#ifndef CP_UTF8
230#  define CP_UTF8       65001
231#endif
232
233/* compatibility stuff for other compilers goes here */
234
235
236#if !defined(PERL_OBJECT) && defined(PERL_CAPI) && defined(PERL_MEMBER_PTR_SIZE)
237#  define STRUCT_MGVTBL_DEFINITION \
238struct mgvtbl {                                                         \
239    union {                                                             \
240        int         (CPERLscope(*svt_get))(pTHX_ SV *sv, MAGIC* mg);    \
241        char        handle_VC_problem1[PERL_MEMBER_PTR_SIZE];           \
242    };                                                                  \
243    union {                                                             \
244        int         (CPERLscope(*svt_set))(pTHX_ SV *sv, MAGIC* mg);    \
245        char        handle_VC_problem2[PERL_MEMBER_PTR_SIZE];           \
246    };                                                                  \
247    union {                                                             \
248        U32         (CPERLscope(*svt_len))(pTHX_ SV *sv, MAGIC* mg);    \
249        char        handle_VC_problem3[PERL_MEMBER_PTR_SIZE];           \
250    };                                                                  \
251    union {                                                             \
252        int         (CPERLscope(*svt_clear))(pTHX_ SV *sv, MAGIC* mg);  \
253        char        handle_VC_problem4[PERL_MEMBER_PTR_SIZE];           \
254    };                                                                  \
255    union {                                                             \
256        int         (CPERLscope(*svt_free))(pTHX_ SV *sv, MAGIC* mg);   \
257        char        handle_VC_problem5[PERL_MEMBER_PTR_SIZE];           \
258    };                                                                  \
259}
260
261#  define BASEOP_DEFINITION \
262    OP*         op_next;                                                \
263    OP*         op_sibling;                                             \
264    OP*         (CPERLscope(*op_ppaddr))(pTHX);                         \
265    char        handle_VC_problem[PERL_MEMBER_PTR_SIZE-sizeof(OP*)];    \
266    PADOFFSET   op_targ;                                                \
267    OPCODE      op_type;                                                \
268    U16         op_seq;                                                 \
269    U8          op_flags;                                               \
270    U8          op_private;
271
272#endif /* !PERL_OBJECT && PERL_CAPI && PERL_MEMBER_PTR_SIZE */
273
274
275START_EXTERN_C
276
277/* For UNIX compatibility. */
278
279extern  uid_t   getuid(void);
280extern  gid_t   getgid(void);
281extern  uid_t   geteuid(void);
282extern  gid_t   getegid(void);
283extern  int     setuid(uid_t uid);
284extern  int     setgid(gid_t gid);
285extern  int     kill(int pid, int sig);
286extern  void    *sbrk(int need);
287extern  char *  getlogin(void);
288extern  int     chown(const char *p, uid_t o, gid_t g);
289
290#undef   Stat
291#define  Stat           win32_stat
292
293#undef   init_os_extras
294#define  init_os_extras Perl_init_os_extras
295
296DllExport void          Perl_win32_init(int *argcp, char ***argvp);
297DllExport void          Perl_init_os_extras();
298DllExport void          win32_str_os_error(void *sv, DWORD err);
299DllExport int           RunPerl(int argc, char **argv, char **env);
300
301typedef struct {
302    HANDLE      childStdIn;
303    HANDLE      childStdOut;
304    HANDLE      childStdErr;
305    /*
306     * the following correspond to the fields of the same name
307     * in the STARTUPINFO structure. Embedders can use these to
308     * control the spawning process' look.
309     * Example - to hide the window of the spawned process:
310     *    dwFlags = STARTF_USESHOWWINDOW;
311     *    wShowWindow = SW_HIDE;
312     */
313    DWORD       dwFlags;
314    DWORD       dwX;
315    DWORD       dwY;
316    DWORD       dwXSize;
317    DWORD       dwYSize;
318    DWORD       dwXCountChars;
319    DWORD       dwYCountChars;
320    DWORD       dwFillAttribute;
321    WORD        wShowWindow;
322} child_IO_table;
323
324DllExport void          win32_get_child_IO(child_IO_table* ptr);
325
326#ifndef USE_SOCKETS_AS_HANDLES
327extern FILE *           my_fdopen(int, char *);
328#endif
329extern int              my_fclose(FILE *);
330extern int              do_aspawn(void *really, void **mark, void **sp);
331extern int              do_spawn(char *cmd);
332extern int              do_spawn_nowait(char *cmd);
333extern char *           win32_get_privlib(const char *pl);
334extern char *           win32_get_sitelib(const char *pl);
335extern char *           win32_get_vendorlib(const char *pl);
336extern int              IsWin95(void);
337extern int              IsWinNT(void);
338extern void             win32_argv2utf8(int argc, char** argv);
339
340#ifdef PERL_IMPLICIT_SYS
341extern void             win32_delete_internal_host(void *h);
342#endif
343
344extern char *           staticlinkmodules[];
345
346END_EXTERN_C
347
348typedef  char *         caddr_t;        /* In malloc.c (core address). */
349
350/*
351 * handle socket stuff, assuming socket is always available
352 */
353#include <sys/socket.h>
354#include <netdb.h>
355
356#ifdef MYMALLOC
357#define EMBEDMYMALLOC   /**/
358/* #define USE_PERL_SBRK        /**/
359/* #define PERL_SBRK_VIA_MALLOC /**/
360#endif
361
362#if defined(PERLDLL) && !defined(PERL_CORE)
363#define PERL_CORE
364#endif
365
366#ifdef PERL_TEXTMODE_SCRIPTS
367#  define PERL_SCRIPT_MODE              "r"
368#else
369#  define PERL_SCRIPT_MODE              "rb"
370#endif
371
372/*
373 * Now Win32 specific per-thread data stuff
374 */
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];
381#    ifdef USE_SOCKETS_AS_HANDLES
382    int                 Winit_socktype;
383#    endif
384#    ifdef HAVE_DES_FCRYPT
385    char                Wcrypt_buffer[30];
386#    endif
387#    ifdef USE_RTL_THREAD_API
388    void *              retv;   /* slot for thread return value */
389#    endif
390};
391
392#ifdef USE_THREADS
393#  ifndef USE_DECLSPEC_THREAD
394#    define HAVE_THREAD_INTERN
395#  endif /* !USE_DECLSPEC_THREAD */
396#endif /* USE_THREADS */
397
398#define HAVE_INTERP_INTERN
399typedef struct {
400    long        num;
401    DWORD       pids[MAXIMUM_WAIT_OBJECTS];
402    HANDLE      handles[MAXIMUM_WAIT_OBJECTS];
403} child_tab;
404
405struct interp_intern {
406    char *      perlshell_tokens;
407    char **     perlshell_vec;
408    long        perlshell_items;
409    struct av * fdpid;
410    child_tab * children;
411#ifdef USE_ITHREADS
412    DWORD       pseudo_id;
413    child_tab * pseudo_children;
414#endif
415    void *      internal_host;
416#ifndef USE_THREADS
417    struct thread_intern        thr_intern;
418#endif
419};
420
421
422#define w32_perlshell_tokens    (PL_sys_intern.perlshell_tokens)
423#define w32_perlshell_vec       (PL_sys_intern.perlshell_vec)
424#define w32_perlshell_items     (PL_sys_intern.perlshell_items)
425#define w32_fdpid               (PL_sys_intern.fdpid)
426#define w32_children            (PL_sys_intern.children)
427#define w32_num_children        (w32_children->num)
428#define w32_child_pids          (w32_children->pids)
429#define w32_child_handles       (w32_children->handles)
430#define w32_pseudo_id           (PL_sys_intern.pseudo_id)
431#define w32_pseudo_children     (PL_sys_intern.pseudo_children)
432#define w32_num_pseudo_children         (w32_pseudo_children->num)
433#define w32_pseudo_child_pids           (w32_pseudo_children->pids)
434#define w32_pseudo_child_handles        (w32_pseudo_children->handles)
435#define w32_internal_host               (PL_sys_intern.internal_host)
436#ifdef USE_THREADS
437#  define w32_strerror_buffer   (thr->i.Wstrerror_buffer)
438#  define w32_getlogin_buffer   (thr->i.Wgetlogin_buffer)
439#  define w32_crypt_buffer      (thr->i.Wcrypt_buffer)
440#  define w32_servent           (thr->i.Wservent)
441#  define w32_init_socktype     (thr->i.Winit_socktype)
442#else
443#  define w32_strerror_buffer   (PL_sys_intern.thr_intern.Wstrerror_buffer)
444#  define w32_getlogin_buffer   (PL_sys_intern.thr_intern.Wgetlogin_buffer)
445#  define w32_crypt_buffer      (PL_sys_intern.thr_intern.Wcrypt_buffer)
446#  define w32_servent           (PL_sys_intern.thr_intern.Wservent)
447#  define w32_init_socktype     (PL_sys_intern.thr_intern.Winit_socktype)
448#endif /* USE_THREADS */
449
450/* UNICODE<>ANSI translation helpers */
451/* Use CP_ACP when mode is ANSI */
452/* Use CP_UTF8 when mode is UTF8 */
453
454#define A2WHELPER_LEN(lpa, alen, lpw, nBytes)\
455    (lpw[0] = 0, MultiByteToWideChar((IN_BYTE) ? CP_ACP : CP_UTF8, 0, \
456                                    lpa, alen, lpw, (nBytes/sizeof(WCHAR))))
457#define A2WHELPER(lpa, lpw, nBytes)     A2WHELPER_LEN(lpa, -1, lpw, nBytes)
458
459#define W2AHELPER_LEN(lpw, wlen, lpa, nChars)\
460    (lpa[0] = '\0', WideCharToMultiByte((IN_BYTE) ? CP_ACP : CP_UTF8, 0, \
461                                       lpw, wlen, (LPSTR)lpa, nChars,NULL,NULL))
462#define W2AHELPER(lpw, lpa, nChars)     W2AHELPER_LEN(lpw, -1, lpa, nChars)
463
464#define USING_WIDE() (PL_widesyscalls && PerlEnv_os_id() == VER_PLATFORM_WIN32_NT)
465
466#ifdef USE_ITHREADS
467#  define PERL_WAIT_FOR_CHILDREN \
468    STMT_START {                                                        \
469        if (w32_pseudo_children && w32_num_pseudo_children) {           \
470            long children = w32_num_pseudo_children;                    \
471            WaitForMultipleObjects(children,                            \
472                                   w32_pseudo_child_handles,            \
473                                   TRUE, INFINITE);                     \
474            while (children)                                            \
475                CloseHandle(w32_pseudo_child_handles[--children]);      \
476        }                                                               \
477    } STMT_END
478#endif
479
480/*
481 * This provides a layer of functions and macros to ensure extensions will
482 * get to use the same RTL functions as the core.
483 */
484#include "win32iop.h"
485
486#endif /* _INC_WIN32_PERL5 */
487
Note: See TracBrowser for help on using the repository browser.