diff -r 8ac7b8d56115 -r bb49953b1cf8 dav/sync.c --- 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; +} +