glocalfile: fix error code when opening a directory on win32
authorDan Winship <danw@gnome.org>
Fri, 3 Feb 2012 16:45:51 +0000 (11:45 -0500)
committerDan Winship <danw@gnome.org>
Thu, 9 Feb 2012 11:48:12 +0000 (06:48 -0500)
g_file_read() was returning G_IO_ERROR_IS_DIRECTORY when you tried to
open a directory on unix, but G_IO_ERROR_PERMISSION_DENIED on win32.
Fix that, and add a test to tests/file.c

Pointed out on IRC by PaweÅ‚ Forysiuk.

https://bugzilla.gnome.org/show_bug.cgi?id=669330

gio/glocalfile.c
gio/tests/file.c

index cfd805a..176817d 100644 (file)
@@ -1314,6 +1314,20 @@ g_local_file_read (GFile         *file,
     {
       int errsv = errno;
 
+#ifdef G_OS_WIN32
+      if (errsv == EACCES)
+       {
+         ret = _stati64 (local->filename, &buf);
+         if (ret == 0 && S_ISDIR (buf.st_mode))
+           {
+             g_set_error_literal (error, G_IO_ERROR,
+                                  G_IO_ERROR_IS_DIRECTORY,
+                                  _("Can't open directory"));
+             return NULL;
+           }
+       }
+#endif
+
       g_set_error (error, G_IO_ERROR,
                   g_io_error_from_errno (errsv),
                   _("Error opening file: %s"),
index 35bb2cd..c7f840b 100644 (file)
@@ -78,6 +78,7 @@ test_type (void)
 {
   GFile *file;
   GFileType type;
+  GError *error = NULL;
 
   file = g_file_new_for_path (SRCDIR "/file.c");
   type = g_file_query_file_type (file, 0, NULL);
@@ -87,6 +88,10 @@ test_type (void)
   file = g_file_new_for_path (SRCDIR "/schema-tests");
   type = g_file_query_file_type (file, 0, NULL);
   g_assert_cmpint (type, ==, G_FILE_TYPE_DIRECTORY);
+
+  g_file_read (file, NULL, &error);
+  g_assert_error (error, G_IO_ERROR, G_IO_ERROR_IS_DIRECTORY);
+  g_error_free (error);
   g_object_unref (file);
 }