X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=win32%2Fwin32io.c;h=96ceb3eabe386e0a20d775bf51bf0101a1a74008;hb=59586d7795db81c5ffcd935ba8614353199c2a71;hp=75832240c7987a5778fec1ea2b3ebedf27acd4d6;hpb=68dc074516a6859e3424b48d1647bcb08b1a1a7d;p=p5sagit%2Fp5-mst-13.2.git diff --git a/win32/win32io.c b/win32/win32io.c index 7583224..96ceb3e 100644 --- a/win32/win32io.c +++ b/win32/win32io.c @@ -16,7 +16,7 @@ extern "C" { #include #include #include - +#include #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 */ };