diff -r 7b73058d782e -r cbbdf207e67e dav/sync.c --- a/dav/sync.c Fri Mar 18 19:54:36 2016 +0100 +++ b/dav/sync.c Sat Mar 19 12:34:32 2016 +0100 @@ -352,14 +352,14 @@ // store db if(store_db(db, dir->database)) { fprintf(stderr, "Cannot store sync db\n"); - ret = -1; + ret = -2; } - // TODO: cleanup - BUT DONT CLEANUP SYNC CONFIG (do this in main!) + // TODO: cleanup dav_session_destroy(sn); // Report - if(ret == 0) { + if(ret != -2) { char *str_success = sync_success == 1 ? "file" : "files"; char *str_delete = sync_delete == 1 ? "file" : "files"; char *str_error = sync_error == 1 ? "error" : "errors"; @@ -753,11 +753,11 @@ if(res_isconflict(db, local_res)) { printf("skip: %s\n", local_res->path); sync_skipped++; - local_resource_free(local_res); continue; } // upload every changed file + int error = 0; if (local_resource_is_changed(dir, db, local_res)) { DavResource *res = dav_resource_new(sn, local_res->path); if(!res) { @@ -777,7 +777,6 @@ if(cdt && remote_resource_is_changed(sn, dir, db, local_res)) { printf("conflict: %s\n", local_res->path); sync_skipped++; - local_resource_free(local_res); continue; } @@ -787,6 +786,7 @@ print_resource_error(sn, res->path); ret = -1; sync_error++; + error = 1; } } dav_resource_free(res); @@ -794,14 +794,17 @@ // remove every locally available resource from db->resource // the remaining elements are all deleted files - ucx_map_cstr_put(lclres, local_res->path, local_res); + elm->data = NULL; + if(!error) { + ucx_map_cstr_put(lclres, local_res->path, local_res); + } + LocalResource *lr = ucx_map_cstr_remove(db->resources, local_res->path); if(lr) { local_resource_free(lr); } } } - ucx_list_free(resources); // delete all removed files if(ret == 0) { @@ -820,6 +823,7 @@ } } } + ucx_map_free_content(db->resources, (ucx_destructor)local_resource_free); ucx_map_free(db->resources); db->resources = lclres; @@ -834,15 +838,22 @@ // store db if(store_db(db, dir->database)) { fprintf(stderr, "Cannot store sync db\n"); - ret = -1; + ret = -2; } // cleanup dav_session_destroy(sn); - ucx_list_free(resources); // content is already freed + while(resources) { + UcxList *next = resources->next; + if(resources->data) { + local_resource_free(resources->data); + } + free(resources); + resources = next; + } // Report - if(ret == 0) { + if(ret != -2) { char *str_success = sync_success == 1 ? "file" : "files"; char *str_delete = sync_delete == 1 ? "file" : "files"; char *str_skipped = sync_delete == 1 ? "file" : "files";