diff options
author | Gurusamy Sarathy <gsar@cpan.org> | 2000-10-09 18:46:54 +0000 |
---|---|---|
committer | Gurusamy Sarathy <gsar@cpan.org> | 2000-10-09 18:46:54 +0000 |
commit | a10b7b7eee64efea010bfdba91243503341ba68d (patch) | |
tree | c315197cd8aec67ebf6d490e93848a5b39ed8dc0 /win32/win32.h | |
parent | 9afd7f9460d27680225b1fcfc96bc64f179140fc (diff) | |
download | perl-a10b7b7eee64efea010bfdba91243503341ba68d.tar.gz |
on Windows, avoid potential exception (could happen if MSVCRT isn't
being used) when closing a socket handle
p4raw-id: //depot/perl@7173
Diffstat (limited to 'win32/win32.h')
-rw-r--r-- | win32/win32.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/win32/win32.h b/win32/win32.h index 61884ab7a7..d9ffbfe1a1 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -493,6 +493,56 @@ struct interp_intern { } STMT_END #endif +#if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX) +#ifdef PERL_CORE + +/* C doesn't like repeat struct definitions */ +#ifndef _CRTIMP +#define _CRTIMP __declspec(dllimport) +#endif + +/* + * Control structure for lowio file handles + */ +typedef struct { + long 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) = (long)osfh) +#endif +#endif + /* * This provides a layer of functions and macros to ensure extensions will * get to use the same RTL functions as the core. |