Egregious IOsubsystem code excised. Phew, what a relief! Two
Gurusamy Sarathy [Wed, 12 Nov 1997 07:40:54 +0000 (07:40 +0000)]
files (win32/win32io.[ch]) completely removed, as are all traces
of them in makefiles and MANIFEST.  RunPerl() retains the void* arg
for later. Various myfoo() things regularized to my_foo().  CPP not
required anymore to create a perl binary :)

p4raw-id: //depot/win32/perl@242

12 files changed:
MANIFEST
win32/Makefile
win32/makedef.pl
win32/makefile.mk
win32/perllib.c
win32/runperl.c
win32/win32.c
win32/win32.h
win32/win32io.c
win32/win32io.h
win32/win32iop.h
win32/win32sck.c

index 53ffcab..a82fd45 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -880,8 +880,6 @@ win32/runperl.c             Win32 port
 win32/splittree.pl     Win32 port
 win32/win32.c          Win32 port
 win32/win32.h          Win32 port
-win32/win32io.c                Win32 port
-win32/win32io.h                Win32 port
 win32/win32iop.h       Win32 port
 win32/win32sck.c       Win32 port
 win32/win32thread.h    Win32 port mapping to threads
index ba02106..5d24130 100644 (file)
@@ -60,7 +60,7 @@ LIBC = msvcrt.lib
 WINIOMAYBE =
 !ELSE
 LIBC = libcmt.lib
-WINIOMAYBE = win32io.obj
+WINIOMAYBE =
 !ENDIF
 
 !IF  "$(CFG)" == "Debug"
@@ -197,18 +197,15 @@ CORE_OBJ= ..\av.obj       \
 
 WIN32_C = perllib.c \
        win32.c \
-       win32io.c \
        win32sck.c \
        win32thread.c 
 
 WIN32_OBJ = win32.obj \
-       win32io.obj \
        win32sck.obj \
        win32thread.obj 
 
 PERL95_OBJ = perl95.obj \
        win32mt.obj \
-       win32iomt.obj \
        win32sckmt.obj
 
 DLL_OBJ = perllib.obj $(DYNALOADER).obj
@@ -363,8 +360,6 @@ $(PERLEXE): $(PERLDLL) $(CONFIGPM) perlmain.obj
        del perl.exe
        copy splittree.pl .. 
        $(MINIPERL) -I..\lib ..\splittree.pl "../LIB" "../LIB/auto"
-#      attrib -r ..\t\*.*
-#      copy test ..\t
 
 perl95.c : runperl.c 
        copy runperl.c perl95.c
@@ -372,9 +367,6 @@ perl95.c : runperl.c
 perl95.obj : perl95.c
        $(CC) $(CFLAGS) -MT -UPERLDLL -c perl95.c
 
-win32iomt.obj : win32io.c
-       $(CC) $(CFLAGS) -MT -c $(OBJOUT_FLAG)win32iomt.obj win32io.c
-
 win32sckmt.obj : win32sck.c
        $(CC) $(CFLAGS) -MT -c $(OBJOUT_FLAG)win32sckmt.obj win32sck.c
 
index 31686d2..fd2a99c 100644 (file)
@@ -397,8 +397,5 @@ win32_realloc
 win32_free
 win32_open_osfhandle
 win32_get_osfhandle
-win32stdio
 Perl_win32_init
 RunPerl
-SetIOSubSystem
-GetIOSubSystem
index e7c3857..35baed5 100644 (file)
@@ -105,7 +105,7 @@ LIBC = msvcrt.lib
 WINIOMAYBE =
 .ELSE
 LIBC = libcmt.lib
-WINIOMAYBE = win32io.obj
+WINIOMAYBE =
 .ENDIF
 
 .IF  "$(CFG)" == "Debug"
@@ -265,18 +265,15 @@ CORE_OBJ= ..\av.obj       \
 
 WIN32_C = perllib.c \
        win32.c \
-       win32io.c \
        win32sck.c \
        win32thread.c 
 
 WIN32_OBJ = win32.obj \
-       win32io.obj \
        win32sck.obj \
        win32thread.obj
 
 PERL95_OBJ = perl95.obj \
        win32mt.obj \
-       win32iomt.obj \
        win32sckmt.obj
 
 DLL_OBJ = perllib.obj $(DYNALOADER).obj
@@ -460,8 +457,6 @@ $(PERLEXE): $(PERLDLL) $(CONFIGPM) perlmain.obj
 .ENDIF
        copy splittree.pl .. 
        $(MINIPERL) -I..\lib ..\splittree.pl "../LIB" "../LIB/auto"
-#      attrib -r ..\t\*.*
-#      copy test ..\t
 
 .IF "$(CCTYPE)" != "BORLAND"
 
@@ -471,9 +466,6 @@ perl95.c : runperl.c
 perl95.obj : perl95.c
        $(CC) $(CFLAGS) -MT -UPERLDLL -c perl95.c
 
-win32iomt.obj : win32io.c
-       $(CC) $(CFLAGS) -MT -c $(OBJOUT_FLAG)win32iomt.obj win32io.c
-
 win32sckmt.obj : win32sck.c
        $(CC) $(CFLAGS) -MT -c $(OBJOUT_FLAG)win32sckmt.obj win32sck.c
 
index 56cba54..8483606 100644 (file)
@@ -14,9 +14,6 @@ RunPerl(int argc, char **argv, char **env, void *iosubsystem)
 {
     int exitstatus;
     PerlInterpreter *my_perl;
-    void *pOldIOSubsystem;
-
-    pOldIOSubsystem = SetIOSubSystem(iosubsystem);
 
     PERL_SYS_INIT(&argc,&argv);
 
@@ -37,8 +34,6 @@ RunPerl(int argc, char **argv, char **env, void *iosubsystem)
 
     PERL_SYS_TERM();
 
-    SetIOSubSystem(pOldIOSubsystem);
-
     return (exitstatus);
 }
 
