talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit c1078e183e89cc60ea8966e6f66816e1ae508cab
parent c44f2ba91029a32ea6adaeedeb0ba23b3fa2bb62
Author: Colin Leroy <colin@colino.net>
Date:   Mon, 16 Mar 2009 17:59:26 +0000

2009-03-16 [colin]	3.7.1cvs14

	* src/compose.c
	* src/folder.c
	* src/folder.h
	* src/msgcache.c
	* src/common/prefs.c
		Add fsync calls to make sure we don't
		lose data on system crashes. (to do:
		add a pref to allow people choosing raw
		speed)

Diffstat:
MChangeLog | 12++++++++++++
MPATCHSETS | 1+
Mconfigure.ac | 2+-
Msrc/common/prefs.c | 11+++++++++++
Msrc/compose.c | 4+++-
Msrc/folder.c | 26+++++++++++++++++++++-----
Msrc/folder.h | 3+++
Msrc/msgcache.c | 379+++++++++++++++++++++++++------------------------------------------------------
8 files changed, 171 insertions(+), 267 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,15 @@ +2009-03-16 [colin] 3.7.1cvs14 + + * src/compose.c + * src/folder.c + * src/folder.h + * src/msgcache.c + * src/common/prefs.c + Add fsync calls to make sure we don't + lose data on system crashes. (to do: + add a pref to allow people choosing raw + speed) + 2009-03-15 [colin] 3.7.1cvs13 * src/gtk/gtkaspell.c diff --git a/PATCHSETS b/PATCHSETS @@ -3753,3 +3753,4 @@ ( cvs diff -u -r 1.60.2.57 -r 1.60.2.58 po/es.po; ) > 3.7.1cvs11.patchset ( cvs diff -u -r 1.36.2.166 -r 1.36.2.167 src/common/utils.c; ) > 3.7.1cvs12.patchset ( cvs diff -u -r 1.9.2.67 -r 1.9.2.68 src/gtk/gtkaspell.c; ) > 3.7.1cvs13.patchset +( cvs diff -u -r 1.382.2.503 -r 1.382.2.504 src/compose.c; cvs diff -u -r 1.213.2.190 -r 1.213.2.191 src/folder.c; cvs diff -u -r 1.87.2.58 -r 1.87.2.59 src/folder.h; cvs diff -u -r 1.16.2.65 -r 1.16.2.66 src/msgcache.c; cvs diff -u -r 1.5.2.15 -r 1.5.2.16 src/common/prefs.c; ) > 3.7.1cvs14.patchset diff --git a/configure.ac b/configure.ac @@ -11,7 +11,7 @@ MINOR_VERSION=7 MICRO_VERSION=1 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=13 +EXTRA_VERSION=14 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/common/prefs.c b/src/common/prefs.c @@ -162,6 +162,17 @@ gint prefs_file_close(PrefFile *pfile) } tmppath = g_strconcat(path, ".tmp", NULL); + + + if (fsync(fileno(fp)) < 0) { + FILE_OP_ERROR(tmppath, "fsync"); + fclose(fp); + claws_unlink(tmppath); + g_free(path); + g_free(tmppath); + return -1; + } + if (fclose(fp) == EOF) { FILE_OP_ERROR(tmppath, "fclose"); claws_unlink(tmppath); diff --git a/src/compose.c b/src/compose.c @@ -10702,8 +10702,10 @@ static void compose_reply_from_messageview_real(MessageView *msgview, GSList *ms tmp_msginfo->folder = orig_msginfo->folder; tmp_msginfo->msgnum = orig_msginfo->msgnum; - if (orig_msginfo->tags) + if (orig_msginfo->tags) { tmp_msginfo->tags = g_slist_copy(orig_msginfo->tags); + tmp_msginfo->folder->tags_dirty = TRUE; + } } } } diff --git a/src/folder.c b/src/folder.c @@ -2573,13 +2573,17 @@ static void folder_item_read_cache(FolderItem *item) } else { item->cache = msgcache_new(); } + item->cache_dirty = FALSE; + item->mark_dirty = FALSE; + item->tags_dirty = FALSE; + END_TIMING(); folder_clean_cache_memory(item); } void folder_item_write_cache(FolderItem *item) { - gchar *cache_file, *mark_file, *tags_file; + gchar *cache_file = NULL, *mark_file = NULL, *tags_file = NULL; FolderItemPrefs *prefs; gint filemode = 0; gchar *id; @@ -2599,9 +2603,12 @@ void folder_item_write_cache(FolderItem *item) debug_print("Save cache for folder %s\n", id); g_free(id); - cache_file = folder_item_get_cache_file(item); - mark_file = folder_item_get_mark_file(item); - tags_file = folder_item_get_tags_file(item); + if (item->cache_dirty) + cache_file = folder_item_get_cache_file(item); + if (item->cache_dirty || item->mark_dirty) + mark_file = folder_item_get_mark_file(item); + if (item->cache_dirty || item->tags_dirty) + tags_file = folder_item_get_tags_file(item); if (msgcache_write(cache_file, mark_file, tags_file, item->cache) < 0) { prefs = item->prefs; if (prefs && prefs->enable_folder_chmod && prefs->folder_chmod) { @@ -2611,7 +2618,11 @@ void folder_item_write_cache(FolderItem *item) if (filemode & S_IROTH) filemode |= S_IWOTH; chmod(cache_file, filemode); } - } + } else { + item->cache_dirty = FALSE; + item->mark_dirty = FALSE; + item->tags_dirty = FALSE; + } if (!need_scan && item->folder->klass->set_mtime) { if (item->mtime == last_mtime) { @@ -3678,6 +3689,9 @@ void folder_item_change_msg_flags(FolderItem *item, MsgInfo *msginfo, MsgPermFla { cm_return_if_fail(item != NULL); cm_return_if_fail(msginfo != NULL); + + item->mark_dirty = TRUE; + if (item->no_select) return; @@ -3703,6 +3717,8 @@ void folder_item_commit_tags(FolderItem *item, MsgInfo *msginfo, GSList *tags_se if (!folder) return; + item->tags_dirty = TRUE; + if (folder->klass->commit_tags == NULL) return; diff --git a/src/folder.h b/src/folder.h @@ -656,6 +656,9 @@ struct _FolderItem gint last_num; MsgCache *cache; + gboolean cache_dirty; + gboolean mark_dirty; + gboolean tags_dirty; /* special flags */ guint no_sub : 1; /* no child allowed? */ diff --git a/src/msgcache.c b/src/msgcache.c @@ -70,7 +70,6 @@ ((x[3]&0xff) << 24)) static gboolean msgcache_use_mmap_read = TRUE; -static gboolean msgcache_use_mmap_write = FALSE; #else #define bswap_32(x) (x) @@ -88,7 +87,6 @@ static gboolean msgcache_use_mmap_write = FALSE; ((x[3]&0xff) << 24)) static gboolean msgcache_use_mmap_read = TRUE; -static gboolean msgcache_use_mmap_write = FALSE; #endif static gboolean swapping = TRUE; @@ -168,6 +166,8 @@ void msgcache_add_msg(MsgCache *cache, MsgInfo *msginfo) cache->memusage += procmsg_msginfo_memusage(msginfo); cache->last_access = time(NULL); + msginfo->folder->cache_dirty = TRUE; + debug_print("Cache size: %d messages, %u bytes\n", g_hash_table_size(cache->msgnum_table), cache->memusage); } @@ -189,6 +189,8 @@ void msgcache_remove_msg(MsgCache *cache, guint msgnum) procmsg_msginfo_free(msginfo); cache->last_access = time(NULL); + msginfo->folder->cache_dirty = TRUE; + debug_print("Cache size: %d messages, %u bytes\n", g_hash_table_size(cache->msgnum_table), cache->memusage); } @@ -217,6 +219,8 @@ void msgcache_update_msg(MsgCache *cache, MsgInfo *msginfo) debug_print("Cache size: %d messages, %u bytes\n", g_hash_table_size(cache->msgnum_table), cache->memusage); + msginfo->folder->cache_dirty = TRUE; + return; } @@ -775,6 +779,7 @@ bail_err: debug_print("done. (%d items read)\n", g_hash_table_size(cache->msgnum_table)); debug_print("Cache size: %d messages, %u bytes\n", g_hash_table_size(cache->msgnum_table), cache->memusage); + return cache; } @@ -1002,39 +1007,6 @@ static int msgcache_write_cache(MsgInfo *msginfo, FILE *fp) return w_err ? -1 : wrote; } -static int msgcache_write_mmap_cache(MsgInfo *msginfo, char *walk_data) -{ - MsgTmpFlags flags = msginfo->flags.tmp_flags & MSG_CACHED_FLAG_MASK; - GSList *cur; - int wrote = 0; - - PUT_CACHE_DATA_INT(msginfo->msgnum); - PUT_CACHE_DATA_INT(msginfo->size); - PUT_CACHE_DATA_INT(msginfo->mtime); - PUT_CACHE_DATA_INT(msginfo->date_t); - PUT_CACHE_DATA_INT(flags); - PUT_CACHE_DATA(msginfo->fromname); - - PUT_CACHE_DATA(msginfo->date); - PUT_CACHE_DATA(msginfo->from); - PUT_CACHE_DATA(msginfo->to); - PUT_CACHE_DATA(msginfo->cc); - PUT_CACHE_DATA(msginfo->newsgroups); - PUT_CACHE_DATA(msginfo->subject); - PUT_CACHE_DATA(msginfo->msgid); - PUT_CACHE_DATA(msginfo->inreplyto); - PUT_CACHE_DATA(msginfo->xref); - PUT_CACHE_DATA_INT(msginfo->planned_download); - PUT_CACHE_DATA_INT(msginfo->total_size); - - PUT_CACHE_DATA_INT(g_slist_length(msginfo->references)); - - for (cur = msginfo->references; cur != NULL; cur = cur->next) { - PUT_CACHE_DATA((gchar *)cur->data); - } - return wrote; -} - static int msgcache_write_flags(MsgInfo *msginfo, FILE *fp) { MsgPermFlags flags = msginfo->flags.perm_flags; @@ -1061,40 +1033,11 @@ static int msgcache_write_tags(MsgInfo *msginfo, FILE *fp) return w_err ? -1 : wrote; } -static int msgcache_write_mmap_flags(MsgInfo *msginfo, char *walk_data) -{ - MsgPermFlags flags = msginfo->flags.perm_flags; - int wrote = 0; - - PUT_CACHE_DATA_INT(msginfo->msgnum); - PUT_CACHE_DATA_INT(flags); - return wrote; -} - -static int msgcache_write_mmap_tags(MsgInfo *msginfo, char *walk_data) -{ - GSList *cur = msginfo->tags; - int wrote = 0; - - PUT_CACHE_DATA_INT(msginfo->msgnum); - for (; cur; cur = cur->next) { - gint id = GPOINTER_TO_INT(cur->data); - if (tags_get_tag(id) != NULL) { - PUT_CACHE_DATA_INT(id); - } - } - PUT_CACHE_DATA_INT(-1); - return wrote; -} - struct write_fps { FILE *cache_fp; FILE *mark_fp; FILE *tags_fp; - char *cache_data; - char *mark_data; - char *tags_data; int error; guint cache_size; guint mark_size; @@ -1110,41 +1053,27 @@ static void msgcache_write_func(gpointer key, gpointer value, gpointer user_data msginfo = (MsgInfo *)value; write_fps = user_data; - tmp = msgcache_write_cache(msginfo, write_fps->cache_fp); - if (tmp < 0) - write_fps->error = 1; - else - write_fps->cache_size += tmp; + if (write_fps->cache_fp) { + tmp = msgcache_write_cache(msginfo, write_fps->cache_fp); + if (tmp < 0) + write_fps->error = 1; + else + write_fps->cache_size += tmp; + } + if (write_fps->mark_fp) { tmp= msgcache_write_flags(msginfo, write_fps->mark_fp); - if (tmp < 0) - write_fps->error = 1; - else - write_fps->mark_size += tmp; - tmp = msgcache_write_tags(msginfo, write_fps->tags_fp); - if (tmp < 0) - write_fps->error = 1; - else - write_fps->tags_size += tmp; -} - -static void msgcache_write_mmap_func(gpointer key, gpointer value, gpointer user_data) -{ - MsgInfo *msginfo; - struct write_fps *write_fps; - int tmp; - - msginfo = (MsgInfo *)value; - write_fps = user_data; - - tmp = msgcache_write_mmap_cache(msginfo, write_fps->cache_data); - write_fps->cache_size += tmp; - write_fps->cache_data += tmp; - tmp = msgcache_write_mmap_flags(msginfo, write_fps->mark_data); - write_fps->mark_size += tmp; - write_fps->mark_data += tmp; - tmp = msgcache_write_mmap_tags(msginfo, write_fps->tags_data); - write_fps->tags_size += tmp; - write_fps->tags_data += tmp; + if (tmp < 0) + write_fps->error = 1; + else + write_fps->mark_size += tmp; + } + if (write_fps->tags_fp) { + tmp = msgcache_write_tags(msginfo, write_fps->tags_fp); + if (tmp < 0) + write_fps->error = 1; + else + write_fps->tags_size += tmp; + } } gint msgcache_write(const gchar *cache_file, const gchar *mark_file, const gchar *tags_file, MsgCache *cache) @@ -1152,15 +1081,8 @@ gint msgcache_write(const gchar *cache_file, const gchar *mark_file, const gchar struct write_fps write_fps; gchar *new_cache, *new_mark, *new_tags; int w_err = 0, wrote = 0; - gint map_len = -1; - char *cache_data = NULL; - char *mark_data = NULL; - char *tags_data = NULL; START_TIMING(""); - cm_return_val_if_fail(cache_file != NULL, -1); - cm_return_val_if_fail(mark_file != NULL, -1); - cm_return_val_if_fail(tags_file != NULL, -1); cm_return_val_if_fail(cache != NULL, -1); new_cache = g_strconcat(cache_file, ".new", NULL); @@ -1172,16 +1094,21 @@ gint msgcache_write(const gchar *cache_file, const gchar *mark_file, const gchar write_fps.mark_size = 0; write_fps.tags_size = 0; - write_fps.cache_fp = msgcache_open_data_file(new_cache, CACHE_VERSION, - DATA_WRITE, NULL, 0); - if (write_fps.cache_fp == NULL) { - g_free(new_cache); - g_free(new_mark); - g_free(new_tags); - return -1; - } + /* open files and write headers */ - WRITE_CACHE_DATA(CS_UTF_8, write_fps.cache_fp); + if (cache_file) { + write_fps.cache_fp = msgcache_open_data_file(new_cache, CACHE_VERSION, + DATA_WRITE, NULL, 0); + if (write_fps.cache_fp == NULL) { + g_free(new_cache); + g_free(new_mark); + g_free(new_tags); + return -1; + } + WRITE_CACHE_DATA(CS_UTF_8, write_fps.cache_fp); + } else { + write_fps.cache_fp = NULL; + } if (w_err != 0) { g_warning("failed to write charset\n"); @@ -1193,170 +1120,98 @@ gint msgcache_write(const gchar *cache_file, const gchar *mark_file, const gchar return -1; } - write_fps.mark_fp = msgcache_open_data_file(new_mark, MARK_VERSION, - DATA_WRITE, NULL, 0); - if (write_fps.mark_fp == NULL) { - fclose(write_fps.cache_fp); - claws_unlink(new_cache); - g_free(new_cache); - g_free(new_mark); - g_free(new_tags); - return -1; + if (mark_file) { + write_fps.mark_fp = msgcache_open_data_file(new_mark, MARK_VERSION, + DATA_WRITE, NULL, 0); + if (write_fps.mark_fp == NULL) { + fclose(write_fps.cache_fp); + claws_unlink(new_cache); + g_free(new_cache); + g_free(new_mark); + g_free(new_tags); + return -1; + } + } else { + write_fps.mark_fp = NULL; } - write_fps.tags_fp = msgcache_open_data_file(new_tags, TAGS_VERSION, - DATA_WRITE, NULL, 0); - if (write_fps.tags_fp == NULL) { - fclose(write_fps.cache_fp); - fclose(write_fps.mark_fp); - claws_unlink(new_cache); - claws_unlink(new_mark); - g_free(new_cache); - g_free(new_mark); - g_free(new_tags); - return -1; + if (tags_file) { + write_fps.tags_fp = msgcache_open_data_file(new_tags, TAGS_VERSION, + DATA_WRITE, NULL, 0); + if (write_fps.tags_fp == NULL) { + fclose(write_fps.cache_fp); + fclose(write_fps.mark_fp); + claws_unlink(new_cache); + claws_unlink(new_mark); + g_free(new_cache); + g_free(new_mark); + g_free(new_tags); + return -1; + } + } else { + write_fps.tags_fp = NULL; } debug_print("\tWriting message cache to %s and %s...\n", new_cache, new_mark); - if (change_file_mode_rw(write_fps.cache_fp, new_cache) < 0) + if (write_fps.cache_fp && change_file_mode_rw(write_fps.cache_fp, new_cache) < 0) FILE_OP_ERROR(new_cache, "chmod"); - write_fps.cache_size = ftell(write_fps.cache_fp); - write_fps.mark_size = ftell(write_fps.mark_fp); - write_fps.tags_size = ftell(write_fps.tags_fp); - - if (msgcache_use_mmap_write && cache->memusage > 0) { - map_len = cache->memusage; - if (ftruncate(fileno(write_fps.cache_fp), (off_t)map_len) == 0) { + /* headers written, note file size */ + if (write_fps.cache_fp) + write_fps.cache_size = ftell(write_fps.cache_fp); + if (write_fps.mark_fp) + write_fps.mark_size = ftell(write_fps.mark_fp); + if (write_fps.tags_fp) + write_fps.tags_size = ftell(write_fps.tags_fp); -#ifdef G_OS_WIN32 - cache_data = NULL; - HANDLE hFile, hMapping; - hFile = (HANDLE) _get_osfhandle (fileno(write_fps.cache_fp)); - if (hFile == (HANDLE) -1) - goto w32_fail3; - hMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL); - if (!hMapping) - goto w32_fail3; - cache_data = (unsigned char *)MapViewOfFile(hMapping, FILE_MAP_COPY, 0, 0, 0); - CloseHandle (hMapping); - w32_fail3: - ; -#else - cache_data = mmap(NULL, map_len, PROT_WRITE, MAP_SHARED, - fileno(write_fps.cache_fp), 0); -#endif - } - if (cache_data != NULL && cache_data != MAP_FAILED) { - if (ftruncate(fileno(write_fps.mark_fp), (off_t)map_len) == 0) { -#ifdef G_OS_WIN32 - mark_data = NULL; - HANDLE hFile, hMapping; - hFile = (HANDLE) _get_osfhandle (fileno(write_fps.mark_fp)); - if (hFile == (HANDLE) -1) - goto w32_fail4; - hMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL); - if (!hMapping) - goto w32_fail4; - mark_data = (unsigned char *)MapViewOfFile(hMapping, FILE_MAP_COPY, 0, 0, 0); - CloseHandle (hMapping); - w32_fail4: - ; -#else - mark_data = mmap(NULL, map_len, PROT_WRITE, MAP_SHARED, - fileno(write_fps.mark_fp), 0); -#endif - } - if (mark_data == NULL || mark_data == MAP_FAILED) { -#ifdef G_OS_WIN32 - UnmapViewOfFile((void*) cache_data); -#else - munmap(cache_data, map_len); -#endif - cache_data = NULL; - } else { - if (ftruncate(fileno(write_fps.tags_fp), (off_t)map_len) == 0) { -#ifdef G_OS_WIN32 - tags_data = NULL; - HANDLE hFile, hMapping; - hFile = (HANDLE) _get_osfhandle (fileno(write_fps.tags_fp)); - if (hFile == (HANDLE) -1) - goto w32_fail5; - hMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL); - if (!hMapping) - goto w32_fail5; - tags_data = (unsigned char *)MapViewOfFile(hMapping, FILE_MAP_COPY, 0, 0, 0); - CloseHandle (hMapping); - w32_fail5: - ; -#else - tags_data = mmap(NULL, map_len, PROT_WRITE, MAP_SHARED, - fileno(write_fps.tags_fp), 0); -#endif - } - if (tags_data == NULL || tags_data == MAP_FAILED) { -#ifdef G_OS_WIN32 - UnmapViewOfFile((void*) cache_data); - UnmapViewOfFile((void*) mark_data); -#else - munmap(cache_data, map_len); - munmap(mark_data, map_len); -#endif - cache_data = NULL; - mark_data = NULL; - } - } - } - } - - if (cache_data != NULL && cache_data != MAP_FAILED) { - write_fps.cache_data = cache_data + ftell(write_fps.cache_fp); - write_fps.mark_data = mark_data + ftell(write_fps.mark_fp); - write_fps.tags_data = mark_data + ftell(write_fps.tags_fp); - g_hash_table_foreach(cache->msgnum_table, msgcache_write_mmap_func, (gpointer)&write_fps); -#ifdef G_OS_WIN32 - UnmapViewOfFile((void*) cache_data); - UnmapViewOfFile((void*) mark_data); - UnmapViewOfFile((void*) tags_data); -#else - munmap(cache_data, map_len); - munmap(mark_data, map_len); - munmap(tags_data, map_len); -#endif - ftruncate(fileno(write_fps.cache_fp), write_fps.cache_size); - ftruncate(fileno(write_fps.mark_fp), write_fps.mark_size); - ftruncate(fileno(write_fps.tags_fp), write_fps.tags_size); - } else { #ifdef HAVE_FWRITE_UNLOCKED + /* lock files for write once (instead of once per fwrite) */ + if (write_fps.cache_fp) flockfile(write_fps.cache_fp); + if (write_fps.mark_fp) flockfile(write_fps.mark_fp); + if (write_fps.tags_fp) flockfile(write_fps.tags_fp); #endif - g_hash_table_foreach(cache->msgnum_table, msgcache_write_func, (gpointer)&write_fps); + /* write data to the files */ + g_hash_table_foreach(cache->msgnum_table, msgcache_write_func, (gpointer)&write_fps); #ifdef HAVE_FWRITE_UNLOCKED - funlockfile(write_fps.mark_fp); + /* unlock files */ + if (write_fps.cache_fp) funlockfile(write_fps.cache_fp); + if (write_fps.mark_fp) + funlockfile(write_fps.mark_fp); + if (write_fps.tags_fp) funlockfile(write_fps.tags_fp); #endif - } - - fflush(write_fps.cache_fp); - fflush(write_fps.mark_fp); - fflush(write_fps.tags_fp); - -#if 0 - fsync(fileno(write_fps.cache_fp)); - fsync(fileno(write_fps.mark_fp)); - fsync(fileno(write_fps.tags_fp)); -#endif - - fclose(write_fps.cache_fp); - fclose(write_fps.mark_fp); - fclose(write_fps.tags_fp); + /* flush buffers */ + if (write_fps.cache_fp) + write_fps.error |= (fflush(write_fps.cache_fp) != 0); + if (write_fps.mark_fp) + write_fps.error |= (fflush(write_fps.mark_fp) != 0); + if (write_fps.tags_fp) + write_fps.error |= (fflush(write_fps.tags_fp) != 0); + + /* sync to filesystem */ + if (write_fps.cache_fp) + write_fps.error |= (fsync(fileno(write_fps.cache_fp)) != 0); + if (write_fps.mark_fp) + write_fps.error |= (fsync(fileno(write_fps.mark_fp)) != 0); + if (write_fps.tags_fp) + write_fps.error |= (fsync(fileno(write_fps.tags_fp)) != 0); + + /* close files */ + if (write_fps.cache_fp) + write_fps.error |= (fclose(write_fps.cache_fp) != 0); + if (write_fps.mark_fp) + write_fps.error |= (fclose(write_fps.mark_fp) != 0); + if (write_fps.tags_fp) + write_fps.error |= (fclose(write_fps.tags_fp) != 0); if (write_fps.error != 0) { + /* in case of error, forget all */ claws_unlink(new_cache); claws_unlink(new_mark); claws_unlink(new_tags); @@ -1365,9 +1220,13 @@ gint msgcache_write(const gchar *cache_file, const gchar *mark_file, const gchar g_free(new_tags); return -1; } else { - move_file(new_cache, cache_file, TRUE); - move_file(new_mark, mark_file, TRUE); - move_file(new_tags, tags_file, TRUE); + /* switch files */ + if (cache_file) + move_file(new_cache, cache_file, TRUE); + if (mark_file) + move_file(new_mark, mark_file, TRUE); + if (tags_file) + move_file(new_tags, tags_file, TRUE); cache->last_access = time(NULL); }