diff --git a/ChangeLog b/ChangeLog index ba8f4a32a7..5a8f76dd7a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2005-11-10 David Hampton + + * src/core-utils/gnc-gkeyfile-utils.[ch]: + * src/app-utils/gnc-exp-parser.c: Add a GError parameter to the + gnc_key_file_save_to_file() function. Check for an error + condition on every system call. + 2005-11-09 Scott Oonk * src/register/register-gnome/gnucash-item-edit.c: Draw cursor at diff --git a/src/app-utils/gnc-exp-parser.c b/src/app-utils/gnc-exp-parser.c index a15d682255..9c2f6a2a85 100644 --- a/src/app-utils/gnc-exp-parser.c +++ b/src/app-utils/gnc-exp-parser.c @@ -135,7 +135,7 @@ gnc_exp_parser_shutdown (void) g_key_file_set_comment(key_file, GROUP_NAME, NULL, _(" Variables are in the form 'name=value'"), NULL); - gnc_key_file_save_to_file(filename, key_file); + gnc_key_file_save_to_file(filename, key_file, NULL); g_key_file_free(key_file); g_free(filename); diff --git a/src/core-utils/gnc-gkeyfile-utils.c b/src/core-utils/gnc-gkeyfile-utils.c index 6c88dabb53..90a5f9dd91 100644 --- a/src/core-utils/gnc-gkeyfile-utils.c +++ b/src/core-utils/gnc-gkeyfile-utils.c @@ -77,27 +77,67 @@ gnc_key_file_load_from_file (const gchar *filename, gboolean ignore_error) gboolean gnc_key_file_save_to_file (const gchar *filename, - GKeyFile *key_file) + GKeyFile *key_file, + GError **error) { gchar *contents; gint fd; extern int errno; gint length; + ssize_t written; gboolean success = TRUE; + g_return_val_if_fail(filename != NULL, FALSE); + g_return_val_if_fail(key_file != NULL, FALSE); + if (error) + g_return_val_if_fail(*error == NULL, FALSE); + contents = g_key_file_to_data(key_file, NULL, NULL); length = strlen(contents); - if (length) { - fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); - if (fd != -1) { - write(fd, contents, length); - close(fd); + fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (fd == -1) { + if (error) { + *error = g_error_new(G_FILE_ERROR, g_file_error_from_errno(errno), + "Cannot open file %s: %s", filename, + strerror(errno)); + } else { + g_critical("Cannot open file %s: %s\n", filename, strerror(errno)); + } + g_free(contents); + return FALSE; + } + + written = write(fd, contents, length); + if (written == -1 ) { + success = FALSE; + if (error) { + *error = g_error_new(G_FILE_ERROR, g_file_error_from_errno(errno), + "Cannot write to file %s: %s", filename, + strerror(errno)); + } else { + g_critical("Cannot write to file %s: %s\n", filename, strerror(errno)); + } + close(fd); + } else if (written != length) { + success = FALSE; + if (error) { + *error = g_error_new(G_FILE_ERROR, g_file_error_from_errno(errno), + "File %s truncated (provided %d, written %d)", + filename, length, written); + } else { + g_critical("File %s truncated (provided %d, written %d)", + filename, length, written); + } + /* Ignore any error */ + close(fd); + } else if (close(fd) == -1) { + if (error) { + *error = g_error_new(G_FILE_ERROR, g_file_error_from_errno(errno), + "Close failed for file %s: %s", filename, + strerror(errno)); } else { - g_warning("Cannot open file %s: %s\n", filename, strerror(errno)); - success = FALSE; + g_warning("Close failed for file %s: %s", filename, strerror(errno)); } - } else { - unlink(filename); } g_free(contents); return success; diff --git a/src/core-utils/gnc-gkeyfile-utils.h b/src/core-utils/gnc-gkeyfile-utils.h index d5b69b8040..552f4e2636 100644 --- a/src/core-utils/gnc-gkeyfile-utils.h +++ b/src/core-utils/gnc-gkeyfile-utils.h @@ -72,7 +72,8 @@ GKeyFile *gnc_key_file_load_from_file (const gchar *file, * FALSE if there was an error. */ gboolean gnc_key_file_save_to_file (const gchar *file, - GKeyFile *key_file); + GKeyFile *key_file, + GError **error); #endif /* GNC_GKEYFILE_UTILS_H */ /** @} */