gnucash maint: Cherry-pick "Bug 741810 - Compilation fails because of creating .gnucash"
Geert Janssens
gjanssens at code.gnucash.org
Tue Dec 23 11:28:17 EST 2014
Updated via https://github.com/Gnucash/gnucash/commit/ca1d5a73 (commit)
from https://github.com/Gnucash/gnucash/commit/4a791328 (commit)
commit ca1d5a73829d630009730b107ccd0b4a18687a2d
Author: Geert Janssens <janssens-geert at telenet.be>
Date: Tue Dec 23 17:19:00 2014 +0100
Cherry-pick "Bug 741810 - Compilation fails because of creating .gnucash"
This was meant to go on maint first...
diff --git a/src/core-utils/gnc-filepath-utils.c b/src/core-utils/gnc-filepath-utils.c
index 7e60493..54cdc18 100644
--- a/src/core-utils/gnc-filepath-utils.c
+++ b/src/core-utils/gnc-filepath-utils.c
@@ -299,12 +299,13 @@ gnc_path_find_localized_html_file (const gchar *file_name)
*
* @param dirname The path to check
*/
-static void
-gnc_validate_directory (const gchar *dirname)
+static gboolean
+gnc_validate_directory (const gchar *dirname, gchar **msg)
{
struct stat statbuf;
gint rc;
+ *msg = NULL;
rc = g_stat (dirname, &statbuf);
if (rc)
{
@@ -320,70 +321,72 @@ gnc_validate_directory (const gchar *dirname)
);
if (rc)
{
- g_fprintf(stderr,
+ *msg = g_strdup_printf(
_("An error occurred while creating the directory:\n"
" %s\n"
"Please correct the problem and restart GnuCash.\n"
"The reported error was '%s' (errno %d).\n"),
dirname, g_strerror(errno) ? g_strerror(errno) : "", errno);
- exit(1);
+ return FALSE;
}
g_stat (dirname, &statbuf);
break;
case EACCES:
- g_fprintf(stderr,
+ *msg = g_strdup_printf(
_("The directory\n"
" %s\n"
"exists but cannot be accessed. This program \n"
"must have full access (read/write/execute) to \n"
"the directory in order to function properly.\n"),
dirname);
- exit(1);
+ return FALSE;
case ENOTDIR:
- g_fprintf(stderr,
+ *msg = g_strdup_printf(
_("The path\n"
" %s\n"
"exists but it is not a directory. Please delete\n"
"the file and start GnuCash again.\n"),
dirname);
- exit(1);
+ return FALSE;
default:
- g_fprintf(stderr,
+ *msg = g_strdup_printf(
_("An unknown error occurred when validating that the\n"
" %s\n"
"directory exists and is usable. Please correct the\n"
"problem and restart GnuCash. The reported error \n"
"was '%s' (errno %d)."),
dirname, g_strerror(errno) ? g_strerror(errno) : "", errno);
- exit(1);
+ return FALSE;
}
}
if ((statbuf.st_mode & S_IFDIR) != S_IFDIR)
{
- g_fprintf(stderr,
+ *msg = g_strdup_printf(
_("The path\n"
" %s\n"
"exists but it is not a directory. Please delete\n"
"the file and start GnuCash again.\n"),
dirname);
- exit(1);
+ return FALSE;
}
#ifndef G_OS_WIN32
/* The mode argument is ignored on windows anyway */
if ((statbuf.st_mode & S_IRWXU) != S_IRWXU)
{
- g_fprintf(stderr,
+ *msg = g_strdup_printf(
_("The permissions are wrong on the directory\n"
" %s\n"
"They must be at least 'rwx' for the user.\n"),
dirname);
- exit(1);
+ return FALSE;
}
#endif
+
+ return TRUE;
}
/** @fn const gchar * gnc_dotgnucash_dir ()
@@ -399,6 +402,7 @@ gnc_dotgnucash_dir (void)
{
static gchar *dotgnucash = NULL;
gchar *tmp_dir;
+ gchar *errmsg = NULL;
if (dotgnucash)
return dotgnucash;
@@ -408,26 +412,31 @@ gnc_dotgnucash_dir (void)
if (!dotgnucash)
{
const gchar *home = g_get_home_dir();
- if (!home)
+ if (!home || !gnc_validate_directory(home, &errmsg))
{
- g_warning("Cannot find home directory. Using tmp directory instead.");
+ g_free(errmsg);
+ g_warning("Cannot find suitable home directory. Using tmp directory instead.");
home = g_get_tmp_dir();
}
g_assert(home);
dotgnucash = g_build_filename(home, ".gnucash", (gchar *)NULL);
}
- gnc_validate_directory(dotgnucash);
+ if (!gnc_validate_directory(dotgnucash, &errmsg))
+ exit(1);
/* Since we're in code that is only executed once.... */
tmp_dir = g_build_filename(dotgnucash, "books", (gchar *)NULL);
- gnc_validate_directory(tmp_dir);
+ if (!gnc_validate_directory(tmp_dir, &errmsg))
+ exit(1);
g_free(tmp_dir);
tmp_dir = g_build_filename(dotgnucash, "checks", (gchar *)NULL);
- gnc_validate_directory(tmp_dir);
+ if (!gnc_validate_directory(tmp_dir, &errmsg))
+ exit(1);
g_free(tmp_dir);
- tmp_dir = g_build_filename(dotgnucash, "translog", (gchar *)NULL);
- gnc_validate_directory(tmp_dir);
+ tmp_dir = g_build_filename(tmp_dir, "translog", (gchar *)NULL);
+ if (!gnc_validate_directory(dotgnucash, &errmsg))
+ exit(1);
g_free(tmp_dir);
return dotgnucash;
Summary of changes:
src/core-utils/gnc-filepath-utils.c | 51 ++++++++++++++++++++++---------------
1 file changed, 30 insertions(+), 21 deletions(-)
More information about the gnucash-changes
mailing list