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