summaryrefslogtreecommitdiff
path: root/src/common/lock.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/lock.c')
-rw-r--r--src/common/lock.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/common/lock.c b/src/common/lock.c
new file mode 100644
index 000000000..7b9e1ad9c
--- /dev/null
+++ b/src/common/lock.c
@@ -0,0 +1,37 @@
+
+#include <stdio.h>
+#include "lock.h"
+
+// 書き込みファイルの保護処理
+// (書き込みが終わるまで、旧ファイルを保管しておく)
+
+// 新しいファイルの書き込み開始
+FILE* lock_fopen(const char* filename,int *info) {
+ char newfile[512];
+ FILE *fp;
+ int no = 0;
+
+ // 安全なファイル名を得る(手抜き)
+ do {
+ 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;
+ char newfile[512];
+ if(fp != NULL) {
+ ret = fclose(fp);
+ sprintf(newfile,"%s_%04d.tmp",filename,*info);
+ remove(filename);
+ // このタイミングで落ちると最悪。
+ rename(newfile,filename);
+ return ret;
+ } else {
+ return 1;
+ }
+}
+