summaryrefslogtreecommitdiff
path: root/win32/win32.c
diff options
context:
space:
mode:
authorGurusamy Sarathy <gsar@cpan.org>2000-01-25 22:16:19 +0000
committerGurusamy Sarathy <gsar@cpan.org>2000-01-25 22:16:19 +0000
commit9e5f57defb0d4fe4a23e6e24c3d57478465aea87 (patch)
tree371fb9663ed872510af0234abea4d859703d5524 /win32/win32.c
parent336337397a650655cf01ecfa4aab8aa7e70c42f4 (diff)
downloadperl-9e5f57defb0d4fe4a23e6e24c3d57478465aea87.tar.gz
eliminate need for perl95.exe on Windows 9x by working around CRT
bug internally (from Benjamin Stuhl <sho_pi@hotmail.com>); modified to call the fixed version of open_osfhandle() only on Windows 9x; updated the makefiles and README.win32 to suit p4raw-id: //depot/perl@4892
Diffstat (limited to 'win32/win32.c')
-rw-r--r--win32/win32.c140
1 files changed, 71 insertions, 69 deletions
diff --git a/win32/win32.c b/win32/win32.c
index 22842ea5e8..49a8deee52 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -1747,53 +1747,70 @@ win32_crypt(const char *txt, const char *salt)
#endif
}
-#ifdef USE_FIXED_OSFHANDLE
+/* C doesn't like repeat struct definitions */
+
+#if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX)
-EXTERN_C int __cdecl _alloc_osfhnd(void);
-EXTERN_C int __cdecl _set_osfhnd(int fh, long value);
-EXTERN_C void __cdecl _lock_fhandle(int);
-EXTERN_C void __cdecl _unlock_fhandle(int);
-EXTERN_C void __cdecl _unlock(int);
+#ifndef _CRTIMP
+#define _CRTIMP __declspec(dllimport)
+#endif
-#if (_MSC_VER >= 1000)
-typedef struct {
+/*
+ * 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 */
-#if defined (_MT) && !defined (DLL_FOR_WIN32S)
int lockinitflag;
CRITICAL_SECTION lock;
-#endif /* defined (_MT) && !defined (DLL_FOR_WIN32S) */
-} ioinfo;
+} 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)
-EXTERN_C ioinfo * __pioinfo[];
+/*
+ * 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)
-#define IOINFO_L2E 5
-#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
-#define _pioinfo(i) (__pioinfo[i >> IOINFO_L2E] + (i & (IOINFO_ARRAY_ELTS - 1)))
-#define _osfile(i) (_pioinfo(i)->osfile)
+#endif
-#else /* (_MSC_VER >= 1000) */
-extern char _osfile[];
-#endif /* (_MSC_VER >= 1000) */
+#ifdef USE_FIXED_OSFHANDLE
#define FOPEN 0x01 /* file handle open */
#define FAPPEND 0x20 /* file handle opened O_APPEND */
#define FDEV 0x40 /* file handle refers to device */
#define FTEXT 0x80 /* file handle is in text mode */
-#define _STREAM_LOCKS 26 /* Table of stream locks */
-#define _LAST_STREAM_LOCK (_STREAM_LOCKS+_NSTREAM_-1) /* Last stream lock */
-#define _FH_LOCKS (_LAST_STREAM_LOCK+1) /* Table of fh locks */
-
/***
*int my_open_osfhandle(long osfhandle, int flags) - open C Runtime file handle
*
*Purpose:
* This function allocates a free C Runtime file handle and associates
* it with the Win32 HANDLE specified by the first parameter. This is a
-* temperary fix for WIN95's brain damage GetFileType() error on socket
-* we just bypass that call for socket
+* temperary fix for WIN95's brain damage GetFileType() error on socket
+* we just bypass that call for socket
+*
+* This works with MSVC++ 4.0+ or GCC/Mingw32
*
*Entry:
* long osfhandle - Win32 HANDLE to associate with C Runtime file handle.
@@ -1807,6 +1824,30 @@ extern char _osfile[];
*
*******************************************************************************/
+/*
+ * we fake up some parts of the CRT that aren't exported by MSVCRT.dll
+ * this lets sockets work on Win9X with GCC and should fix the problems
+ * with perl95.exe
+ * -- 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 _alloc_osfhnd()
+{
+ HANDLE hF = CreateFile("NUL", 0, 0, NULL, OPEN_ALWAYS, 0, NULL);
+ int fh = _open_osfhandle(hF, 0);
+ CloseHandle(hF);
+ if (fh == -1)
+ return fh;
+ EnterCriticalSection(&(_pioinfo(fh)->lock));
+ return fh;
+}
+
static int
my_open_osfhandle(long osfhandle, int flags)
{
@@ -1834,18 +1875,12 @@ my_open_osfhandle(long osfhandle, int flags)
fileflags |= FOPEN; /* mark as open */
-#if (_MSC_VER >= 1000)
_osfile(fh) = fileflags; /* set osfile entry */
- _unlock_fhandle(fh);
-#else
- _osfile[fh] = fileflags; /* set osfile entry */
- _unlock(fh+_FH_LOCKS); /* unlock handle */
-#endif
+ LeaveCritiicalSection(&_pioinfo(fh)->lock);
return fh; /* return handle */
}
-#define _open_osfhandle my_open_osfhandle
#endif /* USE_FIXED_OSFHANDLE */
/* simulate flock by locking a range on the file */
@@ -2636,43 +2671,6 @@ win32_dup2(int fd1,int fd2)
#define FTEXT 0x80 /* file handle is in text mode */
#define MAX_DESCRIPTOR_COUNT (64*32) /* this is the maximun that MSVCRT can handle */
-/*
- * 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)
-
int __cdecl _fixed_read(int fh, void *buf, unsigned cnt)
{
int bytes_read; /* number of bytes read */
@@ -3405,6 +3403,10 @@ win32_free(void *block)
int
win32_open_osfhandle(long handle, int flags)
{
+#ifdef USE_FIXED_OSFHANDLE
+ if (IsWin95())
+ return my_open_osfhandle(handle, flags);
+#endif
return _open_osfhandle(handle, flags);
}