perldoc under OS/2
[p5sagit/p5-mst-13.2.git] / win32 / win32io.c
index c9cc8e2..96ceb3e 100644 (file)
@@ -65,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)
 
@@ -141,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 */
@@ -172,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);
 }
@@ -184,6 +190,55 @@ 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
@@ -237,10 +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 */
 };