home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / perl560.zip / win32 / win32.h < prev    next >
C/C++ Source or Header  |  2000-03-15  |  14KB  |  488 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. #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.  
  79. struct 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.  
  90. struct 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.  
  195. typedef long        uid_t;
  196. typedef long        gid_t;
  197. typedef 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.  
  207. typedef long        uid_t;
  208. typedef 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 \
  238. struct 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.  
  275. START_EXTERN_C
  276.  
  277. /* For UNIX compatibility. */
  278.  
  279. extern  uid_t    getuid(void);
  280. extern  gid_t    getgid(void);
  281. extern  uid_t    geteuid(void);
  282. extern  gid_t    getegid(void);
  283. extern  int    setuid(uid_t uid);
  284. extern  int    setgid(gid_t gid);
  285. extern  int    kill(int pid, int sig);
  286. extern  void    *sbrk(int need);
  287. extern    char *    getlogin(void);
  288. extern    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.  
  296. DllExport void        Perl_win32_init(int *argcp, char ***argvp);
  297. DllExport void        Perl_init_os_extras();
  298. DllExport void        win32_str_os_error(void *sv, DWORD err);
  299. DllExport int        RunPerl(int argc, char **argv, char **env);
  300.  
  301. typedef 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.  
  324. DllExport void        win32_get_child_IO(child_IO_table* ptr);
  325.  
  326. #ifndef USE_SOCKETS_AS_HANDLES
  327. extern FILE *        my_fdopen(int, char *);
  328. #endif
  329. extern int        my_fclose(FILE *);
  330. extern int        do_aspawn(void *really, void **mark, void **sp);
  331. extern int        do_spawn(char *cmd);
  332. extern int        do_spawn_nowait(char *cmd);
  333. extern char *        win32_get_privlib(const char *pl);
  334. extern char *        win32_get_sitelib(const char *pl);
  335. extern char *        win32_get_vendorlib(const char *pl);
  336. extern int        IsWin95(void);
  337. extern int        IsWinNT(void);
  338. extern void        win32_argv2utf8(int argc, char** argv);
  339.  
  340. #ifdef PERL_IMPLICIT_SYS
  341. extern void        win32_delete_internal_host(void *h);
  342. #endif
  343.  
  344. extern char *        staticlinkmodules[];
  345.  
  346. END_EXTERN_C
  347.  
  348. typedef  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.  
  376. struct 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
  399. typedef struct {
  400.     long    num;
  401.     DWORD    pids[MAXIMUM_WAIT_OBJECTS];
  402.     HANDLE    handles[MAXIMUM_WAIT_OBJECTS];
  403. } child_tab;
  404.  
  405. struct 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.  
  488.