perldoc under OS/2
[p5sagit/p5-mst-13.2.git] / win32 / win32io.c
index 7583224..96ceb3e 100644 (file)
@@ -16,7 +16,7 @@ extern "C" {
 #include <assert.h>
 #include <errno.h>
 #include <process.h>
-
+#include <direct.h>
 #include "win32iop.h"
 
 /*
@@ -31,6 +31,12 @@ dummy_errno(void)
     return (&(errno));
 }
 
+static char ***
+dummy_environ(void)
+{
+    return (&(_environ));
+}
+
 /* the rest are the remapped stdio routines */
 static FILE *
 dummy_stderr(void)
@@ -59,6 +65,12 @@ dummy_globalmode(int mode)
     return o;
 }
 
+#if defined(_DLL) || defined(__BORLANDC__)
+/* 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)
 
@@ -135,10 +147,10 @@ my_open_osfhandle(long osfhandle, int flags)
     /* copy relevant flags from second parameter */
     fileflags = FDEV;
 
-    if(flags & _O_APPEND)
+    if(flags & O_APPEND)
        fileflags |= FAPPEND;
 
-    if(flags & _O_TEXT)
+    if(flags & O_TEXT)
        fileflags |= FTEXT;
 
     /* attempt to allocate a C Runtime file handle */
@@ -166,7 +178,7 @@ my_open_osfhandle(long osfhandle, int flags)
 #else
 
 int __cdecl
-stolen_open_osfhandle(long osfhandle, int flags)
+my_open_osfhandle(long osfhandle, int flags)
 {
     return _open_osfhandle(osfhandle, flags);
 }
@@ -178,9 +190,62 @@ my_get_osfhandle( int filehandle )
     return _get_osfhandle(filehandle);
 }
 
+#ifdef __BORLANDC__
+#define _chdir chdir
+#endif
+
+/* 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)my_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); */
@@ -227,7 +292,12 @@ WIN32_IOSUBSYSTEM  win32stdio = {
     dummy_globalmode,  /* (*pfunc_globalmode)(int mode) */
     my_open_osfhandle,
     my_get_osfhandle,
-    spawnvpe,
+    spawnvp,
+    _mkdir,
+    _rmdir,
+    _chdir,
+    my_flock,          /* (*pfunc_flock)(int fd, int oper) */
+    execvp,
     87654321L,         /* end of structure */
 };