summaryrefslogtreecommitdiffstats
path: root/src/io/sys.cpp
diff options
context:
space:
mode:
authorEduard Braun <eduard.braun2@gmx.de>2017-09-26 18:55:36 +0000
committerEduard Braun <eduard.braun2@gmx.de>2017-09-27 17:50:50 +0000
commitfde4b17b3614d7b51e220e02053b97f66ddd0652 (patch)
tree6be423b0622301e34478961c39a99d58c8106b94 /src/io/sys.cpp
parentMerge branch 'jali/inkscape-ustring_refactor' (diff)
downloadinkscape-fde4b17b3614d7b51e220e02053b97f66ddd0652.tar.gz
inkscape-fde4b17b3614d7b51e220e02053b97f66ddd0652.zip
Create parent directories when opening a file for writing
- this affects callers of Inkscape::IO::fopen_utf8name - fixes at least two issues: - creating custom shortcuts failed when "/inkscape/keys" was missing in the configuration directory, see https://bugs.launchpad.net/inkscape/+bug/1719629 - autosaving probably failed if a non-existent directory was specified
Diffstat (limited to 'src/io/sys.cpp')
-rw-r--r--src/io/sys.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/io/sys.cpp b/src/io/sys.cpp
index b06b550dd..833dee437 100644
--- a/src/io/sys.cpp
+++ b/src/io/sys.cpp
@@ -71,10 +71,20 @@ FILE *Inkscape::IO::fopen_utf8name( char const *utf8name, char const *mode )
gchar *filename = g_filename_from_utf8( utf8name, -1, NULL, NULL, NULL );
if ( filename )
{
+ // ensure we open the file in binary mode (not needed in POSIX but doesn't hurt either)
Glib::ustring how( mode );
if ( how.find("b") == Glib::ustring::npos )
{
- how.append("b"); // not needed in POSIX but doesn't hurt either
+ how.append("b");
+ }
+ // when opening a file for writing: create parent directories if they don't exist already
+ if ( how.find("w") != Glib::ustring::npos )
+ {
+ gchar *dirname = g_path_get_dirname(utf8name);
+ if (g_mkdir_with_parents(dirname, 0777)) {
+ g_warning("Could not create directory '%s'", dirname);
+ }
+ g_free(dirname);
}
fp = g_fopen(filename, how.c_str());
g_free(filename);