X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/80e18237757da0670ddbfa6973109e70dbad24f3..HEAD:/win32/win32.h diff --git a/win32/win32.h b/win32/win32.h index 5390df5..193990e 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -1,7 +1,7 @@ /* WIN32.H * * (c) 1995 Microsoft Corporation. All rights reserved. - * Developed by hip communications inc., http://info.hip.com/info/ + * Developed by hip communications inc. * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -10,21 +10,26 @@ #define _INC_WIN32_PERL5 #ifndef _WIN32_WINNT -# define _WIN32_WINNT 0x0400 /* needed for TryEnterCriticalSection() etc. */ +# define _WIN32_WINNT 0x0500 /* needed for CreateHardlink() etc. */ +#endif + +/* Win32 only optimizations for faster building */ +#ifdef PERL_IS_MINIPERL +/* less I/O calls during each require */ +# define PERL_DISABLE_PMC + +/* unnecessary for miniperl to lookup anything from an "installed" perl */ +# define WIN32_NO_REGISTRY + +/* allow minitest to work */ +# define PERL_TEXTMODE_SCRIPTS #endif #if defined(PERL_IMPLICIT_SYS) # define DYNAMIC_ENV_FETCH # define HAS_GETENV_LEN -# define prime_env_iter() # define WIN32IO_IS_STDIO /* don't pull in custom stdio layer */ # define WIN32SCK_IS_STDSCK /* don't pull in custom wsock layer */ -# ifdef PERL_GLOBAL_STRUCT -# error PERL_GLOBAL_STRUCT cannot be defined with PERL_IMPLICIT_SYS -# endif -# define win32_get_privlib PerlEnv_lib_path -# define win32_get_sitelib PerlEnv_sitelib_path -# define win32_get_vendorlib PerlEnv_vendorlib_path #endif #ifdef __GNUC__ @@ -32,32 +37,99 @@ # define __int64 long long # endif # define Win32_Winsock -#ifdef __cplusplus -/* Mingw32 gcc -xc++ objects to __attribute((unused)) at least */ -#undef PERL_UNUSED_DECL -#define PERL_UNUSED_DECL -#endif #endif /* Define DllExport akin to perl's EXT, - * If we are in the DLL or mimicing the DLL for Win95 work round - * then Export the symbol, + * If we are in the DLL then Export the symbol, * otherwise import it. */ /* now even GCC supports __declspec() */ +/* miniperl has no reason to export anything */ +#if defined(PERL_IS_MINIPERL) +# define DllExport +#else +# if defined(PERLDLL) +# define DllExport __declspec(dllexport) +# else +# define DllExport __declspec(dllimport) +# endif +#endif -#if defined(PERLDLL) || defined(WIN95FIX) -#define DllExport -/*#define DllExport __declspec(dllexport)*/ /* noises with VC5+sp3 */ +/* The Perl APIs can only be called directly inside the perl5xx.dll. + * All other code has to import them. By declaring them as "dllimport" + * we tell the compiler to generate an indirect call instruction and + * avoid redirection through a call thunk. + * + * The XS code in the re extension is special, in that it redefines + * core APIs locally, so don't mark them as "dllimport" because GCC + * cannot handle this situation. + * + * Certain old GCCs will not allow the function pointer of dllimport marked + * function to be "const". This was fixed later on. Since this is a + * deoptimization, target "gcc version 3.4.5 (mingw-vista special r3)" only, + * The GCC bug was fixed in GCC patch "varasm.c (initializer_constant_valid_p): + * Don't deny DECL_DLLIMPORT_P on functions", which probably was first released + * in GCC 4.3.0, this #if can be expanded upto but not including 4.3.0 if more + * deployed GCC are found that wont build with the follow error, initializer + * element is a PerlIO func exported from perl5xx.dll. + * + * encoding.xs:610: error: initializer element is not constant + * encoding.xs:610: error: (near initialization for `PerlIO_encode.Open') + */ + +#if (defined(__GNUC__) && defined(__MINGW32__) && \ + !defined(__MINGW64_VERSION_MAJOR) && !defined(__clang__) && \ + ((__GNUC__ < 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ <= 5)))) +/* use default fallbacks from perl.h for this particular GCC */ #else -#define DllExport __declspec(dllimport) +# if !defined(PERLDLL) && !defined(PERL_EXT_RE_BUILD) +# ifdef __cplusplus +# define PERL_CALLCONV extern "C" __declspec(dllimport) +# ifdef _MSC_VER +# define PERL_CALLCONV_NO_RET extern "C" __declspec(dllimport) __declspec(noreturn) +# endif +# else +# define PERL_CALLCONV __declspec(dllimport) +# ifdef _MSC_VER +# define PERL_CALLCONV_NO_RET __declspec(dllimport) __declspec(noreturn) +# endif +# endif +# else /* MSVC noreturn support inside the interp */ +# ifdef _MSC_VER +# define PERL_CALLCONV_NO_RET __declspec(noreturn) +# endif +# endif +#endif + +#ifdef _MSC_VER +# define PERL_STATIC_NO_RET __declspec(noreturn) static +# define PERL_STATIC_INLINE_NO_RET __declspec(noreturn) PERL_STATIC_INLINE +# define PERL_STATIC_FORCE_INLINE __forceinline static +# define PERL_STATIC_FORCE_INLINE_NO_RET __declspec(noreturn) __forceinline static #endif #define WIN32_LEAN_AND_MEAN #include +/* + * Bug in winbase.h in mingw-w64 4.4.0-1 at least... they + * do #define GetEnvironmentStringsA GetEnvironmentStrings and fail + * to declare GetEnvironmentStringsA. + */ +#if defined(__MINGW64__) && defined(GetEnvironmentStringsA) && !defined(UNICODE) +#ifdef __cplusplus +extern "C" { +#endif +#undef GetEnvironmentStringsA +WINBASEAPI LPCH WINAPI GetEnvironmentStringsA(VOID); +#define GetEnvironmentStrings GetEnvironmentStringsA +#ifdef __cplusplus +} +#endif +#endif + #ifdef WIN32_LEAN_AND_MEAN /* C file is NOT a Perl5 original. */ #define CONTEXT PERL_CONTEXT /* Avoid conflict of CONTEXT defs. */ #endif /*WIN32_LEAN_AND_MEAN */ @@ -79,10 +151,10 @@ #endif struct tms { - long tms_utime; - long tms_stime; - long tms_cutime; - long tms_cstime; + long tms_utime; + long tms_stime; + long tms_cutime; + long tms_cstime; }; #ifndef SYS_NMLN @@ -110,52 +182,32 @@ struct utsname { #endif #endif -#define STANDARD_C 1 #define DOSISH 1 /* no escaping our roots */ #define OP_BINARY O_BINARY /* mistake in in pp_sys.c? */ -/* Define USE_SOCKETS_AS_HANDLES to enable emulation of windows sockets as - * real filehandles. XXX Should always be defined (the other version is untested) */ -#define USE_SOCKETS_AS_HANDLES - /* read() and write() aren't transparent for socket handles */ -#define PERL_SOCK_SYSREAD_IS_RECV -#define PERL_SOCK_SYSWRITE_IS_SEND - -#define PERL_NO_FORCE_LINK /* no need for PL_force_link_funcs */ - -/* Define USE_FIXED_OSFHANDLE to fix MSVCRT's _open_osfhandle() on W95. - It now uses some black magic to work seamlessly with the DLL CRT and - works with MSVC++ 4.0+ or GCC/Mingw32 - -- BKS 1-24-2000 */ -#if (defined(_M_IX86) && _MSC_VER >= 1000) || defined(__MINGW32__) -#define USE_FIXED_OSFHANDLE +#ifndef WIN32_NO_SOCKETS +# define PERL_SOCK_SYSREAD_IS_RECV +# define PERL_SOCK_SYSWRITE_IS_SEND #endif -/* Define PERL_WIN32_SOCK_DLOAD to have Perl dynamically load the winsock - DLL when needed. Don't use if your compiler supports delayloading (ie, VC++ 6.0) - -- BKS 5-29-2000 */ -#if !(defined(_M_IX86) && _MSC_VER >= 1200) -#define PERL_WIN32_SOCK_DLOAD +#ifdef WIN32_NO_REGISTRY +/* the last _ in WIN32_NO_REGISTRY_M_ is like the _ in aTHX_ */ +# define WIN32_NO_REGISTRY_M_(x) +#else +# define WIN32_NO_REGISTRY_M_(x) x, #endif + #define ENV_IS_CASELESS #define PIPESOCK_MODE "b" /* pipes, sockets default to binmode */ -#ifndef VER_PLATFORM_WIN32_WINDOWS /* VC-2.0 headers don't have this */ -#define VER_PLATFORM_WIN32_WINDOWS 1 -#endif - -#ifndef FILE_SHARE_DELETE /* VC-4.0 headers don't have this */ -#define FILE_SHARE_DELETE 0x00000004 -#endif - /* access() mode bits */ #ifndef R_OK -# define R_OK 4 -# define W_OK 2 -# define X_OK 1 -# define F_OK 0 +# define R_OK 4 +# define W_OK 2 +# define X_OK 1 +# define F_OK 0 #endif /* for waitpid() */ @@ -167,57 +219,99 @@ struct utsname { /* Compiler-specific stuff. */ -#ifdef __BORLANDC__ /* Borland C++ */ - -#if (__BORLANDC__ <= 0x520) -#define _access access -#define _chdir chdir -#endif - -#define _getpid getpid -#define wcsicmp _wcsicmp -#include - -#ifndef DllMain -#define DllMain DllEntryPoint -#endif - -#pragma warn -ccc /* "condition is always true/false" */ -#pragma warn -rch /* "unreachable code" */ -#pragma warn -sig /* "conversion may lose significant digits" */ -#pragma warn -pia /* "possibly incorrect assignment" */ -#pragma warn -par /* "parameter 'foo' is never used" */ -#pragma warn -aus /* "'foo' is assigned a value that is never used" */ -#pragma warn -use /* "'foo' is declared but never used" */ -#pragma warn -csu /* "comparing signed and unsigned values" */ - -/* Borland C thinks that a pointer to a member variable is 12 bytes in size. */ -#define PERL_MEMBER_PTR_SIZE 12 - -#define isnan _isnan - -#endif +/* VC uses non-standard way to determine the size and alignment if bit-fields */ +/* MinGW will compile with -mms-bitfields, so should use the same types */ +#define PERL_BITFIELD8 U8 +#define PERL_BITFIELD16 U16 +#define PERL_BITFIELD32 U32 #ifdef _MSC_VER /* Microsoft Visual C++ */ typedef long uid_t; typedef long gid_t; typedef unsigned short mode_t; -#pragma warning(disable: 4102) /* "unreferenced label" */ -/* Visual C thinks that a pointer to a member variable is 16 bytes in size. */ -#define PERL_MEMBER_PTR_SIZE 16 - -#define isnan _isnan #define snprintf _snprintf #define vsnprintf _vsnprintf -#if _MSC_VER < 1300 -/* VC6 has broken NaN semantics: NaN == NaN returns true instead of false */ -#define NAN_COMPARE_BROKEN 1 -#endif +MSVC_DIAG_IGNORE(4756 4056) +PERL_STATIC_INLINE +double S_Infinity() { + /* this is a real C literal which can get further constant folded + unlike using HUGE_VAL/_HUGE which are data symbol imports from the CRT + and therefore can not by folded by VC, an example of constant + folding INF is creating -INF */ + return (DBL_MAX+DBL_MAX); +} +MSVC_DIAG_RESTORE + +#define NV_INF S_Infinity() + +/* selectany allows duplicate and unused data symbols to be removed by + VC linker, if this were static, each translation unit will have its own, + usually unused __PL_nan_u, if this were plain extern it will cause link + to fail due to multiple definitions, since we dont know if we are being + compiled as static or DLL XS, selectany simply always works, the cost of + importing __PL_nan_u across DLL boundaries in size in the importing DLL + will be more than the 8 bytes it will take up being in each XS DLL if + that DLL actually uses __PL_nan_u */ +union PerlNan { unsigned __int64 __q; double __d; }; +extern const __declspec(selectany) union PerlNan __PL_nan_u = { 0x7FF8000000000000UI64 }; +#define NV_NAN ((NV)__PL_nan_u.__d) + +#endif /* ifdef _MSC_VER */ + +/* The CRT was rewritten in VS2015. */ +#ifdef _UCRT + +/* No longer declared in stdio.h */ +EXTERN_C char *gets(char* buffer); + +#define tzname _tzname + +/* From corecrt_internal_stdio.h: */ +typedef struct +{ + union + { + FILE _public_file; + char* _ptr; + } u; + + char* _base; + int _cnt; + long _flags; + long _file; + int _charbuf; + int _bufsiz; + char* _tmpfname; + CRITICAL_SECTION _lock; +} __crt_stdio_stream_data; + +#define PERLIO_FILE_flag_RD 0x0001 /* _IOREAD */ +#define PERLIO_FILE_flag_WR 0x0002 /* _IOWRITE */ +#define PERLIO_FILE_flag_RW 0x0004 /* _IOUPDATE */ +#define PERLIO_FILE_ptr(f) (((__crt_stdio_stream_data*)(f))->u._ptr) +#define PERLIO_FILE_base(f) (((__crt_stdio_stream_data*)(f))->_base) +#define PERLIO_FILE_cnt(f) (((__crt_stdio_stream_data*)(f))->_cnt) +#define PERLIO_FILE_flag(f) ((int)(((__crt_stdio_stream_data*)(f))->_flags)) +#define PERLIO_FILE_file(f) (*(int*)(&((__crt_stdio_stream_data*)(f))->_file)) + +#else /* ifdef _UCRT */ + +/* Note: PERLIO_FILE_ptr/base/cnt are not actually used for GCC or _ptr) +#define PERLIO_FILE_base(f) ((f)->_base) +#define PERLIO_FILE_cnt(f) ((f)->_cnt) +#define PERLIO_FILE_flag(f) ((f)->_flag) +#define PERLIO_FILE_file(f) ((f)->_file) -#endif /* _MSC_VER */ +#endif #ifdef __MINGW32__ /* Minimal Gnu-Win32 */ @@ -228,7 +322,9 @@ typedef long gid_t; #endif #define flushall _flushall #define fcloseall _fcloseall +#ifndef isnan #define isnan _isnan /* ...same libraries as MSVC */ +#endif #ifndef _O_NOINHERIT # define _O_NOINHERIT 0x0080 @@ -248,14 +344,11 @@ typedef long gid_t; # endif #endif -#endif /* __MINGW32__ */ - -/* both GCC/Mingw32 and MSVC++ 4.0 are missing this, so we put it here */ #ifndef CP_UTF8 # define CP_UTF8 65001 #endif -/* compatibility stuff for other compilers goes here */ +#endif /* __MINGW32__ */ #ifndef _INTPTR_T_DEFINED typedef int intptr_t; @@ -271,6 +364,7 @@ START_EXTERN_C /* For UNIX compatibility. */ +#ifdef PERL_CORE extern uid_t getuid(void); extern gid_t getgid(void); extern uid_t geteuid(void); @@ -284,7 +378,12 @@ extern void *sbrk(ptrdiff_t need); #endif extern char * getlogin(void); extern int chown(const char *p, uid_t o, gid_t g); +#if((!defined(__MINGW64_VERSION_MAJOR) || __MINGW64_VERSION_MAJOR < 4) && \ + (!defined(__MINGW32_MAJOR_VERSION) || __MINGW32_MAJOR_VERSION < 3 || \ + (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION < 21))) extern int mkstemp(const char *path); +#endif +#endif #undef Stat #define Stat win32_stat @@ -322,25 +421,20 @@ typedef struct { } child_IO_table; DllExport void win32_get_child_IO(child_IO_table* ptr); -DllExport HWND win32_create_message_window(); +DllExport HWND win32_create_message_window(void); +DllExport int win32_async_check(pTHX); -#ifndef USE_SOCKETS_AS_HANDLES -extern FILE * my_fdopen(int, char *); -#endif -extern int my_fclose(FILE *); -extern int my_fstat(int fd, Stat_t *sbufptr); -extern char * win32_get_privlib(const char *pl); -extern char * win32_get_sitelib(const char *pl); -extern char * win32_get_vendorlib(const char *pl); -extern int IsWin95(void); -extern int IsWinNT(void); -extern void win32_argv2utf8(int argc, char** argv); +extern char * win32_get_privlib(WIN32_NO_REGISTRY_M_(const char *pl) STRLEN *const len); +extern char * win32_get_sitelib(const char *pl, STRLEN *const len); +extern char * win32_get_vendorlib(const char *pl, STRLEN *const len); #ifdef PERL_IMPLICIT_SYS extern void win32_delete_internal_host(void *h); #endif -extern char * staticlinkmodules[]; +extern int win32_get_errno(int err); + +extern const char * const staticlinkmodules[]; END_EXTERN_C @@ -354,12 +448,8 @@ typedef char * caddr_t; /* In malloc.c (core address). */ #ifdef MYMALLOC #define EMBEDMYMALLOC /**/ -/* #define USE_PERL_SBRK /**/ -/* #define PERL_SBRK_VIA_MALLOC /**/ -#endif - -#if defined(PERLDLL) && !defined(PERL_CORE) -#define PERL_CORE +/* #define USE_PERL_SBRK / **/ +/* #define PERL_SBRK_VIA_MALLOC / **/ #endif #ifdef PERL_TEXTMODE_SCRIPTS @@ -387,9 +477,8 @@ struct thread_intern { char Wstrerror_buffer[512]; struct servent Wservent; char Wgetlogin_buffer[128]; -# ifdef HAVE_DES_FCRYPT + int Winit_socktype; char Wcrypt_buffer[30]; -# endif # ifdef USE_RTL_THREAD_API void * retv; /* slot for thread return value */ # endif @@ -410,6 +499,7 @@ typedef struct { DWORD pids[MAXIMUM_WAIT_OBJECTS]; HANDLE handles[MAXIMUM_WAIT_OBJECTS]; HWND message_hwnds[MAXIMUM_WAIT_OBJECTS]; + char sigterm[MAXIMUM_WAIT_OBJECTS]; } pseudo_child_tab; #endif @@ -436,8 +526,6 @@ struct interp_intern { Sighandler_t sigtable[SIG_SIZE]; }; -DllExport int win32_async_check(pTHX); - #define WIN32_POLL_INTERVAL 32768 #define PERL_ASYNC_CHECK() if (w32_do_async || PL_sig_pending) win32_async_check(aTHX) @@ -455,6 +543,7 @@ DllExport int win32_async_check(pTHX); #define w32_pseudo_child_pids (w32_pseudo_children->pids) #define w32_pseudo_child_handles (w32_pseudo_children->handles) #define w32_pseudo_child_message_hwnds (w32_pseudo_children->message_hwnds) +#define w32_pseudo_child_sigterm (w32_pseudo_children->sigterm) #define w32_internal_host (PL_sys_intern.internal_host) #define w32_timerid (PL_sys_intern.timerid) #define w32_message_hwnd (PL_sys_intern.message_hwnd) @@ -465,74 +554,13 @@ DllExport int win32_async_check(pTHX); #define w32_getlogin_buffer (PL_sys_intern.thr_intern.Wgetlogin_buffer) #define w32_crypt_buffer (PL_sys_intern.thr_intern.Wcrypt_buffer) #define w32_servent (PL_sys_intern.thr_intern.Wservent) +#define w32_init_socktype (PL_sys_intern.thr_intern.Winit_socktype) #define w32_use_showwindow (PL_sys_intern.thr_intern.Wuse_showwindow) #define w32_showwindow (PL_sys_intern.thr_intern.Wshowwindow) #ifdef USE_ITHREADS -# define PERL_WAIT_FOR_CHILDREN \ - STMT_START { \ - if (w32_pseudo_children && w32_num_pseudo_children) { \ - long children = w32_num_pseudo_children; \ - WaitForMultipleObjects(children, \ - w32_pseudo_child_handles, \ - TRUE, INFINITE); \ - while (children) \ - CloseHandle(w32_pseudo_child_handles[--children]); \ - } \ - } STMT_END -#endif - -#if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX) -#ifdef PERL_CORE - -/* C doesn't like repeat struct definitions */ -#if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION>=3) -#undef _CRTIMP -#endif -#ifndef _CRTIMP -#define _CRTIMP __declspec(dllimport) -#endif - -/* - * Control structure for lowio file handles - */ -typedef struct { - intptr_t osfhnd;/* underlying OS file HANDLE */ - char osfile; /* attributes of file (e.g., open in text mode?) */ - char pipech; /* one char buffer for handles opened on pipes */ - int lockinitflag; - CRITICAL_SECTION lock; -} ioinfo; - - -/* - * Array of arrays of control structures for lowio files. - */ -EXTERN_C _CRTIMP ioinfo* __pioinfo[]; - -/* - * Definition of IOINFO_L2E, the log base 2 of the number of elements in each - * array of ioinfo structs. - */ -#define IOINFO_L2E 5 - -/* - * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array - */ -#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E) - -/* - * Access macros for getting at an ioinfo struct and its fields from a - * file handle - */ -#define _pioinfo(i) (__pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1))) -#define _osfhnd(i) (_pioinfo(i)->osfhnd) -#define _osfile(i) (_pioinfo(i)->osfile) -#define _pipech(i) (_pioinfo(i)->pipech) - -/* since we are not doing a dup2(), this works fine */ -#define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = (intptr_t)osfh) -#endif +void win32_wait_for_children(pTHX); +# define PERL_WAIT_FOR_CHILDREN win32_wait_for_children(aTHX) #endif /* IO.xs and POSIX.xs define PERLIO_NOT_STDIO to 1 */ @@ -541,41 +569,60 @@ EXTERN_C _CRTIMP ioinfo* __pioinfo[]; #endif #define PERLIO_NOT_STDIO 0 -#include "perlio.h" - -/* - * This provides a layer of functions and macros to ensure extensions will - * get to use the same RTL functions as the core. - */ -#include "win32iop.h" - #define EXEC_ARGV_CAST(x) ((const char *const *) x) -#if !defined(ECONNABORTED) && defined(WSAECONNABORTED) -#define ECONNABORTED WSAECONNABORTED -#endif -#if !defined(ECONNRESET) && defined(WSAECONNRESET) -#define ECONNRESET WSAECONNRESET -#endif -#if !defined(EAFNOSUPPORT) && defined(WSAEAFNOSUPPORT) -#define EAFNOSUPPORT WSAEAFNOSUPPORT -#endif -/* Why not needed for ECONNREFUSED? --abe */ - DllExport void *win32_signal_context(void); #define PERL_GET_SIG_CONTEXT win32_signal_context() -#ifdef _WIN_CE -#define Win_GetModuleHandle XCEGetModuleHandleA -#define Win_GetProcAddress XCEGetProcAddressA -#define Win_GetModuleFileName XCEGetModuleFileNameA -#define Win_CreateSemaphore CreateSemaphoreW -#else #define Win_GetModuleHandle GetModuleHandle #define Win_GetProcAddress GetProcAddress #define Win_GetModuleFileName GetModuleFileName #define Win_CreateSemaphore CreateSemaphore + +#if defined(PERL_CORE) && !defined(O_ACCMODE) +# define O_ACCMODE (O_RDWR | O_WRONLY | O_RDONLY) #endif +/* ucrt at least seems to allocate a whole bit per type, + just mask off one bit from the mask for our symlink + and socket file types. +*/ +#define _S_IFLNK ((unsigned)(_S_IFDIR | _S_IFCHR)) +#define _S_IFSOCK ((unsigned)(_S_IFDIR | _S_IFIFO)) +/* mingw64 defines _S_IFBLK to 0x3000 which is _S_IFDIR | _S_IFIFO */ +#ifndef _S_IFBLK +# define _S_IFBLK ((unsigned)(_S_IFCHR | _S_IFIFO)) +#endif +#undef S_ISLNK +#define S_ISLNK(mode) (((mode) & _S_IFMT) == _S_IFLNK) +#undef S_ISSOCK +#define S_ISSOCK(mode) (((mode) & _S_IFMT) == _S_IFSOCK) +#undef S_ISBLK +#define S_ISBLK(mode) (((mode) & _S_IFMT) == _S_IFBLK) + +/* + +The default CRT struct stat uses unsigned short for st_dev and st_ino +which obviously isn't enough, so we define our own structure. + + */ + +typedef DWORD Dev_t; +typedef unsigned __int64 Ino_t; + +struct w32_stat { + Dev_t st_dev; + Ino_t st_ino; + unsigned short st_mode; + DWORD st_nlink; + short st_uid; + short st_gid; + Dev_t st_rdev; + Off_t st_size; + time_t st_atime; + time_t st_mtime; + time_t st_ctime; +}; + #endif /* _INC_WIN32_PERL5 */