summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-SVN.txt4
-rw-r--r--src/common/lock.c32
2 files changed, 23 insertions, 13 deletions
diff --git a/Changelog-SVN.txt b/Changelog-SVN.txt
index b642a4a1a..7c271b9ec 100644
--- a/Changelog-SVN.txt
+++ b/Changelog-SVN.txt
@@ -1,6 +1,10 @@
Date Added
+03/31
+ * Added back up old files in 'save' before saving new data -- also fixes
+ 'Access denied' errors when saving in TXT
+
03/30
* sql native vc7 projects now build/link [1351: MouseJstr]
* Began sql projects for VC7 [1349: MouseJstr]
diff --git a/src/common/lock.c b/src/common/lock.c
index 341903434..288093c68 100644
--- a/src/common/lock.c
+++ b/src/common/lock.c
@@ -2,42 +2,48 @@
#include <stdio.h>
#include <errno.h>
#include <string.h>
+#include <unistd.h>
#include "lock.h"
#include "showmsg.h"
+#define exists(filename) (!access(filename, F_OK))
// 書き込みファイルの保護処理
// (書き込みが終わるまで、旧ファイルを保管しておく)
// 新しいファイルの書き込み開始
-FILE* lock_fopen(const char* filename,int *info) {
+FILE* lock_fopen (const char* filename, int *info) {
char newfile[512];
FILE *fp;
- int no = 0;
+ int no = 0;
// 安全なファイル名を得る(手抜き)
do {
- sprintf(newfile,"%s_%04d.tmp",filename,++no);
- } while((fp = fopen(newfile,"r")) && (fclose(fp), no<9999) );
+ sprintf(newfile, "%s_%04d.tmp", filename, ++no);
+ } while((fp = fopen(newfile,"r")) && (fclose(fp), no < 9999));
*info = no;
return fopen(newfile,"w");
}
// 旧ファイルを削除&新ファイルをリネーム
-int lock_fclose(FILE *fp,const char* filename,int *info) {
- int ret = 0;
+int lock_fclose (FILE *fp, const char* filename, int *info) {
+ int ret = 1;
char newfile[512];
- if(fp != NULL) {
+ char oldfile[512];
+ if (fp != NULL) {
ret = fclose(fp);
- sprintf(newfile,"%s_%04d.tmp",filename,*info);
- remove(filename);
+ sprintf(newfile, "%s_%04d.tmp", filename, *info);
+ sprintf(oldfile, "%s.bak", filename); // old backup file
+
+ if (exists(oldfile)) remove(oldfile); // remove backup file if it already exists
+ rename (filename, oldfile); // backup our older data instead of deleting it
+
// このタイミングで落ちると最悪。
- if (rename(newfile,filename) != 0) {
+ if ((ret = rename(newfile,filename)) != 0) { // rename our temporary file to its correct name
sprintf(tmp_output,"%s - '"CL_WHITE"%s"CL_RESET"'\n", strerror(errno), newfile);
ShowError(tmp_output);
}
- return ret;
- } else {
- return 1;
}
+
+ return ret;
}