From 195dffc20af1fb32c7e4119988911b72955aeabc Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@54d463be-8e91-2dee-dedb-b68131a5f0ec> Date: Thu, 4 Nov 2004 23:25:09 +0000 Subject: git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/athena@2 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/common/lock.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/common/lock.c (limited to 'src/common/lock.c') 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 +#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; + } +} + -- cgit v1.2.3-60-g2f50