index 07e2bd6..6f84c60 100644 (file)
@@ -1,18 +1,9 @@
-#include <stdio.h>
-#include <win32io.h>
+/* Say NO to CPP! Hallelujah! */
 
-#ifndef _DLL
-extern WIN32_IOSUBSYSTEM win32stdio;
-#endif
-
-extern int RunPerl(int argc, char **argv, char **env, void *iosubsystem);
+__declspec(dllimport) int RunPerl(int argc, char **argv, char **env, void *ios);
 
 int
 main(int argc, char **argv, char **env)
 {
-#ifdef _DLL
-    return (RunPerl(argc, argv, env, NULL));
-#else
-    return (RunPerl(argc, argv, env, &win32stdio));
-#endif
+    return RunPerl(argc, argv, env, (void*)0);
 }
index 6d04d4a..a73d9e6 100644 (file)
@@ -36,9 +36,6 @@
 
 static DWORD IdOS(void);
 
-extern WIN32_IOSUBSYSTEM       win32stdio;
-static PWIN32_IOSUBSYSTEM pIOSubSystem = &win32stdio;
-
 BOOL  ProbeEnv = FALSE;
 DWORD Win32System = (DWORD)-1;
 char  szShellPath[MAX_PATH+1];
@@ -57,29 +54,6 @@ IsWinNT(void) {
     return (IdOS() == VER_PLATFORM_WIN32_NT);
 }
 
-DllExport PWIN32_IOSUBSYSTEM
-SetIOSubSystem(void *p)
-{
-    PWIN32_IOSUBSYSTEM old = pIOSubSystem;
-    if (p) {
-       PWIN32_IOSUBSYSTEM pio = (PWIN32_IOSUBSYSTEM)p;
-       if (pio->signature_begin == 12345678L
-           && pio->signature_end == 87654321L) {
-           pIOSubSystem = pio;
-       }
-    }
-    else {
-       pIOSubSystem = &win32stdio;
-    }
-    return old;
-}
-
-DllExport PWIN32_IOSUBSYSTEM
-GetIOSubSystem(void)
-{
-    return pIOSubSystem;
-}
-
 char *
 win32PerlLibPath(void)
 {
@@ -640,7 +614,7 @@ win32_stat(const char *path, struct stat *buffer)
            };
        }
     }
