rathena/src/common/lock.c
celest bbee501b4d * Added error message if file renaming in lock_fclose fails
* Corrected typo in clif_hpmeter
* Fixed frost diver

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@727 54d463be-8e91-2dee-dedb-b68131a5f0ec
2004-12-22 12:42:29 +00:00

44 lines
985 B
C

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include "lock.h"
#include "showmsg.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);
// このタイミングで落ちると最悪。
if (rename(newfile,filename) != 0) {
sprintf(tmp_output,"%s - '"CL_WHITE"%s"CL_RESET"'\n", strerror(errno), newfile);
ShowError(tmp_output);
}
return ret;
} else {
return 1;
}
}