[Gnucash-changes] r11903 - gnucash/trunk - Add a GError parameter to the gnc_key_file_save_to_file() function.

David Hampton hampton at cvs.gnucash.org
Thu Nov 10 22:07:00 EST 2005


Author: hampton
Date: 2005-11-10 22:06:58 -0500 (Thu, 10 Nov 2005)
New Revision: 11903

Modified:
   gnucash/trunk/ChangeLog
   gnucash/trunk/src/app-utils/gnc-exp-parser.c
   gnucash/trunk/src/core-utils/gnc-gkeyfile-utils.c
   gnucash/trunk/src/core-utils/gnc-gkeyfile-utils.h
Log:
Add a GError parameter to the gnc_key_file_save_to_file() function.
Check for an error condition on every system call.


Modified: gnucash/trunk/ChangeLog
===================================================================
--- gnucash/trunk/ChangeLog	2005-11-10 04:35:31 UTC (rev 11902)
+++ gnucash/trunk/ChangeLog	2005-11-11 03:06:58 UTC (rev 11903)
@@ -1,3 +1,10 @@
+2005-11-10  David Hampton  <hampton at employees.org>
+
+	* 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  <scott.oonk at gmail.com>
 
 	* src/register/register-gnome/gnucash-item-edit.c: Draw cursor at

Modified: gnucash/trunk/src/app-utils/gnc-exp-parser.c
===================================================================
--- gnucash/trunk/src/app-utils/gnc-exp-parser.c	2005-11-10 04:35:31 UTC (rev 11902)
+++ gnucash/trunk/src/app-utils/gnc-exp-parser.c	2005-11-11 03:06:58 UTC (rev 11903)
@@ -135,7 +135,7 @@
   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);
 

Modified: gnucash/trunk/src/core-utils/gnc-gkeyfile-utils.c
===================================================================
--- gnucash/trunk/src/core-utils/gnc-gkeyfile-utils.c	2005-11-10 04:35:31 UTC (rev 11902)
+++ gnucash/trunk/src/core-utils/gnc-gkeyfile-utils.c	2005-11-11 03:06:58 UTC (rev 11903)
@@ -77,28 +77,68 @@
 
 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_warning("Cannot open file %s: %s\n", filename, strerror(errno));
-      success = FALSE;
+      g_critical("Cannot open file %s: %s\n", filename, strerror(errno));
     }
-  } else {
-    unlink(filename);
+    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("Close failed for file %s: %s", filename, strerror(errno));
+    }
+  }
   g_free(contents);
   return success;
 }

Modified: gnucash/trunk/src/core-utils/gnc-gkeyfile-utils.h
===================================================================
--- gnucash/trunk/src/core-utils/gnc-gkeyfile-utils.h	2005-11-10 04:35:31 UTC (rev 11902)
+++ gnucash/trunk/src/core-utils/gnc-gkeyfile-utils.h	2005-11-11 03:06:58 UTC (rev 11903)
@@ -72,7 +72,8 @@
  *  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 */
 /** @} */



More information about the gnucash-changes mailing list