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 | |
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')
-rw-r--r-- | win32/win32.c | 51 | ||||
-rw-r--r-- | win32/win32.h | 50 | ||||
-rw-r--r-- | win32/win32sck.c | 1 |
3 files changed, 51 insertions, 51 deletions
diff --git a/win32/win32.c b/win32/win32.c index 65d5f661d9..0e4c2e0aef 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -1858,53 +1858,6 @@ win32_crypt(const char *txt, const char *salt) #endif } -/* C doesn't like repeat struct definitions */ - -#if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX) - -#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) - -#endif - #ifdef USE_FIXED_OSFHANDLE #define FOPEN 0x01 /* file handle open */ @@ -1943,10 +1896,6 @@ EXTERN_C _CRTIMP ioinfo* __pioinfo[]; * -- BKS, 1-23-2000 */ -/* since we are not doing a dup2(), this works fine */ - -#define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = osfh) - /* create an ioinfo entry, kill its handle, and steal the entry */ static int 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. diff --git a/win32/win32sck.c b/win32/win32sck.c index 0ce53c376b..594a2e3099 100644 --- a/win32/win32sck.c +++ b/win32/win32sck.c @@ -431,6 +431,7 @@ my_fclose (FILE *pf) win32_fflush(pf); err = closesocket(osf); if (err == 0) { + _set_osfhnd(fileno(pf), INVALID_HANDLE_VALUE); (void)fclose(pf); /* handle already closed, ignore error */ return 0; } |