diff options
author | Alexander Larsson <alexl@redhat.com> | 2009-06-18 18:44:27 +0200 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2009-06-23 15:10:28 +0200 |
commit | 4e0d8b97655f7c78b7da642351bc919f1f5b2f5c (patch) | |
tree | 83e962d1666bcf0cab9cb39a46aa709368173983 /metadata | |
parent | dfa3f13abb7d34aa62e2c817b1ddabb448b969f9 (diff) | |
download | gvfs-4e0d8b97655f7c78b7da642351bc919f1f5b2f5c.tar.gz |
Create directory and empty tree when opening nonexistant tree for write
Diffstat (limited to 'metadata')
-rw-r--r-- | metadata/metatree.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/metadata/metatree.c b/metadata/metatree.c index 1ec73ed3..b7a1d315 100644 --- a/metadata/metatree.c +++ b/metadata/metatree.c @@ -9,6 +9,7 @@ #include <time.h> #include "metatree.h" +#include "metabuilder.h" #include <glib.h> #include <glib/gstdio.h> #include <errno.h> @@ -234,11 +235,33 @@ meta_tree_init (MetaTree *tree) int fd; void *data; guint32 *attributes; + gboolean retried; int i; + retried = FALSE; + retry: fd = open (tree->filename, O_RDONLY); if (fd == -1) - return FALSE; + { + if (tree->for_write && !retried) + { + MetaBuilder *builder; + char *dir; + + dir = g_path_get_dirname (tree->filename); + g_mkdir_with_parents (dir, 0700); + + builder = meta_builder_new (); + retried = TRUE; + if (meta_builder_write (builder, tree->filename)) + { + meta_builder_free (builder); + goto retry; + } + meta_builder_free (builder); + } + return FALSE; + } if (fstat (fd, &statbuf) != 0 || statbuf.st_size < sizeof (MetaFileHeader)) |