*/}}
Browse Source

Backup on save

YimingWu 1 year ago
parent
commit
a05b1436ae
6 changed files with 44 additions and 5 deletions
  1. 7 2
      la_data.c
  2. 1 1
      la_data.h
  3. 1 1
      la_kernel.c
  4. 29 0
      la_util.c
  5. 5 0
      la_util.h
  6. 1 1
      resources/la_operators.c

+ 7 - 2
la_data.c

@@ -3339,7 +3339,7 @@ int la_RematchPointers(int Mode){
     while(inst=lstPopPointer(&MAIN.RenewHyper2s)){ laMemNodeHyper* h=memGetHead(inst,0);memMakeHyperData(h);memAssignRef(h,&h->FromFile,0);  }
 }
 
-int laPackUDF(laUDF *udf, int UseInstanceList){
+int laPackUDF(laUDF *udf, int UseInstanceList, int DoBackup){
     laUDFPropSegment *ps;
     short NumSegments = 0;
     u64bit RefPos;
@@ -3348,6 +3348,11 @@ int laPackUDF(laUDF *udf, int UseInstanceList){
     char Root[1024]={0};
     char FilePath[1024]={0};
 
+    if(DoBackup){
+        char BackupPath[1024]; sprintf(BackupPath,"%s~",udf->FileName->Ptr);
+        laCopyFile(BackupPath,udf->FileName->Ptr);
+    }
+
     udf->DiskFile = fopen(udf->FileName->Ptr, "wb");
     if (!udf->DiskFile) return 0;
 
@@ -3791,7 +3796,7 @@ void laSaveManagedUDF(){
     laRegisterModifications(0,0,0,1);
     for(laManagedUDF* m=MAIN.ManagedUDFs.pFirst;m;m=m->Item.pNext){
         if(!m->udf) continue;
-        if(m->udf->PropsToOperate.pFirst){ laPackUDF(m->udf, 1); }
+        if(m->udf->PropsToOperate.pFirst){ laPackUDF(m->udf, 1, 1); }
         laCloseUDF(m->udf);// just in case
     }
 }

+ 1 - 1
la_data.h

@@ -912,7 +912,7 @@ void laGetFullPath(char *FullFrom, char *Relative, char *Result);
 laUDF *laPrepareUDF(char *FileName);
 int laWriteProp(laUDF *udf, char *Path);
 int laWritePropP(laUDF *udf, laPropPack *pp);
-int laPackUDF(laUDF *udf, int UseInstanceList);
+int laPackUDF(laUDF *udf, int UseInstanceList, int DoBackup);
 
 void laSaveProp(char* path);
 void laClearSaveProp();

+ 1 - 1
la_kernel.c

@@ -621,7 +621,7 @@ void laSaveUserPreferences(){
     for(laListItemPointer* lip=MAIN.ExtraPreferencePaths.pFirst;lip;lip=lip->pNext){
         laWriteProp(udf,lip->p);
     }
-    laPackUDF(udf,0);
+    laPackUDF(udf,0,0);
 }
 void laEnsureUserPreferences(){
     char path[1024]; sprintf(path,"%s%s",MAIN.WorkingDirectory->Ptr,"preferences.udf");

+ 29 - 0
la_util.c

@@ -2025,6 +2025,35 @@ void strMoveView(laStringEdit *se, int DownLines, int RightCharacters){
     if(se->ViewStartCol<0) se->ViewStartCol=0;
 }
 
+int laCopyFile(char *to, char *from){
+    int fd_to, fd_from; char buf[4096];
+    ssize_t nread; int saved_errno;
+
+    fd_from = open(from, O_RDONLY); if (fd_from < 0) return -1;
+    fd_to = open(to, O_WRONLY|O_CREAT|O_EXCL, 0666); if (fd_to < 0) goto out_error;
+
+    while (nread=read(fd_from,buf,sizeof(buf)), nread>0) {
+        char *out_ptr = buf; ssize_t nwritten;
+        do { nwritten = write(fd_to, out_ptr, nread);
+            if (nwritten >= 0){ nread -= nwritten; out_ptr += nwritten;}
+            else if (errno != EINTR){ goto out_error; }
+        }while (nread > 0);
+    }
+
+    if (nread == 0){
+        if (close(fd_to)<0){ fd_to = -1; goto out_error;}
+        close(fd_from);
+        /* Success! */
+        return 0;
+    }
+
+out_error:
+    saved_errno = errno;
+    close(fd_from); if (fd_to >= 0) close(fd_to);
+    errno = saved_errno;
+    return -1;
+}
+
 //======================================================[ translation ]
 
 void transNewLanguage(const char *LanguageID){

+ 5 - 0
la_util.h

@@ -30,6 +30,9 @@
 #include "freetype/freetype.h"
 #include "la_icon.h"
 #include "pthread.h"
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
 #include <wchar.h>
 
 #define NEED_STRUCTURE(a)\
@@ -631,6 +634,8 @@ void strInsertChar(laStringEdit* se, uint32_t a);
 void strBackspace(laStringEdit* se);
 void strMoveView(laStringEdit *se, int DownLines, int RightCharacters);
 
+int laCopyFile(char *to, char *from);
+
 void transNewLanguage(const char * LanguageID);
 void transSetLanguage(const char * LanguageID);
 void transDumpMissMatchRecord(const char * filename);

+ 1 - 1
resources/la_operators.c

@@ -528,7 +528,7 @@ int OPMOD_UDFSaveInstance(laOperator *a, laEvent *e){
             upe->UDF = laPrepareUDF(a->ConfirmData->StrData);
             if (upe->UDF){
                 laWritePropP(upe->UDF, pp);
-                laPackUDF(upe->UDF, 0);
+                laPackUDF(upe->UDF, 0, 0);
                 return LA_FINISHED;
             }
         }