-    res = pIOSubSystem->pfnstat(p,buffer);
+    res = stat(p,buffer);
 #ifdef __BORLANDC__
     if (res == 0) {
        if (S_ISDIR(buffer->st_mode))
@@ -698,7 +672,7 @@ FileTimeToClock(PFILETIME ft)
 
 #undef times
 int
-mytimes(struct tms *timebuf)
+my_times(struct tms *timebuf)
 {
     FILETIME user;
     FILETIME kernel;
@@ -733,7 +707,7 @@ static VOID CALLBACK TimerProc(HWND win, UINT msg, UINT id, DWORD time)
 
 #undef alarm
 unsigned int
-myalarm(unsigned int sec)
+my_alarm(unsigned int sec)
 {
     /* 
      * the 'obvious' implentation is SetTimer() with a callback
@@ -761,6 +735,157 @@ myalarm(unsigned int sec)
     return 0;
 }
 
+#if defined(_DLL) || !defined(_MSC_VER)
+/* It may or may not be fixed (ok on NT), but DLL runtime
+   does not export the functions used in the workround
+*/
+#define WIN95_OSFHANDLE_FIXED
+#endif
+
+#if defined(_WIN32) && !defined(WIN95_OSFHANDLE_FIXED) && defined(_M_IX86)
+
+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);
+
+#if    (_MSC_VER >= 1000)
+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;
+
+EXTERN_C ioinfo * __pioinfo[];
+
+#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)
+
+#else  /* (_MSC_VER >= 1000) */
+extern char _osfile[];
+#endif /* (_MSC_VER >= 1000) */
+
+#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
+*
+*Entry:
+*       long osfhandle - Win32 HANDLE to associate with C Runtime file handle.
+*       int flags      - flags to associate with C Runtime file handle.
+*
+*Exit:
+*       returns index of entry in fh, if successful
+*       return -1, if no free entry is found
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+static int
+my_open_osfhandle(long osfhandle, int flags)
+{
+    int fh;
+    char fileflags;            /* _osfile flags */
+
+    /* copy relevant flags from second parameter */
+    fileflags = FDEV;
+
+    if(flags & O_APPEND)
+       fileflags |= FAPPEND;
+
+    if(flags & O_TEXT)
+       fileflags |= FTEXT;
+
+    /* attempt to allocate a C Runtime file handle */
+    if((fh = _alloc_osfhnd()) == -1) {
+       errno = EMFILE;         /* too many open files */
+       _doserrno = 0L;         /* not an OS error */
+       return -1;              /* return error to caller */
+    }
+
+    /* the file is open. now, set the info in _osfhnd array */
+    _set_osfhnd(fh, osfhandle);
+
+    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
+
+    return fh;                 /* return handle */
+}
+
+#define _open_osfhandle my_open_osfhandle
+#endif /* _M_IX86 */
+
+/* simulate flock by locking a range on the file */
+
+#define LK_ERR(f,i)    ((f) ? (i = 0) : (errno = GetLastError()))
+#define LK_LEN         0xffff0000
+
+int
+my_flock(int fd, int oper)
+{
+    OVERLAPPED o;
+    int i = -1;
+    HANDLE fh;
+
+    fh = (HANDLE)_get_osfhandle(fd);
+    memset(&o, 0, sizeof(o));
+
+    switch(oper) {
+    case LOCK_SH:              /* shared lock */
+       LK_ERR(LockFileEx(fh, 0, 0, LK_LEN, 0, &o),i);
+       break;
+    case LOCK_EX:              /* exclusive lock */
+       LK_ERR(LockFileEx(fh, LOCKFILE_EXCLUSIVE_LOCK, 0, LK_LEN, 0, &o),i);
+       break;
+    case LOCK_SH|LOCK_NB:      /* non-blocking shared lock */
+       LK_ERR(LockFileEx(fh, LOCKFILE_FAIL_IMMEDIATELY, 0, LK_LEN, 0, &o),i);
+       break;
+    case LOCK_EX|LOCK_NB:      /* non-blocking exclusive lock */
+       LK_ERR(LockFileEx(fh,
+                      LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY,
+                      0, LK_LEN, 0, &o),i);
+       break;
+    case LOCK_UN:              /* unlock lock */
+       LK_ERR(UnlockFileEx(fh, 0, LK_LEN, 0, &o),i);
+       break;
+    default:                   /* unknown */
+       errno = EINVAL;
+       break;
+    }
+    return i;
+}
+
+#undef LK_ERR
+#undef LK_LEN
+
 /*
  *  redirected io subsystem for all XS modules
  *
@@ -769,45 +894,45 @@ myalarm(unsigned int sec)
 DllExport int *
 win32_errno(void)
 {
-    return (pIOSubSystem->pfnerrno());
+    return (&errno);
 }
 
 DllExport char ***
 win32_environ(void)
 {
-    return (pIOSubSystem->pfnenviron());
+    return (&(_environ));
 }
 
 /* the rest are the remapped stdio routines */
 DllExport FILE *
 win32_stderr(void)
 {
-    return (pIOSubSystem->pfnstderr());
+    return (stderr);
 }
 
 DllExport FILE *
 win32_stdin(void)
 {
-    return (pIOSubSystem->pfnstdin());
+    return (stdin);
 }
 
 DllExport FILE *
 win32_stdout()
 {
-    return (pIOSubSystem->pfnstdout());
+    return (stdout);
 }
 
 DllExport int
 win32_ferror(FILE *fp)
 {
-    return (pIOSubSystem->pfnferror(fp));
+    return (ferror(fp));
 }
 
 
 DllExport int
 win32_feof(FILE *fp)
 {
-    return (pIOSubSystem->pfnfeof(fp));
+    return (feof(fp));
 }
 
 /*
@@ -836,7 +961,7 @@ win32_strerror(int e)
 
        return strerror_buffer;
     }
-    return pIOSubSystem->pfnstrerror(e);
+    return strerror(e);
 }
 
 DllExport int
@@ -845,7 +970,7 @@ win32_fprintf(FILE *fp, const char *format, ...)
     va_list marker;
     va_start(marker, format);     /* Initialize variable arguments. */
 
-    return (pIOSubSystem->pfnvfprintf(fp, format, marker));
+    return (vfprintf(fp, format, marker));
 }
 
 DllExport int
@@ -854,188 +979,188 @@ win32_printf(const char *format, ...)
     va_list marker;
     va_start(marker, format);     /* Initialize variable arguments. */
 
-    return (pIOSubSystem->pfnvprintf(format, marker));
+    return (vprintf(format, marker));
 }
 
 DllExport int
 win32_vfprintf(FILE *fp, const char *format, va_list args)
 {
-    return (pIOSubSystem->pfnvfprintf(fp, format, args));
+    return (vfprintf(fp, format, args));
 }
 
 DllExport int
 win32_vprintf(const char *format, va_list args)
 {
-    return (pIOSubSystem->pfnvprintf(format, args));
+    return (vprintf(format, args));
 }
 
 DllExport size_t
 win32_fread(void *buf, size_t size, size_t count, FILE *fp)
 {
-    return pIOSubSystem->pfnfread(buf, size, count, fp);
+    return fread(buf, size, count, fp);
 }
 
 DllExport size_t
 win32_fwrite(const void *buf, size_t size, size_t count, FILE *fp)
 {
-    return pIOSubSystem->pfnfwrite(buf, size, count, fp);
+    return fwrite(buf, size, count, fp);
 }
 
 DllExport FILE *
 win32_fopen(const char *filename, const char *mode)
 {
     if (stricmp(filename, "/dev/null")==0)
-       return pIOSubSystem->pfnfopen("NUL", mode);
-    return pIOSubSystem->pfnfopen(filename, mode);
+       return fopen("NUL", mode);
+    return fopen(filename, mode);
 }
 
 DllExport FILE *
 win32_fdopen( int handle, const char *mode)
 {
-    return pIOSubSystem->pfnfdopen(handle, (char *) mode);
+    return fdopen(handle, (char *) mode);
 }
 
 DllExport FILE *
 win32_freopen( const char *path, const char *mode, FILE *stream)
 {
     if (stricmp(path, "/dev/null")==0)
-       return pIOSubSystem->pfnfreopen("NUL", mode, stream);
-    return pIOSubSystem->pfnfreopen(path, mode, stream);
+       return freopen("NUL", mode, stream);
+    return freopen(path, mode, stream);
 }
 
 DllExport int
 win32_fclose(FILE *pf)
 {
-    return pIOSubSystem->pfnfclose(pf);
+    return my_fclose(pf);
 }
 
 DllExport int
 win32_fputs(const char *s,FILE *pf)
 {
-    return pIOSubSystem->pfnfputs(s, pf);
+    return fputs(s, pf);
 }
 
 DllExport int
 win32_fputc(int c,FILE *pf)
 {
-    return pIOSubSystem->pfnfputc(c,pf);
+    return fputc(c,pf);
 }
 
 DllExport int
 win32_ungetc(int c,FILE *pf)
 {
-    return pIOSubSystem->pfnungetc(c,pf);
+    return ungetc(c,pf);
 }
 
 DllExport int
 win32_getc(FILE *pf)
 {
-    return pIOSubSystem->pfngetc(pf);
+    return getc(pf);
 }
 
 DllExport int
 win32_fileno(FILE *pf)
 {
-    return pIOSubSystem->pfnfileno(pf);
+    return fileno(pf);
 }
 
 DllExport void
 win32_clearerr(FILE *pf)
 {
-    pIOSubSystem->pfnclearerr(pf);
+    clearerr(pf);
     return;
 }
 
 DllExport int
 win32_fflush(FILE *pf)
 {
-    return pIOSubSystem->pfnfflush(pf);
+    return fflush(pf);
 }
 
 DllExport long
 win32_ftell(FILE *pf)
 {
-    return pIOSubSystem->pfnftell(pf);
+    return ftell(pf);
 }
 
 DllExport int
 win32_fseek(FILE *pf,long offset,int origin)
 {
-    return pIOSubSystem->pfnfseek(pf, offset, origin);
+    return fseek(pf, offset, origin);
 }
 
 DllExport int
 win32_fgetpos(FILE *pf,fpos_t *p)
 {
-    return pIOSubSystem->pfnfgetpos(pf, p);
+    return fgetpos(pf, p);
 }
 
 DllExport int
 win32_fsetpos(FILE *pf,const fpos_t *p)
 {
-    return pIOSubSystem->pfnfsetpos(pf, p);
+    return fsetpos(pf, p);
 }
 
 DllExport void
 win32_rewind(FILE *pf)
 {
-    pIOSubSystem->pfnrewind(pf);
+    rewind(pf);
     return;
 }
 
 DllExport FILE*
 win32_tmpfile(void)
 {
-    return pIOSubSystem->pfntmpfile();
+    return tmpfile();
 }
 
 DllExport void
 win32_abort(void)
 {
-    pIOSubSystem->pfnabort();
+    abort();
     return;
 }
 
 DllExport int
 win32_fstat(int fd,struct stat *bufptr)
 {
-    return pIOSubSystem->pfnfstat(fd,bufptr);
+    return fstat(fd,bufptr);
 }
 
 DllExport int
 win32_pipe(int *pfd, unsigned int size, int mode)
 {
-    return pIOSubSystem->pfnpipe(pfd, size, mode);
+    return _pipe(pfd, size, mode);
 }
 
 DllExport FILE*
 win32_popen(const char *command, const char *mode)
 {
-    return pIOSubSystem->pfnpopen(command, mode);
+    return _popen(command, mode);
 }
 
 DllExport int
 win32_pclose(FILE *pf)
 {
-    return pIOSubSystem->pfnpclose(pf);
+    return _pclose(pf);
 }
 
 DllExport int
 win32_setmode(int fd, int mode)
 {
-    return pIOSubSystem->pfnsetmode(fd, mode);
+    return setmode(fd, mode);
 }
 
 DllExport long
 win32_lseek(int fd, long offset, int origin)
 {
-    return pIOSubSystem->pfnlseek(fd, offset, origin);
+    return lseek(fd, offset, origin);
 }
 
 DllExport long
 win32_tell(int fd)
 {
-    return pIOSubSystem->pfntell(fd);
+    return tell(fd);
 }
 
 DllExport int
