#define CROAK croak
#define WARN warn
+static DWORD IdOS(void);
+
extern WIN32_IOSUBSYSTEM win32stdio;
__declspec(thread) PWIN32_IOSUBSYSTEM pIOSubSystem = &win32stdio;
/*__declspec(thread) PWIN32_IOSUBSYSTEM pIOSubSystem = NULL;*/
BOOL ProbeEnv = FALSE;
-DWORD Win32System;
+DWORD Win32System = (DWORD)-1;
char szShellPath[MAX_PATH+1];
char szPerlLibRoot[MAX_PATH+1];
HANDLE PerlDllHandle = INVALID_HANDLE_VALUE;
int
IsWin95(void) {
- return (Win32System == VER_PLATFORM_WIN32_WINDOWS);
+ return (IdOS() == VER_PLATFORM_WIN32_WINDOWS);
}
int
IsWinNT(void) {
- return (Win32System == VER_PLATFORM_WIN32_NT);
+ return (IdOS() == VER_PLATFORM_WIN32_NT);
}
void *
return win32_pclose(fp);
}
-static void
+static DWORD
IdOS(void)
{
- OSVERSIONINFO osver;
+ static OSVERSIONINFO osver;
- memset(&osver, 0, sizeof(OSVERSIONINFO));
- osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- GetVersionEx(&osver);
- Win32System = osver.dwPlatformId;
- return;
+ if (osver.dwPlatformId != Win32System) {
+ memset(&osver, 0, sizeof(OSVERSIONINFO));
+ osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&osver);
+ Win32System = osver.dwPlatformId;
+ }
+ return (Win32System);
}
static char *
static char* szWinNTDefaultShell = "cmd.exe";
if (!ProbeEnv) {
- IdOS(), ProbeEnv = TRUE;
+ ProbeEnv = TRUE;
if (IsWin95()) {
strcpy(szShellPath, szWin95DefaultShell);
}
SV *sv = (SV*)really;
SV** pSv = (SV**)mark;
- New(1110, argv, (arglast - mark) + 4, char*);
+ New(1310, argv, (arglast - mark) + 4, char*);
if(sv != Nullsv) {
cmd = SvPV(sv, length);
/* see if there are shell metacharacters in it */
if(!HasRedirection(cmd)) {
- New(1102,argv, strlen(cmd) / 2 + 2, char*);
- New(1103,cmd2, strlen(cmd) + 1, char);
+ New(1301,argv, strlen(cmd) / 2 + 2, char*);
+ New(1302,cmd2, strlen(cmd) + 1, char);
strcpy(cmd2, cmd);
a = argv;
for (s = cmd2; *s;) {
* }
*/
/* Get us a DIR structure */
- Newz(1501, p, 1, DIR);
+ Newz(1303, p, 1, DIR);
if(p == NULL)
return NULL;
* the filenames that we find.
*/
idx = strlen(FindData.cFileName)+1;
- New(1502, p->start, idx, char);
+ New(1304, p->start, idx, char);
if(p->start == NULL) {
CROAK("opendir: malloc failed!\n");
}
{
return pIOSubSystem->pfn_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);
+}
+