dav/sync.c

changeset 296
bb49953b1cf8
parent 294
dd5c0ebdf54f
child 299
c517502d3e38
--- a/dav/sync.c	Tue Sep 05 12:11:09 2017 +0200
+++ b/dav/sync.c	Tue Sep 05 13:07:29 2017 +0200
@@ -251,6 +251,7 @@
     }
     
     // lock repository
+    char *locktokenfile = NULL;
     DavBool locked = FALSE;
     DavResource *root = dav_resource_new(sn, "/");
     root->iscollection = TRUE;
@@ -266,6 +267,7 @@
             printf("Lock-Token: %s\n", lock->token);
         }
         locked = TRUE;
+        locktokenfile = create_locktoken_file(dir->name, lock->token);
     }
     
     int ret = 0;
@@ -275,6 +277,8 @@
         if(locked) {
             if(dav_unlock(root)) {
                 print_resource_error(sn, "/");
+            } else {
+                locked = FALSE;
             }
         }
         
@@ -289,10 +293,17 @@
         if(locked) {
             if(dav_unlock(root)) {
                 print_resource_error(sn, "/");
+            } else {
+                locked = FALSE;
             }
         }
         // TODO: free
         dav_session_destroy(sn);
+        
+        if(!locked && locktokenfile) {
+            remove(locktokenfile);
+        }
+        
         return -1;
     }
     
@@ -387,6 +398,8 @@
         if(dav_unlock(root)) {
             print_resource_error(sn, "/");
             ret = -1;
+        } else {
+            locked = FALSE;
         }
     }
     
@@ -399,6 +412,10 @@
     // cleanup
     dav_session_destroy(sn);
     
+    if(!locked && locktokenfile) {
+        remove(locktokenfile);
+    }
+    
     // Report
     if(ret != -2) {
         char *str_success = sync_success == 1 ? "file" : "files";
@@ -772,6 +789,7 @@
     
     // lock repository
     DavBool locked = FALSE;
+    char *locktokenfile = NULL;
     if((dir->lockpush || cmd_getoption(a, "lock")) && !cmd_getoption(a, "nolock")) {
         if(dav_lock(root)) {
             print_resource_error(sn, "/");
@@ -784,6 +802,7 @@
             printf("Lock-Token: %s\n", lock->token);
         }
         locked = TRUE;
+        locktokenfile = create_locktoken_file(dir->name, lock->token);
     }
     
     int sync_success = 0;
@@ -884,6 +903,8 @@
         if(dav_unlock(root)) {
             print_resource_error(sn, "/");
             ret = -1;
+        } else {
+            locked = FALSE;
         }
     }
     
@@ -894,6 +915,10 @@
     }
     
     // cleanup
+    if(!locked && locktokenfile) {
+        remove(locktokenfile);
+    }
+    
     dav_session_destroy(sn);
     while(resources) {
         UcxList *next = resources->next;
@@ -1738,3 +1763,20 @@
     
     return ret;
 }
+
+char* create_locktoken_file(const char *syncdirname, const char *locktoken) {
+    sstr_t fname = ucx_sprintf("locktoken-%s.txt", syncdirname);
+    char *path = config_file_path(fname.ptr);
+    free(fname.ptr);
+    
+    FILE *file = fopen(path, "w");
+    if(!file) {
+        perror("Cannot create locktoken file");
+        free(path);
+    }
+    
+    fprintf(file, "%s\n", locktoken);
+    fclose(file);
+    return path;
+}
+

mercurial