#include <assert.h>
#include <errno.h>
#include <process.h>
-
+#include <direct.h>
#include "win32iop.h"
/*
return (&(errno));
}
+static char ***
+dummy_environ(void)
+{
+ return (&(_environ));
+}
+
/* the rest are the remapped stdio routines */
static FILE *
dummy_stderr(void)
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)
/* 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 */
#else
int __cdecl
-stolen_open_osfhandle(long osfhandle, int flags)
+my_open_osfhandle(long osfhandle, int flags)
{
return _open_osfhandle(osfhandle, flags);
}
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); */
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 */
};