[sgen] Concurrent sweep.
[mono.git] / mono / metadata / file-io.c
index 0aa7ad244f66a4b15b845f0d1badc6b8f919ba52..99970866f4e38217f29765e12983d1947dd7e304 100644 (file)
@@ -305,6 +305,18 @@ ves_icall_System_IO_MonoIO_RemoveDirectory (MonoString *path, gint32 *error)
        return(ret);
 }
 
+static gchar *
+get_search_dir (MonoString *pattern)
+{
+       gchar *p;
+       gchar *result;
+
+       p = mono_string_to_utf8 (pattern);
+       result = g_path_get_dirname (p);
+       g_free (p);
+       return result;
+}
+
 MonoArray *
 ves_icall_System_IO_MonoIO_GetFileSystemEntries (MonoString *path,
                                                 MonoString *path_with_pattern,
@@ -317,7 +329,7 @@ ves_icall_System_IO_MonoIO_GetFileSystemEntries (MonoString *path,
        WIN32_FIND_DATA data;
        HANDLE find_handle;
        GPtrArray *names;
-       gchar *utf8_result;
+       gchar *utf8_path, *utf8_result, *full_name;
        
        MONO_ARCH_SAVE_REGS;
 
@@ -344,6 +356,7 @@ ves_icall_System_IO_MonoIO_GetFileSystemEntries (MonoString *path,
                return(NULL);
        }
 
+       utf8_path = get_search_dir (path_with_pattern);
        names = g_ptr_array_new ();
 
        do {
@@ -358,7 +371,10 @@ ves_icall_System_IO_MonoIO_GetFileSystemEntries (MonoString *path,
                                continue;
                        }
                        
-                       g_ptr_array_add (names, utf8_result);
+                       full_name = g_build_filename (utf8_path, utf8_result, NULL);
+                       g_ptr_array_add (names, full_name);
+
+                       g_free (utf8_result);
                }
        } while(FindNextFile (find_handle, &data));
 
@@ -376,6 +392,7 @@ ves_icall_System_IO_MonoIO_GetFileSystemEntries (MonoString *path,
                g_free (g_ptr_array_index (names, i));
        }
        g_ptr_array_free (names, TRUE);
+       g_free (utf8_path);
        
        return result;
 }
@@ -801,6 +818,8 @@ ves_icall_System_IO_MonoIO_Read (HANDLE handle, MonoArray *dest,
        MONO_ARCH_SAVE_REGS;
 
        *error=ERROR_SUCCESS;
+
+       MONO_CHECK_ARG_NULL (dest);
        
        if (dest_offset + count > mono_array_length (dest))
                return 0;
@@ -828,6 +847,8 @@ ves_icall_System_IO_MonoIO_Write (HANDLE handle, MonoArray *src,
        MONO_ARCH_SAVE_REGS;
 
        *error=ERROR_SUCCESS;
+
+       MONO_CHECK_ARG_NULL (src);
        
        if (src_offset + count > mono_array_length (src))
                return 0;