[eglib] make g_mkdir_with_parents work for paths not ending in /
[mono.git] / eglib / src / gdir-unix.c
index aa375d8127036fe942ffc15d2001445d0b5f4381..abca22f9e95c8f2b2cbc246275eb8f9773167dce 100644 (file)
@@ -36,6 +36,9 @@
 
 struct _GDir {
        DIR *dir;
+#ifndef HAVE_REWINDDIR
+       char *path;
+#endif
 };
 
 GDir *
@@ -57,6 +60,9 @@ g_dir_open (const gchar *path, guint flags, GError **error)
                g_free (dir);
                return NULL;
        }
+#ifndef HAVE_REWINDDIR
+       dir->path = g_strdup (path);
+#endif
        return dir;
 }
 
@@ -79,7 +85,12 @@ void
 g_dir_rewind (GDir *dir)
 {
        g_return_if_fail (dir != NULL && dir->dir != NULL);
+#ifndef HAVE_REWINDDIR
+       closedir (dir->dir);
+       dir->dir = opendir (dir->path);
+#else
        rewinddir (dir->dir);
+#endif
 }
 
 void
@@ -87,8 +98,49 @@ g_dir_close (GDir *dir)
 {
        g_return_if_fail (dir != NULL && dir->dir != 0);
        closedir (dir->dir);
+#ifndef HAVE_REWINDDIR
+       g_free (dir->path);
+#endif
        dir->dir = NULL;
        g_free (dir);
 }
 
+int
+g_mkdir_with_parents (const gchar *pathname, int mode)
+{
+       char *path, *d;
+       int rv;
+       
+       if (!pathname || *pathname == '\0') {
+               errno = EINVAL;
+               return -1;
+       }
+       
+       d = path = g_strdup (pathname);
+       if (*d == '/')
+               d++;
+       
+       while (TRUE) {
+               if (*d == '/' || *d == '\0') {
+                 char orig = *d;
+                 *d = '\0';
+                 rv = mkdir (path, mode);
+                 if (rv == -1 && errno != EEXIST) {
+                       g_free (path);
+                       return -1;
+                 }
 
+                 *d++ = orig;
+                 while (orig == '/' && *d == '/')
+                       d++;
+                 if (orig == '\0')
+                       break;
+               } else {
+                       d++;
+               }
+       }
+       
+       g_free (path);
+       
+       return 0;
+}