Quellcode durchsuchen

* Added back up old files in 'save' before saving new data

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@1353 54d463be-8e91-2dee-dedb-b68131a5f0ec
celest vor 20 Jahren
Ursprung
Commit
4109792003
2 geänderte Dateien mit 23 neuen und 13 gelöschten Zeilen
  1. 4 0
      Changelog-SVN.txt
  2. 19 13
      src/common/lock.c

+ 4 - 0
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]

+ 19 - 13
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;
 }