Sarathy's patch
[p5sagit/p5-mst-13.2.git] / win32 / win32.c
index 6d04d4a..dcdda53 100644 (file)
@@ -11,6 +11,9 @@
 #define WIN32_LEAN_AND_MEAN
 #define WIN32IO_IS_STDIO
 #include <tchar.h>
+#ifdef __GNUC__
+#define Win32_Winsock
+#endif
 #include <windows.h>
 
 /* #include "config.h" */
 #include "XSUB.h"
 #include <fcntl.h>
 #include <sys/stat.h>
+#ifndef __GNUC__
+/* assert.h conflicts with #define of assert in perl.h */
 #include <assert.h>
+#endif
 #include <string.h>
 #include <stdarg.h>
 #include <float.h>
 
+#ifdef __GNUC__
+/* Mingw32 defaults to globing command line 
+ * So we turn it off like this:
+ */
+int _CRT_glob = 0;
+#endif
+
 #define EXECF_EXEC 1
 #define EXECF_SPAWN 2
 #define EXECF_SPAWN_NOWAIT 3
 
 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,54 +67,31 @@ 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)
+win32PerlLibPath(char *sfx,...)
 {
+    va_list ap;
     char *end;
+    va_start(ap,sfx);
     GetModuleFileName((PerlDllHandle == INVALID_HANDLE_VALUE) 
                      ? GetModuleHandle(NULL)
                      : PerlDllHandle,
                      szPerlLibRoot, 
                      sizeof(szPerlLibRoot));
-
     *(end = strrchr(szPerlLibRoot, '\\')) = '\0';
     if (stricmp(end-4,"\\bin") == 0)
      end -= 4;
     strcpy(end,"\\lib");
+    while (sfx)
+     {
+      strcat(end,"\\");
+      strcat(end,sfx);
+      sfx = va_arg(ap,char *);
+     }
+    va_end(ap); 
     return (szPerlLibRoot);
 }
 
-char *
-win32SiteLibPath(void)
-{
-    static char szPerlSiteLib[MAX_PATH+1];
-    strcpy(szPerlSiteLib, win32PerlLibPath());
-    strcat(szPerlSiteLib, "\\site");
-    return (szPerlSiteLib);
-}
 
 BOOL
 HasRedirection(char *ptr)
@@ -558,15 +545,15 @@ getegid(void)
 }
 
 int
-setuid(uid_t uid)
+setuid(uid_t auid)
 { 
-    return (uid == ROOT_UID ? 0 : -1);
+    return (auid == ROOT_UID ? 0 : -1);
 }
 
 int
-setgid(gid_t gid)
+setgid(gid_t agid)
 {
-    return (gid == ROOT_GID ? 0 : -1);
+    return (agid == ROOT_GID ? 0 : -1);
 }
 
 /*
@@ -601,26 +588,13 @@ ioctl(int i, unsigned int u, char *data)
 }
 #endif
 
-unsigned int
-sleep(unsigned int t)
+DllExport unsigned int
+win32_sleep(unsigned int t)
 {
     Sleep(t*1000);
     return 0;
 }
 
-
-#undef rename
-
-int
-myrename(char *OldFileName, char *newname)
-{
-    if(_access(newname, 0) != -1) {    /* file exists */
-       _unlink(newname);
-    }
-    return rename(OldFileName, newname);
-}
-
-
 DllExport int
 win32_stat(const char *path, struct stat *buffer)
 {
@@ -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))
@@ -696,9 +670,8 @@ FileTimeToClock(PFILETIME ft)
  return (long) qw;
 }
 
-#undef times
-int
-mytimes(struct tms *timebuf)
+DllExport int
+win32_times(struct tms *timebuf)
 {
     FILETIME user;
     FILETIME kernel;
@@ -731,9 +704,8 @@ static VOID CALLBACK TimerProc(HWND win, UINT msg, UINT id, DWORD time)
  sighandler(14);
 }
 
-#undef alarm
-unsigned int
-myalarm(unsigned int sec)
+DllExport unsigned int
+win32_alarm(unsigned int sec)
 {
     /* 
      * the 'obvious' implentation is SetTimer() with a callback
@@ -761,6 +733,154 @@ myalarm(unsigned int sec)
     return 0;
 }
 
+#ifdef USE_FIXED_OSFHANDLE
+
+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 /* USE_FIXED_OSFHANDLE */
+
+/* simulate flock by locking a range on the file */
+
+#define LK_ERR(f,i)    ((f) ? (i = 0) : (errno = GetLastError()))
+#define LK_LEN         0xffff0000
+
+DllExport int
+win32_flock(int fd, int oper)
+{
+    OVERLAPPED o;
+    int i = -1;
+    HANDLE fh;
+
+    if (!IsWinNT()) {
+       croak("flock() unimplemented on this platform");
+       return -1;
+    }
+    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 +889,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));
 }
 
 /*
@@ -816,7 +936,15 @@ win32_feof(FILE *fp)
  * we have to roll our own.
  */
 
+#ifdef USE_THREADS
+#ifdef USE_DECLSPEC_THREAD
 __declspec(thread) char        strerror_buffer[512];