@@ -1049,182 +1174,182 @@ win32_open(const char *path, int flag, ...)
     va_end(ap);
 
     if (stricmp(path, "/dev/null")==0)
-       return pIOSubSystem->pfnopen("NUL", flag, pmode);
-    return pIOSubSystem->pfnopen(path,flag,pmode);
+       return open("NUL", flag, pmode);
+    return open(path,flag,pmode);
 }
 
 DllExport int
 win32_close(int fd)
 {
-    return pIOSubSystem->pfnclose(fd);
+    return close(fd);
 }
 
 DllExport int
 win32_eof(int fd)
 {
-    return pIOSubSystem->pfneof(fd);
+    return eof(fd);
 }
 
 DllExport int
 win32_dup(int fd)
 {
-    return pIOSubSystem->pfndup(fd);
+    return dup(fd);
 }
 
 DllExport int
 win32_dup2(int fd1,int fd2)
 {
-    return pIOSubSystem->pfndup2(fd1,fd2);
+    return dup2(fd1,fd2);
 }
 
 DllExport int
 win32_read(int fd, void *buf, unsigned int cnt)
 {
-    return pIOSubSystem->pfnread(fd, buf, cnt);
+    return read(fd, buf, cnt);
 }
 
 DllExport int
 win32_write(int fd, const void *buf, unsigned int cnt)
 {
-    return pIOSubSystem->pfnwrite(fd, buf, cnt);
+    return write(fd, buf, cnt);
 }
 
 DllExport int
 win32_mkdir(const char *dir, int mode)
 {
-    return pIOSubSystem->pfnmkdir(dir); /* just ignore mode */
+    return mkdir(dir); /* just ignore mode */
 }
 
 DllExport int
 win32_rmdir(const char *dir)
 {
-    return pIOSubSystem->pfnrmdir(dir);
+    return rmdir(dir);
 }
 
 DllExport int
 win32_chdir(const char *dir)
 {
-    return pIOSubSystem->pfnchdir(dir);
+    return chdir(dir);
 }
 
 DllExport int
 win32_spawnvp(int mode, const char *cmdname, const char *const *argv)
 {
-    return pIOSubSystem->pfnspawnvp(mode, cmdname, (char * const *) argv);
+    return spawnvp(mode, cmdname, (char * const *) argv);
 }
 
 DllExport int
 win32_execvp(const char *cmdname, const char *const *argv)
 {
-    return pIOSubSystem->pfnexecvp(cmdname, (char *const *)argv);
+    return execvp(cmdname, (char *const *)argv);
 }
 
 DllExport void
 win32_perror(const char *str)
 {
-    pIOSubSystem->pfnperror(str);
+    perror(str);
 }
 
 DllExport void
 win32_setbuf(FILE *pf, char *buf)
 {
-    pIOSubSystem->pfnsetbuf(pf, buf);
+    setbuf(pf, buf);
 }
 
 DllExport int
 win32_setvbuf(FILE *pf, char *buf, int type, size_t size)
 {
-    return pIOSubSystem->pfnsetvbuf(pf, buf, type, size);
+    return setvbuf(pf, buf, type, size);
 }
 
 DllExport int
 win32_flushall(void)
 {
-    return pIOSubSystem->pfnflushall();
+    return flushall();
 }
 
 DllExport int
 win32_fcloseall(void)
 {
-    return pIOSubSystem->pfnfcloseall();
+    return fcloseall();
 }
 
 DllExport char*
 win32_fgets(char *s, int n, FILE *pf)
 {
-    return pIOSubSystem->pfnfgets(s, n, pf);
+    return fgets(s, n, pf);
 }
 
 DllExport char*
 win32_gets(char *s)
 {
-    return pIOSubSystem->pfngets(s);
+    return gets(s);
 }
 
 DllExport int
 win32_fgetc(FILE *pf)
 {
-    return pIOSubSystem->pfnfgetc(pf);
+    return fgetc(pf);
 }
 
 DllExport int
 win32_putc(int c, FILE *pf)
 {
-    return pIOSubSystem->pfnputc(c,pf);
+    return putc(c,pf);
 }
 
 DllExport int
 win32_puts(const char *s)
 {
-    return pIOSubSystem->pfnputs(s);
+    return puts(s);
 }
 
 DllExport int
 win32_getchar(void)
 {
-    return pIOSubSystem->pfngetchar();
+    return getchar();
 }
 
 DllExport int
 win32_putchar(int c)
 {
-    return pIOSubSystem->pfnputchar(c);
+    return putchar(c);
 }
 
 DllExport void*
 win32_malloc(size_t size)
 {
-    return pIOSubSystem->pfnmalloc(size);
+    return malloc(size);
 }
 
 DllExport void*
 win32_calloc(size_t numitems, size_t size)
 {
-    return pIOSubSystem->pfncalloc(numitems,size);
+    return calloc(numitems,size);
 }
 
 DllExport void*
 win32_realloc(void *block, size_t size)
 {
-    return pIOSubSystem->pfnrealloc(block,size);
+    return realloc(block,size);
 }
 
 DllExport void
 win32_free(void *block)
 {
-    pIOSubSystem->pfnfree(block);
+    free(block);
 }
 
 int
 win32_open_osfhandle(long handle, int flags)
 {
-    return pIOSubSystem->pfn_open_osfhandle(handle, flags);
+    return _open_osfhandle(handle, flags);
 }
 
 long
 win32_get_osfhandle(int fd)
 {
-    return pIOSubSystem->pfn_get_osfhandle(fd);
+    return _get_osfhandle(fd);
 }
 
 /*
@@ -1238,7 +1363,7 @@ win32_flock(int fd, int oper)
        croak("flock() unimplemented on this platform");
        return -1;
     }
-    return pIOSubSystem->pfnflock(fd, oper);
+    return my_flock(fd, oper);
 }
 
 static
index 525ef0f..365fe5e 100644 (file)
 #include <process.h>
 #include <stdio.h>
 #include <direct.h>
+#include <stdlib.h>
+#ifndef EXT
+#include "EXTERN.h"
+#endif
+
+#ifndef START_EXTERN_C
+#ifdef __cplusplus
+#  define START_EXTERN_C extern "C" {
+#  define END_EXTERN_C }
+#  define EXTERN_C extern "C"
+#else
+#  define START_EXTERN_C 
+#  define END_EXTERN_C 
+#  define EXTERN_C
+#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         /* we wanna pretend sockets are FDs */
+/*#define USE_WIN32_RTL_ENV */         /* see note below */
 
 /* For UNIX compatibility. */
 
