From 47a7a91181664a44dfaec53a16c95f81364a7ab7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 6 Aug 2002 21:17:49 +0000 Subject: Save to a temporary file first using e_xml_save_file rather than 2002-08-06 Jeffrey Stedfast * mail-local.c (save_metainfo): Save to a temporary file first using e_xml_save_file rather than xmlSaveFile, if the save completes successfully then rename it to the real filename. Make sure that errno is saved. (mls_get_folder): save_metainfo doesn't return -1 on fail, it returns FALSE. svn path=/trunk/; revision=17721 --- mail/ChangeLog | 9 +++++++++ mail/mail-local.c | 40 +++++++++++++++++++++++++++++----------- 2 files changed, 38 insertions(+), 11 deletions(-) (limited to 'mail') diff --git a/mail/ChangeLog b/mail/ChangeLog index 831ad6dc5b..fe710567e9 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,12 @@ +2002-08-06 Jeffrey Stedfast + + * mail-local.c (save_metainfo): Save to a temporary file first + using e_xml_save_file rather than xmlSaveFile, if the save + completes successfully then rename it to the real filename. Make + sure that errno is saved. + (mls_get_folder): save_metainfo doesn't return -1 on fail, it + returns FALSE. + 2002-08-06 Not Zed * folder-browser.c (folder_browser_search_menu_activated): Set the diff --git a/mail/mail-local.c b/mail/mail-local.c index bf28a8defe..dd7cfe83ee 100644 --- a/mail/mail-local.c +++ b/mail/mail-local.c @@ -37,9 +37,10 @@ #include #include -#include "gal/widgets/e-gui-utils.h" #include "e-util/e-path.h" -#include "gal/util/e-unicode-i18n.h" +#include +#include +#include #include "Evolution.h" #include "evolution-storage.h" @@ -199,11 +200,12 @@ free_metainfo(struct _local_meta *meta) } static gboolean -save_metainfo(struct _local_meta *meta) +save_metainfo (struct _local_meta *meta) { xmlDocPtr doc; xmlNodePtr root, node; - int ret; + char *path, *slash; + int errsav, ret; d(printf("Saving folder metainfo to : %s\n", meta->path)); @@ -215,11 +217,27 @@ save_metainfo(struct _local_meta *meta) xmlSetProp(node, "type", meta->format); xmlSetProp(node, "name", meta->name); xmlSetProp(node, "index", meta->indexed?"1":"0"); - - ret = xmlSaveFile(meta->path, doc); - xmlFreeDoc(doc); - - return ret; + + path = alloca (strlen (meta->path) + 5); + slash = strrchr (meta->path, '/'); + if (slash) + sprintf (path, "%.*s.#%s", slash - meta->path + 1, meta->path, slash + 1); + else + sprintf (path, ".#%s", meta->path); + + ret = e_xml_save_file (path, doc); + if (ret != -1) + ret = rename (path, meta->path); + + if (ret == -1) { + errsav = errno; + unlink (path); + errno = errsav; + } + + xmlFreeDoc (doc); + + return ret == -1 ? FALSE : TRUE; } static CamelFolderClass *mlf_parent_class = NULL; @@ -749,7 +767,7 @@ mail_local_folder_reconfigure (MailLocalFolder *mlf, const char *new_format, int if (save_metainfo(mlf->meta) == FALSE) { camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot save folder metainfo; " - "you'll probably find you can't\n" + "you may find you can't\n" "open this folder anymore: %s: %s"), mlf->meta->path, strerror(errno)); } @@ -802,7 +820,7 @@ mls_get_folder(CamelStore *store, const char *folder_name, guint32 flags, CamelE } if (flags & CAMEL_STORE_FOLDER_CREATE) { - if (save_metainfo(folder->meta) == -1) { + if (save_metainfo(folder->meta) == FALSE) { camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot save folder metainfo to %s: %s"), folder->meta->path, strerror(errno)); -- cgit v1.2.3