home *** CD-ROM | disk | FTP | other *** search
/ Australian Personal Computer 2002 November / CD 1 / APC0211D1.ISO / workshop / prog / files / ActivePerl-5.6.1.633-MSWin32.msi / _35528cdde35e069becb4dc7a1d0a809f < prev    next >
Encoding:
Text File  |  2001-10-29  |  15.3 KB  |  553 lines

  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. #include "BuildInfo.h"
  13.  
  14. #ifndef _WIN32_WINNT
  15. #  define _WIN32_WINNT 0x0400     /* needed for TryEnterCriticalSection() etc. */
  16. #endif
  17.  
  18. #if defined(PERL_OBJECT) || defined(PERL_IMPLICIT_SYS) || defined(PERL_CAPI)
  19. #  define DYNAMIC_ENV_FETCH
  20. #  define ENV_HV_NAME "___ENV_HV_NAME___"
  21. #  define HAS_GETENV_LEN
  22. #  define prime_env_iter()
  23. #  define WIN32IO_IS_STDIO        /* don't pull in custom stdio layer */
  24. #  define WIN32SCK_IS_STDSCK        /* don't pull in custom wsock layer */
  25. #  ifdef PERL_GLOBAL_STRUCT
  26. #    error PERL_GLOBAL_STRUCT cannot be defined with PERL_IMPLICIT_SYS
  27. #  endif
  28. #  define win32_get_privlib PerlEnv_lib_path
  29. #  define win32_get_sitelib PerlEnv_sitelib_path
  30. #  define win32_get_vendorlib PerlEnv_vendorlib_path
  31. #endif
  32.  
  33. #ifdef __GNUC__
  34. #  ifndef __int64        /* some versions seem to #define it already */
  35. #    define __int64 long long
  36. #  endif
  37. #  define Win32_Winsock
  38. #endif
  39.  
  40. /* Define DllExport akin to perl's EXT, 
  41.  * If we are in the DLL or mimicing the DLL for Win95 work round
  42.  * then Export the symbol, 
  43.  * otherwise import it.
  44.  */
  45.  
  46. /* now even GCC supports __declspec() */
  47.  
  48. #if defined(PERL_OBJECT)
  49. #define DllExport
  50. #else
  51. #if defined(PERLDLL) || defined(WIN95FIX)
  52. #define DllExport
  53. /*#define DllExport __declspec(dllexport)*/    /* noises with VC5+sp3 */
  54. #else 
  55. #define DllExport __declspec(dllimport)
  56. #endif
  57. #endif
  58.  
  59. #define  WIN32_LEAN_AND_MEAN
  60. #include <windows.h>
  61.  
  62. #ifdef   WIN32_LEAN_AND_MEAN        /* C file is NOT a Perl5 original. */
  63. #define  CONTEXT    PERL_CONTEXT    /* Avoid conflict of CONTEXT defs. */
  64. #endif /*WIN32_LEAN_AND_MEAN */
  65.  
  66. #ifndef TLS_OUT_OF_INDEXES
  67. #define TLS_OUT_OF_INDEXES (DWORD)0xFFFFFFFF
  68. #endif
  69.  
  70. #include <dirent.h>
  71. #include <io.h>
  72. #include <process.h>
  73. #include <stdio.h>
  74. #include <direct.h>
  75. #include <stdlib.h>
  76. #include <fcntl.h>
  77. #ifndef EXT
  78. #include "EXTERN.h"
  79. #endif
  80.  
  81. struct tms {
  82.     long    tms_utime;
  83.     long    tms_stime;
  84.     long    tms_cutime;
  85.     long    tms_cstime;
  86. };
  87.  
  88. #ifndef SYS_NMLN
  89. #define SYS_NMLN    257
  90. #endif
  91.  
  92. struct utsname {
  93.     char sysname[SYS_NMLN];
  94.     char nodename[SYS_NMLN];
  95.     char release[SYS_NMLN];
  96.     char version[SYS_NMLN];
  97.     char machine[SYS_NMLN];
  98. };
  99.  
  100. #ifndef START_EXTERN_C
  101. #undef EXTERN_C
  102. #ifdef __cplusplus
  103. #  define START_EXTERN_C extern "C" {
  104. #  define END_EXTERN_C }
  105. #  define EXTERN_C extern "C"
  106. #else
  107. #  define START_EXTERN_C 
  108. #  define END_EXTERN_C 
  109. #  define EXTERN_C
  110. #endif
  111. #endif
  112.  
  113. #define  STANDARD_C    1
  114. #define  DOSISH        1        /* no escaping our roots */
  115. #define  OP_BINARY    O_BINARY    /* mistake in in pp_sys.c? */
  116.  
  117. /* Define USE_SOCKETS_AS_HANDLES to enable emulation of windows sockets as
  118.  * real filehandles. XXX Should always be defined (the other version is untested) */
  119. #define USE_SOCKETS_AS_HANDLES
  120.  
  121. /* read() and write() aren't transparent for socket handles */
  122. #define PERL_SOCK_SYSREAD_IS_RECV
  123. #define PERL_SOCK_SYSWRITE_IS_SEND
  124.  
  125. #define PERL_NO_FORCE_LINK        /* no need for PL_force_link_funcs */
  126.  
  127. /* Define USE_FIXED_OSFHANDLE to fix MSVCRT's _open_osfhandle() on W95.
  128.    It now uses some black magic to work seamlessly with the DLL CRT and
  129.    works with MSVC++ 4.0+ or GCC/Mingw32
  130.     -- BKS 1-24-2000 */
  131. #if (defined(_M_IX86) && _MSC_VER >= 1000) || defined(__MINGW32__)
  132. #define USE_FIXED_OSFHANDLE
  133. #endif
  134.  
  135. /* Define PERL_WIN32_SOCK_DLOAD to have Perl dynamically load the winsock
  136.    DLL when needed. Don't use if your compiler supports delayloading (ie, VC++ 6.0)
  137.     -- BKS 5-29-2000 */
  138. #if !(defined(_M_IX86) && _MSC_VER >= 1200)
  139. #define PERL_WIN32_SOCK_DLOAD
  140. #endif
  141. #define ENV_IS_CASELESS
  142.  
  143. #ifndef VER_PLATFORM_WIN32_WINDOWS    /* VC-2.0 headers don't have this */
  144. #define VER_PLATFORM_WIN32_WINDOWS    1
  145. #endif
  146.  
  147. #ifndef FILE_SHARE_DELETE        /* VC-4.0 headers don't have this */
  148. #define FILE_SHARE_DELETE        0x00000004
  149. #endif
  150.  
  151. /* access() mode bits */
  152. #ifndef R_OK
  153. #  define    R_OK    4
  154. #  define    W_OK    2
  155. #  define    X_OK    1
  156. #  define    F_OK    0
  157. #endif
  158.  
  159. /* for waitpid() */
  160. #ifndef WNOHANG
  161. #  define WNOHANG    1
  162. #endif
  163.  
  164. #define PERL_GET_CONTEXT_DEFINED
  165.  
  166. /* Compiler-specific stuff. */
  167.  
  168. #ifdef __BORLANDC__        /* Borland C++ */
  169.  
  170. #if (__BORLANDC__ <= 0x520)
  171. #define _access access
  172. #define _chdir chdir
  173. #endif
  174.  
  175. #define _getpid getpid
  176. #define wcsicmp _wcsicmp
  177. #include <sys/types.h>
  178.  
  179. #ifndef DllMain
  180. #define DllMain DllEntryPoint
  181. #endif
  182.  
  183. #pragma warn -ccc    /* "condition is always true/false" */
  184. #pragma warn -rch    /* "unreachable code" */
  185. #pragma warn -sig    /* "conversion may lose significant digits" */
  186. #pragma warn -pia    /* "possibly incorrect assignment" */
  187. #pragma warn -par    /* "parameter 'foo' is never used" */
  188. #pragma warn -aus    /* "'foo' is assigned a value that is never used" */
  189. #pragma warn -use    /* "'foo' is declared but never used" */
  190. #pragma warn -csu    /* "comparing signed and unsigned values" */
  191.  
  192. /* Borland is picky about a bare member function name used as its ptr */
  193. #ifdef PERL_OBJECT
  194. #  define MEMBER_TO_FPTR(name)    &(name)
  195. #endif
  196.  
  197. /* Borland C thinks that a pointer to a member variable is 12 bytes in size. */
  198. #define PERL_MEMBER_PTR_SIZE    12
  199.  
  200. #define isnan        _isnan
  201.  
  202. #endif
  203.  
  204. #ifdef _MSC_VER            /* Microsoft Visual C++ */
  205.  
  206. typedef long        uid_t;
  207. typedef long        gid_t;
  208. typedef unsigned short    mode_t;
  209.  
  210. #pragma  warning(disable: 4102)    /* "unreferenced label" */
  211.  
  212. /* Visual C thinks that a pointer to a member variable is 16 bytes in size. */
  213. #define PERL_MEMBER_PTR_SIZE    16
  214.  
  215. #define isnan        _isnan
  216.  
  217. #endif /* _MSC_VER */
  218.  
  219. #ifdef __MINGW32__        /* Minimal Gnu-Win32 */
  220.  
  221. typedef long        uid_t;
  222. typedef long        gid_t;
  223. #ifndef _environ
  224. #define _environ    environ
  225. #endif
  226. #define flushall    _flushall
  227. #define fcloseall    _fcloseall
  228. #define isnan        _isnan    /* ...same libraries as MSVC */
  229.  
  230. #ifdef PERL_OBJECT
  231. #  define MEMBER_TO_FPTR(name)    &(name)
  232. #endif
  233.  
  234. #ifndef _O_NOINHERIT
  235. #  define _O_NOINHERIT    0x0080
  236. #  ifndef _NO_OLDNAMES
  237. #    define O_NOINHERIT    _O_NOINHERIT
  238. #  endif
  239. #endif
  240.  
  241. #endif /* __MINGW32__ */
  242.  
  243. /* both GCC/Mingw32 and MSVC++ 4.0 are missing this, so we put it here */
  244. #ifndef CP_UTF8
  245. #  define CP_UTF8    65001
  246. #endif
  247.  
  248. /* compatibility stuff for other compilers goes here */
  249.  
  250.  
  251. #if !defined(PERL_OBJECT) && defined(PERL_CAPI) && defined(PERL_MEMBER_PTR_SIZE)
  252. #  define STRUCT_MGVTBL_DEFINITION \
  253. struct mgvtbl {                                \
  254.     union {                                \
  255.     int        (CPERLscope(*svt_get))(pTHX_ SV *sv, MAGIC* mg);    \
  256.     char        handle_VC_problem1[PERL_MEMBER_PTR_SIZE];        \
  257.     };                                    \
  258.     union {                                \
  259.     int        (CPERLscope(*svt_set))(pTHX_ SV *sv, MAGIC* mg);    \
  260.     char        handle_VC_problem2[PERL_MEMBER_PTR_SIZE];        \
  261.     };                                    \
  262.     union {                                \
  263.     U32        (CPERLscope(*svt_len))(pTHX_ SV *sv, MAGIC* mg);    \
  264.     char        handle_VC_problem3[PERL_MEMBER_PTR_SIZE];        \
  265.     };                                    \
  266.     union {                                \
  267.     int        (CPERLscope(*svt_clear))(pTHX_ SV *sv, MAGIC* mg);    \
  268.     char        handle_VC_problem4[PERL_MEMBER_PTR_SIZE];        \
  269.     };                                    \
  270.     union {                                \
  271.     int        (CPERLscope(*svt_free))(pTHX_ SV *sv, MAGIC* mg);    \
  272.     char        handle_VC_problem5[PERL_MEMBER_PTR_SIZE];        \
  273.     };                                    \
  274. }
  275.  
  276. #  define BASEOP_DEFINITION \
  277.     OP*        op_next;                        \
  278.     OP*        op_sibling;                        \
  279.     OP*        (CPERLscope(*op_ppaddr))(pTHX);                \
  280.     char    handle_VC_problem[PERL_MEMBER_PTR_SIZE-sizeof(OP*)];    \
  281.     PADOFFSET    op_targ;                        \
  282.     OPCODE    op_type;                        \
  283.     U16        op_seq;                            \
  284.     U8        op_flags;                        \
  285.     U8        op_private;
  286.  
  287. #endif /* !PERL_OBJECT && PERL_CAPI && PERL_MEMBER_PTR_SIZE */
  288.  
  289.  
  290. START_EXTERN_C
  291.  
  292. /* For UNIX compatibility. */
  293.  
  294. extern  uid_t    getuid(void);
  295. extern  gid_t    getgid(void);
  296. extern  uid_t    geteuid(void);
  297. extern  gid_t    getegid(void);
  298. extern  int    setuid(uid_t uid);
  299. extern  int    setgid(gid_t gid);
  300. extern  int    kill(int pid, int sig);
  301. extern  void    *sbrk(int need);
  302. extern    char *    getlogin(void);
  303. extern    int    chown(const char *p, uid_t o, gid_t g);
  304.  
  305. #undef     Stat
  306. #define  Stat        win32_stat
  307.  
  308. #undef   init_os_extras
  309. #define  init_os_extras Perl_init_os_extras
  310.  
  311. DllExport void        Perl_win32_init(int *argcp, char ***argvp);
  312. DllExport void        Perl_init_os_extras(void);
  313. DllExport void        win32_str_os_error(void *sv, DWORD err);
  314. DllExport int        RunPerl(int argc, char **argv, char **env);
  315.  
  316. typedef struct {
  317.     HANDLE    childStdIn;
  318.     HANDLE    childStdOut;
  319.     HANDLE    childStdErr;
  320.     /*
  321.      * the following correspond to the fields of the same name
  322.      * in the STARTUPINFO structure. Embedders can use these to
  323.      * control the spawning process' look.
  324.      * Example - to hide the window of the spawned process:
  325.      *    dwFlags = STARTF_USESHOWWINDOW;
  326.      *      wShowWindow = SW_HIDE;
  327.      */
  328.     DWORD    dwFlags;
  329.     DWORD    dwX; 
  330.     DWORD    dwY; 
  331.     DWORD    dwXSize; 
  332.     DWORD    dwYSize; 
  333.     DWORD    dwXCountChars; 
  334.     DWORD    dwYCountChars; 
  335.     DWORD    dwFillAttribute;
  336.     WORD    wShowWindow; 
  337. } child_IO_table;
  338.  
  339. DllExport void        win32_get_child_IO(child_IO_table* ptr);
  340.  
  341. #ifndef USE_SOCKETS_AS_HANDLES
  342. extern FILE *        my_fdopen(int, char *);
  343. #endif
  344. extern int        my_fclose(FILE *);
  345. extern int        my_fstat(int fd, struct stat *sbufptr);
  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. #if defined(USE_ITHREADS) || defined(PERL_OBJECT)
  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.