@@ -52,75 +74,53 @@ typedef long                gid_t;
 
 #endif
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
+START_EXTERN_C
 extern  uid_t  getuid(void);
 extern  gid_t  getgid(void);
 extern  uid_t  geteuid(void);
 extern  gid_t  getegid(void);
 extern  int    setuid(uid_t uid);
 extern  int    setgid(gid_t gid);
-
 extern  int    kill(int pid, int sig);
-
-#ifdef __cplusplus
-}
-#endif
-
+END_EXTERN_C
 
 extern  char   *staticlinkmodules[];
 
+START_EXTERN_C
+
 /* if USE_WIN32_RTL_ENV is not defined, Perl uses direct Win32 calls
  * to read the environment, bypassing the runtime's (usually broken)
  * facilities for accessing the same.  See note in util.c/my_setenv().
  */
-/*#define USE_WIN32_RTL_ENV */
 
 #ifndef USE_WIN32_RTL_ENV
-#include <stdlib.h>
-#ifndef EXT
-#include "EXTERN.h"
-#endif
+EXT char *win32_getenv(const char *name);
 #undef getenv
 #define getenv win32_getenv
-EXT char *win32_getenv(const char *name);
-#endif
-
-#ifdef __cplusplus
-extern "C" {
 #endif
 
-
 EXT void Perl_win32_init(int *argcp, char ***argvp);
 
-#define USE_SOCKETS_AS_HANDLES
 #ifndef USE_SOCKETS_AS_HANDLES
-
-extern FILE *myfdopen(int, char *);
-
+extern FILE *my_fdopen(int, char *);
 #undef fdopen
-#define fdopen myfdopen
+#define fdopen my_fdopen
 #endif /* USE_SOCKETS_AS_HANDLES */
 
-#define  STANDARD_C    1               /* Perl5 likes standard C. */
-#define  DOSISH                1               /* Take advantage of DOSish code in Perl5. */
+#undef fclose
+#define fclose my_fclose
 
-#define  OP_BINARY     O_BINARY        /* Mistake in in pp_sys.c. */
-
-#undef  pipe
-#define  pipe(fd)      win32_pipe((fd), 512, O_BINARY) /* the pipe call is a bit different */
+#undef  pipe           /* win32_pipe() itself calls _pipe() */
+#define  pipe(fd)      win32_pipe((fd), 512, O_BINARY)
 
 #undef  pause
 #define  pause()       sleep((32767L << 16) + 32767)
 
-
 #undef  times
-#define  times mytimes
+#define  times my_times
 
 #undef  alarm
-#define  alarm myalarm
+#define  alarm my_alarm
 
 struct tms {
        long    tms_utime;
@@ -129,19 +129,21 @@ struct tms {
        long    tms_cstime;
 };
 
-unsigned int sleep(unsigned int);
-char *win32PerlLibPath(void);
-char *win32SiteLibPath(void);
-int mytimes(struct tms *timebuf);
-unsigned int myalarm(unsigned int sec);
-int do_aspawn(void* really, void ** mark, void ** arglast);
-int do_spawn(char *cmd);
-char do_exec(char *cmd);
-void init_os_extras(void);
-
-#ifdef __cplusplus
-}
-#endif
+extern unsigned int sleep(unsigned int);
+extern char *win32PerlLibPath(void);
+extern char *win32SiteLibPath(void);
+extern int my_times(struct tms *timebuf);
+extern unsigned int my_alarm(unsigned int sec);
+extern int my_flock(int fd, int oper);
+extern int do_aspawn(void* really, void ** mark, void ** arglast);
+extern int do_spawn(char *cmd);
+extern char do_exec(char *cmd);
+extern void init_os_extras(void);
+extern int my_fclose(FILE *);
+extern int IsWin95(void);
+extern int IsWinNT(void);
+
+END_EXTERN_C
 
 typedef  char *                caddr_t;        /* In malloc.c (core address). */
 
@@ -163,18 +165,6 @@ typedef  char *            caddr_t;        /* In malloc.c (core address). */
 #pragma  warning(disable: 4018 4035 4101 4102 4244 4245 4761)
 #endif
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int IsWin95(void);
-int IsWinNT(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-
 #ifndef VER_PLATFORM_WIN32_WINDOWS     /* VC-2.0 headers dont have this */
 #define VER_PLATFORM_WIN32_WINDOWS     1
 #endif
index b4aacf1..8b13789 100644 (file)
@@ -1,300 +1 @@
-#define WIN32_LEAN_AND_MEAN
-#include <stdio.h>
-extern int my_fclose(FILE *pf);
-#include "EXTERN.h"
-#define WIN32IO_IS_STDIO
-#include <windows.h>
-#include <stdlib.h>
-#include <io.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <fcntl.h>
-#include <assert.h>
-#include <errno.h>
-#include <process.h>
-#include <direct.h>
-
-#include "win32iop.h"
-
-/*
- * The following is just a basic wrapping of the stdio
- *
- *  redirected io subsystem for all XS modules
- */
-
-static int *
-dummy_errno(void)
-{
-    return (&(errno));
-}
-
-static char ***
-dummy_environ(void)
-{
-    return (&(_environ));
-}
-
-/* the rest are the remapped stdio routines */
-static FILE *
-dummy_stderr(void)
-{
-    return stderr;
-}
-
-static FILE *
-dummy_stdin(void)
-{
-    return stdin;
-}
-
-static FILE *
-dummy_stdout(void)
-{
-    return stdout;
-}
-
-static int
-dummy_globalmode(int mode)
-{
-    int o = _fmode;
-    _fmode = mode;
-
-    return o;
-}
-
-#if defined(_DLL) || !defined(_MSC_VER)
-/* It may or may not be fixed (ok on NT), but DLL runtime
-   does not export the functions used in the workround
-*/
-#define WIN95_OSFHANDLE_FIXED
-#endif
-
-#if defined(_WIN32) && !defined(WIN95_OSFHANDLE_FIXED) && defined(_M_IX86)
-
-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);
-
-#if    (_MSC_VER >= 1000)
-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;
-
-EXTERN_C ioinfo * __pioinfo[];
-
-#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)
-
-#else  /* (_MSC_VER >= 1000) */
-extern char _osfile[];
-#endif /* (_MSC_VER >= 1000) */
-
-#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
-*
-*Entry:
-*       long osfhandle - Win32 HANDLE to associate with C Runtime file handle.
-*       int flags      - flags to associate with C Runtime file handle.
-*
-*Exit:
-*       returns index of entry in fh, if successful
-*       return -1, if no free entry is found
-*
-*Exceptions:
-*
-*******************************************************************************/
-
-static int
-my_open_osfhandle(long osfhandle, int flags)
-{
-    int fh;
-    char fileflags;            /* _osfile flags */
-
-    /* copy relevant flags from second parameter */
-    fileflags = FDEV;
-
-    if(flags & O_APPEND)
-       fileflags |= FAPPEND;
-
-    if(flags & O_TEXT)
-       fileflags |= FTEXT;
-
-    /* attempt to allocate a C Runtime file handle */
-    if((fh = _alloc_osfhnd()) == -1) {
-       errno = EMFILE;         /* too many open files */
-       _doserrno = 0L;         /* not an OS error */
-       return -1;              /* return error to caller */
-    }
-
-    /* the file is open. now, set the info in _osfhnd array */
-    _set_osfhnd(fh, osfhandle);
-
-    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
-
-    return fh;                 /* return handle */
-}
-
-#define _open_osfhandle my_open_osfhandle
-#endif /* _M_IX86 */
-
-/* simulate flock by locking a range on the file */
-
-#define LK_ERR(f,i)    ((f) ? (i = 0) : (errno = GetLastError()))
-#define LK_LEN         0xffff0000
-
-int
-my_flock(int fd, int oper)
-{
-    OVERLAPPED o;
-    int i = -1;
-    HANDLE fh;
-
-    fh = (HANDLE)_get_osfhandle(fd);
-    memset(&o, 0, sizeof(o));
-
-    switch(oper) {
-    case LOCK_SH:              /* shared lock */
-       LK_ERR(LockFileEx(fh, 0, 0, LK_LEN, 0, &o),i);
-       break;
-    case LOCK_EX:              /* exclusive lock */
-       LK_ERR(LockFileEx(fh, LOCKFILE_EXCLUSIVE_LOCK, 0, LK_LEN, 0, &o),i);
-       break;
-    case LOCK_SH|LOCK_NB:      /* non-blocking shared lock */
-       LK_ERR(LockFileEx(fh, LOCKFILE_FAIL_IMMEDIATELY, 0, LK_LEN, 0, &o),i);
-       break;
-    case LOCK_EX|LOCK_NB:      /* non-blocking exclusive lock */
-       LK_ERR(LockFileEx(fh,
-                      LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY,
-                      0, LK_LEN, 0, &o),i);
-       break;
-    case LOCK_UN:              /* unlock lock */
-       LK_ERR(UnlockFileEx(fh, 0, LK_LEN, 0, &o),i);
-       break;
-    default:                   /* unknown */
-       errno = EINVAL;
-       break;
-    }
-    return i;
-}
-
-#undef LK_ERR
-#undef LK_LEN
-
-
-#ifdef PERLDLL
-__declspec(dllexport)
-#endif
-WIN32_IOSUBSYSTEM      win32stdio = {
-    12345678L,         /* begin of structure; */
-    dummy_errno,       /* (*pfunc_errno)(void); */
-    dummy_environ,     /* (*pfunc_environ)(void); */
-    dummy_stdin,       /* (*pfunc_stdin)(void); */
-    dummy_stdout,      /* (*pfunc_stdout)(void); */
-    dummy_stderr,      /* (*pfunc_stderr)(void); */
-    ferror,            /* (*pfunc_ferror)(FILE *fp); */
-    feof,              /* (*pfunc_feof)(FILE *fp); */
-    strerror,          /* (*strerror)(int e); */
-    vfprintf,          /* (*pfunc_vfprintf)(FILE *pf, const char *format, va_list arg); */
-    vprintf,           /* (*pfunc_vprintf)(const char *format, va_list arg); */
-    fread,             /* (*pfunc_fread)(void *buf, size_t size, size_t count, FILE *pf); */
-    fwrite,            /* (*pfunc_fwrite)(void *buf, size_t size, size_t count, FILE *pf); */
-    fopen,             /* (*pfunc_fopen)(const char *path, const char *mode); */
-    fdopen,            /* (*pfunc_fdopen)(int fh, const char *mode); */
-    freopen,           /* (*pfunc_freopen)(const char *path, const char *mode, FILE *pf); */
-    my_fclose,         /* (*pfunc_fclose)(FILE *pf); */
-    fputs,             /* (*pfunc_fputs)(const char *s,FILE *pf); */
-    fputc,             /* (*pfunc_fputc)(int c,FILE *pf); */
-    ungetc,            /* (*pfunc_ungetc)(int c,FILE *pf); */
-    getc,              /* (*pfunc_getc)(FILE *pf); */
-    fileno,            /* (*pfunc_fileno)(FILE *pf); */
-    clearerr,          /* (*pfunc_clearerr)(FILE *pf); */
-    fflush,            /* (*pfunc_fflush)(FILE *pf); */
-    ftell,             /* (*pfunc_ftell)(FILE *pf); */
-    fseek,             /* (*pfunc_fseek)(FILE *pf,long offset,int origin); */
-    fgetpos,           /* (*pfunc_fgetpos)(FILE *pf,fpos_t *p); */
-    fsetpos,           /* (*pfunc_fsetpos)(FILE *pf,fpos_t *p); */
-    rewind,            /* (*pfunc_rewind)(FILE *pf); */
-    tmpfile,           /* (*pfunc_tmpfile)(void); */
-    abort,             /* (*pfunc_abort)(void); */
-    fstat,             /* (*pfunc_fstat)(int fd,struct stat *bufptr); */
-    stat,              /* (*pfunc_stat)(const char *name,struct stat *bufptr); */
-    _pipe,             /* (*pfunc_pipe)( int *phandles, unsigned int psize, int textmode ); */
-    _popen,            /* (*pfunc_popen)( const char *command, const char *mode ); */
-    _pclose,           /* (*pfunc_pclose)( FILE *pf); */
-    setmode,           /* (*pfunc_setmode)( int fd, int mode); */
-    lseek,             /* (*pfunc_lseek)( int fd, long offset, int origin); */
-    tell,              /* (*pfunc_tell)( int fd); */
-    dup,               /* (*pfunc_dup)( int fd); */
-    dup2,              /* (*pfunc_dup2)(int h1, int h2); */
-    open,              /* (*pfunc_open)(const char *path, int oflag,...); */
-    close,             /* (*pfunc_close)(int fd); */
-    eof,               /* (*pfunc_eof)(int fd); */
-    read,              /* (*pfunc_read)(int fd, void *buf, unsigned int cnt); */
-    write,             /* (*pfunc_write)(int fd, const void *buf, unsigned int cnt); */
-    dummy_globalmode,  /* (*pfunc_globalmode)(int mode) */
-    _open_osfhandle,
-    _get_osfhandle,
-    spawnvp,
-    mkdir,
-    rmdir,
-    chdir,
-    my_flock,          /* (*pfunc_flock)(int fd, int oper) */
-    execvp,
-    perror,
-    setbuf,
-    setvbuf,
-    flushall,
-    fcloseall,
-    fgets,
-    gets,
-    fgetc,
-    putc,
-    puts,
-    getchar,
-    putchar,
-    fscanf,
-    scanf,
-    malloc,
-    calloc,
-    realloc,
-    free,
-    87654321L,         /* end of structure */
-};
-
-
-
-
 
index 0e849cf..8b13789 100644 (file)
@@ -1,91 +1 @@
-#ifndef WIN32IO_H
-#define WIN32IO_H
-
-#ifdef __BORLANDC__
-#include <stdarg.h>
-#define MSconst
-#else
-#define MSconst const
-#endif
-
-typedef struct {
-int    signature_begin;
-int *  (*pfnerrno)(void);
-char ***(*pfnenviron)(void);
-FILE*  (*pfnstdin)(void);
-FILE*  (*pfnstdout)(void);
-FILE*  (*pfnstderr)(void);
-int    (*pfnferror)(FILE *fp);
-int    (*pfnfeof)(FILE *fp);
-char*  (*pfnstrerror)(int e);
-int    (*pfnvfprintf)(FILE *pf, const char *format, va_list arg);
-int    (*pfnvprintf)(const char *format, va_list arg);
-size_t (*pfnfread)(void *buf, size_t size, size_t count, FILE *pf);
-size_t (*pfnfwrite)(const void *buf, size_t size, size_t count, FILE *pf);
-FILE*  (*pfnfopen)(const char *path, const char *mode);
-FILE*  (*pfnfdopen)(int fh,  MSconst char *mode); 
-FILE*  (*pfnfreopen)(const char *path, const char *mode, FILE *pf);
-int    (*pfnfclose)(FILE *pf);
-int    (*pfnfputs)(const char *s,FILE *pf);
-int    (*pfnfputc)(int c,FILE *pf);
-int    (*pfnungetc)(int c,FILE *pf);
-int    (*pfngetc)(FILE *pf);
-int    (*pfnfileno)(FILE *pf);
-void   (*pfnclearerr)(FILE *pf);
-int    (*pfnfflush)(FILE *pf);
-long   (*pfnftell)(FILE *pf);
-int    (*pfnfseek)(FILE *pf,long offset,int origin);
-int    (*pfnfgetpos)(FILE *pf,fpos_t *p);
-int    (*pfnfsetpos)(FILE *pf,const fpos_t *p);
-void   (*pfnrewind)(FILE *pf);
-FILE*  (*pfntmpfile)(void);
-void   (*pfnabort)(void);
-int    (*pfnfstat)(int fd,struct stat *bufptr);
-int    (*pfnstat)(const char *name,struct stat *bufptr);
-int    (*pfnpipe)( int *phandles, unsigned int psize, int textmode );
-FILE*  (*pfnpopen)( const char *command, const char *mode );
-int    (*pfnpclose)( FILE *pf);
-int    (*pfnsetmode)( int fd, int mode);
-long   (*pfnlseek)( int fd, long offset, int origin);
-long   (*pfntell)( int fd);
-int    (*pfndup)( int fd);
-int    (*pfndup2)(int h1, int h2);
-int    (*pfnopen)(const char *path, int oflag,...);
-int    (*pfnclose)(int fd);
-int    (*pfneof)(int fd);
-int    (*pfnread)(int fd, void *buf, unsigned int cnt);
-int    (*pfnwrite)(int fd, const void *buf, unsigned int cnt);
-int    (*pfnopenmode)(int mode);
-int    (*pfn_open_osfhandle)(long handle, int flags);
-long   (*pfn_get_osfhandle)(int fd);
-int    (*pfnspawnvp)(int mode, const char *cmdname, MSconst char * const *argv);
-int    (*pfnmkdir)(const char *path);
-int    (*pfnrmdir)(const char *path);
-int    (*pfnchdir)(const char *path);
-int    (*pfnflock)(int fd, int oper);
-int    (*pfnexecvp)(const char *cmdname, MSconst char *const *argv);
-void   (*pfnperror)(const char *str);
-void   (*pfnsetbuf)(FILE *pf, char *buf);
-int    (*pfnsetvbuf)(FILE *pf, char *buf, int type, size_t size);
-int    (*pfnflushall)(void);
-int    (*pfnfcloseall)(void);
-char*  (*pfnfgets)(char *s, int n, FILE *pf);
-char*  (*pfngets)(char *s);
-int    (*pfnfgetc)(FILE *pf);
-int    (*pfnputc)(int c, FILE *pf);
-int    (*pfnputs)(const char *s);
-int    (*pfngetchar)(void);
-int    (*pfnputchar)(int c);
-int    (*pfnfscanf)(FILE *pf, const char *format, ...);
-int    (*pfnscanf)(const char *format, ...);
-void*  (*pfnmalloc)(size_t size);
-void*  (*pfncalloc)(size_t numitems, size_t size);
-void*  (*pfnrealloc)(void *block, size_t size);
-void   (*pfnfree)(void *block);
-int    signature_end;
-} WIN32_IOSUBSYSTEM; 
-
-typedef WIN32_IOSUBSYSTEM      *PWIN32_IOSUBSYSTEM;
-
-#endif /* WIN32IO_H */
 
index fd97d66..992eec7 100644 (file)
@@ -21,8 +21,6 @@
 #define LOCK_NB 4
 #define LOCK_UN 8
 
-#include <win32io.h>   /* pull in the io sub system structure */
-
 /*
  * Make this as close to original stdio as possible.
  */
@@ -111,9 +109,6 @@ EXT int             win32_open_osfhandle(long handle, int flags);
 EXT long       win32_get_osfhandle(int fd);
 
 
-EXT PWIN32_IOSUBSYSTEM SetIOSubSystem(void     *piosubsystem);
-EXT PWIN32_IOSUBSYSTEM GetIOSubSystem(void);
-
 END_EXTERN_C
 
 /*
@@ -127,6 +122,7 @@ END_EXTERN_C
 #undef stdout
 #undef ferror
 #undef feof
+#undef fclose
 
 #ifdef __BORLANDC__
 #undef ungetc
@@ -205,8 +201,6 @@ END_EXTERN_C
 #define puts                   win32_puts
 #define getchar                        win32_getchar
 #define putchar                        win32_putchar
-#define fscanf                 (GetIOSubSystem()->pfnfscanf)
-#define scanf                  (GetIOSubSystem()->pfnscanf)
 #define malloc                 win32_malloc
 #define calloc                 win32_calloc
 #define realloc                        win32_realloc
index a0fad00..9de7a14 100644 (file)
@@ -8,14 +8,16 @@
  *    License or the Artistic License, as specified in the README file.
  */
 
-#include <windows.h>
+#define WIN32IO_IS_STDIO
 #define WIN32_LEAN_AND_MEAN
+#include <windows.h>
 #include "EXTERN.h"
 #include "perl.h"
 #include <sys/socket.h>
 #include <fcntl.h>
 #include <sys/stat.h>
 #include <assert.h>
+#include <io.h>
 
 #undef htonl
 #undef htons
@@ -602,17 +604,6 @@ win32_setservent(int stayopen)
     croak("setservent not implemented!\n");
 }
 
-#define WIN32IO_IS_STDIO
-#include <io.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-#include "win32iop.h"
-#ifdef __cplusplus
-}
-#endif
-
 static struct servent*
 win32_savecopyservent(struct servent*d, struct servent*s, const char *proto)
 {