+#else
+#define strerror_buffer (thr->i.Wstrerror_buffer)
+#endif
+#else
+char   strerror_buffer[512];
+#endif
 
 DllExport char *
 win32_strerror(int e) 
@@ -827,6 +955,7 @@ win32_strerror(int e)
     DWORD source = 0;
 
     if(e < 0 || e > sys_nerr) {
+        dTHR;
        if(e < 0)
            e = GetLastError();
 
@@ -836,7 +965,7 @@ win32_strerror(int e)
 
        return strerror_buffer;
     }
-    return pIOSubSystem->pfnstrerror(e);
+    return strerror(e);
 }
 
 DllExport int
@@ -845,7 +974,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 +983,193 @@ 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);
 }
 
+#ifndef USE_SOCKETS_AS_HANDLES
+#undef fdopen
+#define fdopen my_fdopen
+#endif
+
 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);      /* defined in win32sck.c */
 }
 
 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)
+win32_fstat(int fd,struct stat *sbufptr)
 {
-    return pIOSubSystem->pfnfstat(fd,bufptr);
+    return fstat(fd,sbufptr);
 }
 
 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,198 +1183,268 @@ 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);
+}
+
+#ifdef MYMALLOC
+
+#ifndef USE_PERL_SBRK
+
+static char *committed = NULL;
+static char *base      = NULL;
+static char *reserved  = NULL;
+static char *brk       = NULL;
+static DWORD pagesize  = 0;
+static DWORD allocsize = 0;
+
+void *
+sbrk(int need)
+{
+ void *result;
+ if (!pagesize)
+  {SYSTEM_INFO info;
+   GetSystemInfo(&info);
+   /* Pretend page size is larger so we don't perpetually
+    * call the OS to commit just one page ...
+    */
+   pagesize = info.dwPageSize << 3;
+   allocsize = info.dwAllocationGranularity;
+  }
+ /* This scheme fails eventually if request for contiguous
+  * block is denied so reserve big blocks - this is only 
+  * address space not memory ...
+  */
+ if (brk+need >= reserved)
+  {
+   DWORD size = 64*1024*1024;
+   char *addr;
+   if (committed && reserved && committed < reserved)
+    {
+     /* Commit last of previous chunk cannot span allocations */
+     addr = (char *) VirtualAlloc(committed,reserved-committed,MEM_COMMIT,PAGE_READWRITE);
+     if (addr)
+      committed = reserved;
+    }
+   /* Reserve some (more) space 
+    * Note this is a little sneaky, 1st call passes NULL as reserved
+    * so lets system choose where we start, subsequent calls pass
+    * the old end address so ask for a contiguous block
+    */
+   addr  = (char *) VirtualAlloc(reserved,size,MEM_RESERVE,PAGE_NOACCESS);
+   if (addr)
+    {
+     reserved = addr+size;
+     if (!base)
+      base = addr;
+     if (!committed)
+      committed = base;
+     if (!brk)
+      brk = committed;
+    }
+   else
+    {
+     return (void *) -1;
+    }
+  }
+ result = brk;
+ brk += need;
+ if (brk > committed)
+  {
+   DWORD size = ((brk-committed + pagesize -1)/pagesize) * pagesize;
+   char *addr = (char *) VirtualAlloc(committed,size,MEM_COMMIT,PAGE_READWRITE);
+   if (addr)
+    {
+     committed += size;
+    }
+   else
+    return (void *) -1;
+  }
+ return result;
 }
 
+#endif
+#endif
+
 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);
 }
 
 /*
  * Extras.
  */
 
-DllExport int
-win32_flock(int fd, int oper)
-{
-    if (!IsWinNT()) {
-       croak("flock() unimplemented on this platform");
-       return -1;
-    }
-    return pIOSubSystem->pfnflock(fd, oper);
-}
-
 static
 XS(w32_GetCwd)
 {
@@ -1492,7 +1696,7 @@ XS(w32_GetShortPathName)
 }
 
 void
-init_os_extras()
+Perl_init_os_extras()
 {
     char *file = __FILE__;
     dXSUB_SYS;
@@ -1538,11 +1742,41 @@ Perl_win32_init(int *argcp, char ***argvp)
      * want to be at the vendor's whim on the default, we set
      * it explicitly here.
      */
-#if !defined(_ALPHA_)
+#if !defined(_ALPHA_) && !defined(__GNUC__)
     _control87(MCW_EM, MCW_EM);
 #endif
+    MALLOC_INIT; 
+}
+
+#ifdef USE_BINMODE_SCRIPTS
+
+void
+win32_strip_return(SV *sv)
+{
+ char *s = SvPVX(sv);
+ char *e = s+SvCUR(sv);
+ char *d = s;
+ while (s < e)
+  {
+   if (*s == '\r' && s[1] == '\n')
+    {
+     *d++ = '\n';
+     s += 2;
+    }
+   else 
+    {
+     *d++ = *s++;
+    }   
+  }
+ SvCUR_set(sv,d-SvPVX(sv)); 
 }
 
+#endif
+
+
+
+
+