[inseparable changes from match from perl-5.003_99a to perl5.004]
[p5sagit/p5-mst-13.2.git] / win32 / win32.c
index ee50147..7fb0416 100644 (file)
 #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 *
@@ -298,16 +300,18 @@ my_pclose(PerlIO *fp)
     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 *
@@ -318,7 +322,7 @@ GetShell(void)
     static char* szWinNTDefaultShell = "cmd.exe";
    
     if (!ProbeEnv) {
-       IdOS(), ProbeEnv = TRUE;
+       ProbeEnv = TRUE;
        if (IsWin95()) {
            strcpy(szShellPath, szWin95DefaultShell);
        }
@@ -341,7 +345,7 @@ do_aspawn(void* really, void** mark, void** arglast)
     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);
@@ -388,8 +392,8 @@ do_spawn(char *cmd)
 
     /* 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;) {
@@ -473,7 +477,7 @@ opendir(char *filename)
  *  }
  */
     /* Get us a DIR structure */
-    Newz(1501, p, 1, DIR);
+    Newz(1303, p, 1, DIR);
     if(p == NULL)
        return NULL;
 
@@ -495,7 +499,7 @@ opendir(char *filename)
      * 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");
     }
@@ -1116,3 +1120,18 @@ stolen_get_osfhandle(int fd)
 {
     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);
+}
+