*/}}
Browse Source

file copy on write

YimingWu 3 months ago
parent
commit
aea4c57667
1 changed files with 17 additions and 7 deletions
  1. 17 7
      la_data.c

+ 17 - 7
la_data.c

@@ -3471,19 +3471,22 @@ int laPackUDF(laUDF *udf, int UseInstanceList, int DoBackup){
     u64bit RefPos;
     u64bit nuidSeekRef;
     u64bit nuidActualSeek;
-    char Root[1024]={0};
-    char FilePath[1024]={0};
+    char FilePath[PATH_MAX];
+    char OldPath[PATH_MAX];
+    char OldPathSwap[PATH_MAX];
 
     if(DoBackup){
         char BackupPath[1024]; sprintf(BackupPath,"%s~",SSTR(udf->FileName));
-        if(laCopyFile(BackupPath,udf->FileName->Ptr)){
+        if(laCopyFile(BackupPath,SSTR(udf->FileName))){
             logPrintNew("UDF backup written to \"%s\".\n", BackupPath);
         }else{
             logPrintNew("Error trying to back up \"%s\".\n", SSTR(udf->FileName));
         }
     }
 
-    udf->DiskFile = fopen(udf->FileName->Ptr, "wb");
+    sprintf(OldPath,"%s",SSTR(udf->FileName));
+    sprintf(FilePath,"%s.incomplete",SSTR(udf->FileName));
+    udf->DiskFile = fopen(FilePath, "wb");
     if (!udf->DiskFile) return 0;
 
     la_WriteOnlyMBString(udf, LA_UDF_IDENTIFIER);
@@ -3500,7 +3503,7 @@ int laPackUDF(laUDF *udf, int UseInstanceList, int DoBackup){
     nuidSeekRef = la_Tell(udf);
     la_WritePointer(udf, 0); //Seek pos for nuid list;
 
-    logPrint("Packing %s:\n", udf->FileName->Ptr);
+    logPrintNew("Packing %s:\n", SSTR(udf->FileName));
 
     udf->CurrentH2Instance=udf->H2Instances.pFirst;
 
@@ -3509,7 +3512,6 @@ int laPackUDF(laUDF *udf, int UseInstanceList, int DoBackup){
         ps->WriteQuickSeek = la_Tell(udf);
         la_WriteProp(udf, ps->PPP ? ps->PPP : &ps->PP, ps->PPP ? 1 : 0, UseInstanceList);
     }
-    logPrint("[ALL DONE]\n\n");
 
     nuidActualSeek = la_Tell(udf);
 
@@ -3521,7 +3523,7 @@ int laPackUDF(laUDF *udf, int UseInstanceList, int DoBackup){
     la_Seek(udf, RefPos); la_WriteLong(udf, udf->TotalRefs);
     la_Seek(udf, nuidSeekRef); la_WritePointer(udf, nuidActualSeek);
     la_Seek(udf, SizeAndExt); la_WritePointer(udf, ((ActualSize&(0x0000ffffffffffff))<<16)|LA_UDF_EXTENSIONS_ENABLED);
-
+    
     udf->Modified = 0;
 
     while(ps = lstPopItem(&udf->PropsToOperate)){
@@ -3532,6 +3534,14 @@ int laPackUDF(laUDF *udf, int UseInstanceList, int DoBackup){
 
     laCloseUDF(udf);
 
+    /* Move disk file to final name and remove the old file. */
+    sprintf(OldPathSwap,"%s.swap",OldPath);
+    if(rename(OldPath,OldPathSwap)){ logPrint("Failed to rename old file %s\n",OldPath); }
+    if(rename(FilePath,OldPath)){ logPrint("Failed to rename file to final name: %s\n",OldPath); }
+    elif(remove(OldPathSwap)){ logPrint("Failed to remove old swap file %s\n",OldPathSwap); }
+
+    logPrint("[ALL DONE]\n");
+
     laHideProgress();
 
     return 1;