diff options
author | (no author) <(no author)@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2004-11-04 23:25:09 +0000 |
---|---|---|
committer | (no author) <(no author)@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2004-11-04 23:25:09 +0000 |
commit | 195dffc20af1fb32c7e4119988911b72955aeabc (patch) | |
tree | b60d2a5e72d64dc5fc21eb9ce0962631e774a4c9 /src/common/lock.c | |
download | hercules-195dffc20af1fb32c7e4119988911b72955aeabc.tar.gz hercules-195dffc20af1fb32c7e4119988911b72955aeabc.tar.bz2 hercules-195dffc20af1fb32c7e4119988911b72955aeabc.tar.xz hercules-195dffc20af1fb32c7e4119988911b72955aeabc.zip |
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/athena@2 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/common/lock.c')
-rw-r--r-- | src/common/lock.c | 37 |
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;
+ }
+}
+
|