diff --git a/glib/gfileutils.c b/glib/gfileutils.c index 676c08c21a50d2d5913a1a78f851a978bdae6432..16ee663844b167f9966c408e6eaabe10cb7974cc 100644 --- a/glib/gfileutils.c +++ b/glib/gfileutils.c @@ -226,6 +226,20 @@ g_mkdir_with_parents (const gchar *pathname, return -1; } + /* try to create the full path first */ + if (g_mkdir (pathname, mode) == 0) + return 0; + else if (errno == EEXIST) + { + if (!g_file_test (pathname, G_FILE_TEST_IS_DIR)) + { + errno = ENOTDIR; + return -1; + } + return 0; + } + + /* walk the full path and try creating each element */ fn = g_strdup (pathname); if (g_path_is_absolute (fn)) @@ -248,9 +262,12 @@ g_mkdir_with_parents (const gchar *pathname, if (g_mkdir (fn, mode) == -1 && errno != EEXIST) { int errno_save = errno; - g_free (fn); - errno = errno_save; - return -1; + if (p && errno != ENOENT) + { + g_free (fn); + errno = errno_save; + return -1; + } } } else if (!g_file_test (fn, G_FILE_TEST_IS_DIR))