# HG changeset patch # User Olaf Wintermann # Date 1504609649 -7200 # Node ID bb49953b1cf815d65b09abfe65a83f91a5bc4f1c # Parent 8ac7b8d561156e48cdab74c20089e21b4af77200 dav-sync writes the locktoken to a file now diff -r 8ac7b8d56115 -r bb49953b1cf8 dav/config.c --- a/dav/config.c Tue Sep 05 12:11:09 2017 +0200 +++ b/dav/config.c Tue Sep 05 13:07:29 2017 +0200 @@ -84,6 +84,16 @@ xmlFreeDoc(doc); } +char* config_file_path(char *name) { + char *davd = util_concat_path(ENV_HOME, ".dav"); + if(!davd) { + return NULL; + } + char *path = util_concat_path(davd, name); + free(davd); + return path; +} + int load_config(DavContext *ctx) { context = ctx; // TODO: free the config somewhere diff -r 8ac7b8d56115 -r bb49953b1cf8 dav/config.h --- a/dav/config.h Tue Sep 05 12:11:09 2017 +0200 +++ b/dav/config.h Tue Sep 05 13:07:29 2017 +0200 @@ -66,6 +66,8 @@ int ssl_version; unsigned long authmethods; }; + +char* config_file_path(char *name); int load_config(DavContext *ctx); void free_config(void); 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; +} + diff -r 8ac7b8d56115 -r bb49953b1cf8 dav/sync.h --- a/dav/sync.h Tue Sep 05 12:11:09 2017 +0200 +++ b/dav/sync.h Tue Sep 05 13:07:29 2017 +0200 @@ -90,6 +90,8 @@ int cmd_list_dirs(); int cmd_check_repositories(); +char* create_locktoken_file(const char *syncdirname, const char *locktoken); + #ifdef __cplusplus } #endif