[msvc] Update csproj files
[mono.git] / eglib / src / gfile-win32.c
index e30b371d96a5d5ef5382a81ba2165de1501be3d1..61e23cbe442856e8cabea65ed09ac4e6ec3d3c3c 100644 (file)
@@ -26,6 +26,7 @@
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 #include <config.h>
+#include <windows.h>
 #include <glib.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <sys/types.h>
-#include <sys/stat.h>
+#include <direct.h>
 
 #ifdef G_OS_WIN32
 #include <io.h>
 #define open _open
+#ifndef S_ISREG
 #define S_ISREG(x) ((x &  _S_IFMT) == _S_IFREG)
+#endif
+#ifndef S_ISDIR
 #define S_ISDIR(x) ((x &  _S_IFMT) == _S_IFDIR)
 #endif
+#endif
 
 int mkstemp (char *tmp_template)
 {
@@ -54,15 +59,36 @@ int mkstemp (char *tmp_template)
        utf16_template = _wmktemp( utf16_template);
        if (utf16_template && *utf16_template) {
                /* FIXME: _O_TEMPORARY causes file to disappear on close causing a test to fail */
-               fd = _wopen( utf16_template, _O_BINARY | _O_CREAT /*| _O_TEMPORARY*/ | _O_EXCL, _S_IREAD | _S_IWRITE);
+               fd = _wopen( utf16_template, _O_BINARY | _O_CREAT /*| _O_TEMPORARY*/ | _O_RDWR | _O_EXCL, _S_IREAD | _S_IWRITE);
        }
 
+       /* FIXME: this will crash if utf16_template == NULL */
        sprintf (tmp_template + strlen (tmp_template) - 6, "%S", utf16_template + wcslen (utf16_template) - 6);
 
        g_free (utf16_template);
        return fd;
 }
 
+gchar *
+g_mkdtemp (char *tmp_template)
+{
+       gunichar2* utf16_template;
+
+       utf16_template  = u8to16 (tmp_template);
+
+       utf16_template = _wmktemp(utf16_template);
+       if (utf16_template && *utf16_template) {
+               if (_wmkdir (utf16_template) == 0){
+                       char *ret = u16to8 (utf16_template);
+                       g_free (utf16_template);
+                       return ret;
+               }
+       }
+
+       g_free (utf16_template);
+       return NULL;
+}
+            
 #ifdef _MSC_VER
 #pragma warning(disable:4701)
 #endif
@@ -70,37 +96,39 @@ int mkstemp (char *tmp_template)
 gboolean
 g_file_test (const gchar *filename, GFileTest test)
 {
-       struct __stat64 stat;
-       int ret = 0;
        gunichar2* utf16_filename = NULL;
-
+       DWORD attr;
+       
        if (filename == NULL || test == 0)
                return FALSE;
 
        utf16_filename = u8to16 (filename);
-       ret = _wstati64 (utf16_filename, &stat);
+       attr = GetFileAttributesW (utf16_filename);
        g_free (utf16_filename);
+       
+       if (attr == INVALID_FILE_ATTRIBUTES)
+               return FALSE;
 
        if ((test & G_FILE_TEST_EXISTS) != 0) {
-               if (ret == 0)
-                       return TRUE;
+               return TRUE;
        }
 
-       if (ret != 0)
-               return FALSE;
-
        if ((test & G_FILE_TEST_IS_EXECUTABLE) != 0) {
-               if (stat.st_mode & _S_IEXEC)
-                       return TRUE;
+               size_t len = strlen (filename);
+               if (len > 4 && strcmp (filename + len-3, "exe"))
+                   return TRUE;
+                   
+               return FALSE;
        }
 
        if ((test & G_FILE_TEST_IS_REGULAR) != 0) {
-               if (stat.st_mode & _S_IFREG)
-                       return TRUE;
+               if (attr & (FILE_ATTRIBUTE_DEVICE|FILE_ATTRIBUTE_DIRECTORY))
+                       return FALSE;
+               return TRUE;
        }
 
        if ((test & G_FILE_TEST_IS_DIR) != 0) {
-               if (stat.st_mode & _S_IFDIR)
+               if (attr & FILE_ATTRIBUTE_DIRECTORY)
                        return TRUE;
        }