int csync_destroy(CSYNC *ctx) { int rc = 0; if (ctx == NULL) { errno = EBADF; return -1; } ctx->status_code = CSYNC_STATUS_OK; if (ctx->statedb.db != NULL && csync_statedb_close(ctx) < 0) { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "ERR: closing of statedb failed."); rc = -1; } ctx->statedb.db = NULL; /* destroy exclude list */ csync_exclude_destroy(ctx); _csync_clean_ctx(ctx); SAFE_FREE(ctx->local.uri); SAFE_FREE(ctx->remote.uri); SAFE_FREE(ctx->options.config_dir); SAFE_FREE(ctx->error_string); #ifdef WITH_ICONV c_close_iconv(); #endif SAFE_FREE(ctx); return rc; }
int csync_commit(CSYNC *ctx) { int rc = 0; if (ctx == NULL) { return -1; } ctx->status_code = CSYNC_STATUS_OK; if (ctx->statedb.db != NULL && csync_statedb_close(ctx) < 0) { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "ERR: closing of statedb failed."); rc = -1; } ctx->statedb.db = NULL; _csync_clean_ctx(ctx); ctx->remote.read_from_db = 0; ctx->read_remote_from_db = true; ctx->db_is_empty = false; /* Create new trees */ c_rbtree_create(&ctx->local.tree, _key_cmp, _data_cmp); c_rbtree_create(&ctx->remote.tree, _key_cmp, _data_cmp); ctx->status = CSYNC_STATUS_INIT; SAFE_FREE(ctx->error_string); rc = 0; return rc; }
static void check_csync_statedb_close(void **state) { CSYNC *csync = *state; csync_stat_t sb; time_t modtime; mbchar_t *testdb = c_utf8_path_to_locale(TESTDB); int rc; /* statedb not written */ csync_statedb_load(csync, TESTDB, &csync->statedb.db); rc = _tstat(testdb, &sb); assert_int_equal(rc, 0); modtime = sb.st_mtime; rc = csync_statedb_close(csync); assert_int_equal(rc, 0); rc = _tstat(testdb, &sb); assert_int_equal(rc, 0); assert_int_equal(modtime, sb.st_mtime); csync_statedb_load(csync, TESTDB, &csync->statedb.db); rc = _tstat(testdb, &sb); assert_int_equal(rc, 0); modtime = sb.st_mtime; /* wait a sec or the modtime will be the same */ sleep(1); /* statedb written */ rc = csync_statedb_close(csync); assert_int_equal(rc, 0); rc = _tstat(testdb, &sb); assert_int_equal(rc, 0); c_free_locale_string(testdb); }
int csync_commit(CSYNC *ctx) { int rc = 0; if (ctx == NULL) { return -1; } ctx->status_code = CSYNC_STATUS_OK; if (ctx->statedb.db != NULL && csync_statedb_close(ctx) < 0) { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "ERR: closing of statedb failed."); rc = -1; } ctx->statedb.db = NULL; rc = csync_vio_commit(ctx); if (rc < 0) { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "commit failed: %s", ctx->error_string ? ctx->error_string : ""); goto out; } _csync_clean_ctx(ctx); ctx->remote.read_from_db = 0; ctx->read_from_db_disabled = 0; /* Create new trees */ rc = c_rbtree_create(&ctx->local.tree, _key_cmp, _data_cmp); if (rc < 0) { ctx->status_code = CSYNC_STATUS_TREE_ERROR; goto out; } rc = c_rbtree_create(&ctx->remote.tree, _key_cmp, _data_cmp); if (rc < 0) { ctx->status_code = CSYNC_STATUS_TREE_ERROR; goto out; } ctx->status = CSYNC_STATUS_INIT; SAFE_FREE(ctx->error_string); rc = 0; out: return rc; }
static int _merge_and_write_statedb(CSYNC *ctx) { struct timespec start, finish; char errbuf[256] = {0}; int jwritten = 0; int rc = 0; /* if we have a statedb */ if (ctx->statedb.db != NULL) { /* and we have successfully synchronized */ if (ctx->status >= CSYNC_STATUS_DONE) { /* merge trees */ if (csync_merge_file_trees(ctx) < 0) { strerror_r(errno, errbuf, sizeof(errbuf)); CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Unable to merge trees: %s", errbuf); ctx->status_code = CSYNC_STATUS_MERGE_FILETREE_ERROR; rc = -1; } else { csync_gettime(&start); /* write the statedb to disk */ rc = csync_statedb_write(ctx, ctx->statedb.db); if (rc == 0) { jwritten = 1; csync_gettime(&finish); CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Writing the statedb of %zu files to disk took %.2f seconds", c_rbtree_size(ctx->local.tree), c_secdiff(finish, start)); } else { strerror_r(errno, errbuf, sizeof(errbuf)); CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Unable to write statedb: %s", errbuf); ctx->status_code = CSYNC_STATUS_STATEDB_WRITE_ERROR; rc = -1; } } } rc = csync_statedb_close(ctx->statedb.file, ctx->statedb.db, jwritten); ctx->statedb.db = NULL; if (rc < 0) { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "ERR: closing of statedb failed."); } } return rc; }
int csync_reconcile(CSYNC *ctx) { int rc = -1; struct timespec start, finish; if (ctx == NULL) { errno = EBADF; return -1; } ctx->status_code = CSYNC_STATUS_OK; /* Reconciliation for local replica */ csync_gettime(&start); if (csync_statedb_load(ctx, ctx->statedb.file, &ctx->statedb.db) < 0) { rc = -1; return rc; } ctx->current = LOCAL_REPLICA; ctx->replica = ctx->local.type; rc = csync_reconcile_updates(ctx); csync_gettime(&finish); CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Reconciliation for local replica took %.2f seconds visiting %zu files.", c_secdiff(finish, start), c_rbtree_size(ctx->local.tree)); if (rc < 0) { if (!CSYNC_STATUS_IS_OK(ctx->status_code)) { ctx->status_code = csync_errno_to_status( errno, CSYNC_STATUS_RECONCILE_ERROR ); } goto out; } /* Reconciliation for remote replica */ csync_gettime(&start); ctx->current = REMOTE_REPLICA; ctx->replica = ctx->remote.type; rc = csync_reconcile_updates(ctx); csync_gettime(&finish); CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Reconciliation for remote replica took %.2f seconds visiting %zu files.", c_secdiff(finish, start), c_rbtree_size(ctx->remote.tree)); if (rc < 0) { if (!CSYNC_STATUS_IS_OK(ctx->status_code)) { ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_RECONCILE_ERROR ); } goto out; } ctx->status |= CSYNC_STATUS_RECONCILE; rc = 0; out: csync_statedb_close(ctx); return 0; }
int csync_update(CSYNC *ctx) { int rc = -1; struct timespec start, finish; if (ctx == NULL) { errno = EBADF; return -1; } ctx->status_code = CSYNC_STATUS_OK; /* create/load statedb */ rc = asprintf(&ctx->statedb.file, "%s/.csync_journal.db", ctx->local.uri); if (rc < 0) { ctx->status_code = CSYNC_STATUS_MEMORY_ERROR; return rc; } CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Journal: %s", ctx->statedb.file); if (csync_statedb_load(ctx, ctx->statedb.file, &ctx->statedb.db) < 0) { rc = -1; return rc; } ctx->status_code = CSYNC_STATUS_OK; csync_memstat_check(); if (!ctx->excludes) { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "No exclude file loaded or defined!"); } #ifdef USE_NEON /* This is not actually connecting, just setting the info for neon. The legacy propagator can use it.. */ if (dav_connect( ctx, ctx->remote.uri ) < 0) { ctx->status_code = CSYNC_STATUS_CONNECT_ERROR; return -1; } #endif /* update detection for local replica */ csync_gettime(&start); ctx->current = LOCAL_REPLICA; ctx->replica = ctx->local.type; rc = csync_ftw(ctx, ctx->local.uri, csync_walker, MAX_DEPTH); if (rc < 0) { if(ctx->status_code == CSYNC_STATUS_OK) { ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_UPDATE_ERROR); } goto out; } csync_gettime(&finish); CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Update detection for local replica took %.2f seconds walking %zu files.", c_secdiff(finish, start), c_rbtree_size(ctx->local.tree)); csync_memstat_check(); /* update detection for remote replica */ csync_gettime(&start); ctx->current = REMOTE_REPLICA; ctx->replica = ctx->remote.type; rc = csync_ftw(ctx, ctx->remote.uri, csync_walker, MAX_DEPTH); if (rc < 0) { if(ctx->status_code == CSYNC_STATUS_OK) { ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_UPDATE_ERROR); } goto out; } csync_gettime(&finish); CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Update detection for remote replica took %.2f seconds " "walking %zu files.", c_secdiff(finish, start), c_rbtree_size(ctx->remote.tree)); csync_memstat_check(); ctx->status |= CSYNC_STATUS_UPDATE; rc = 0; out: csync_statedb_close(ctx); return rc; }
int csync_destroy(CSYNC *ctx) { struct timespec start, finish; char *lock = NULL; char errbuf[256] = {0}; int jwritten = 0; if (ctx == NULL) { errno = EBADF; return -1; } ctx->error_code = CSYNC_ERR_NONE; csync_vio_shutdown(ctx); /* if we have a statedb */ if (ctx->statedb.db != NULL) { /* and we have successfully synchronized */ if (ctx->status >= CSYNC_STATUS_DONE) { /* merge trees */ if (csync_merge_file_trees(ctx) < 0) { strerror_r(errno, errbuf, sizeof(errbuf)); CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Unable to merge trees: %s", errbuf); } else { csync_gettime(&start); /* write the statedb to disk */ if (csync_statedb_write(ctx) == 0) { jwritten = 1; csync_gettime(&finish); CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Writing the statedb of %zu files to disk took %.2f seconds", c_rbtree_size(ctx->local.tree), c_secdiff(finish, start)); } else { strerror_r(errno, errbuf, sizeof(errbuf)); CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Unable to write statedb: %s", errbuf); } } } csync_statedb_close(ctx, ctx->statedb.file, jwritten); } /* clear exclude list */ csync_exclude_destroy(ctx); #ifndef _WIN32 /* remove the lock file */ if (asprintf(&lock, "%s/%s", ctx->options.config_dir, CSYNC_LOCK_FILE) > 0) { csync_lock_remove(lock); } #endif /* stop logging */ csync_log_fini(); /* destroy the rbtrees */ if (c_rbtree_size(ctx->local.tree) > 0) { c_rbtree_destroy(ctx->local.tree, _tree_destructor); } if (c_rbtree_size(ctx->remote.tree) > 0) { c_rbtree_destroy(ctx->remote.tree, _tree_destructor); } /* free memory */ c_rbtree_free(ctx->local.tree); c_list_free(ctx->local.list); c_rbtree_free(ctx->remote.tree); c_list_free(ctx->remote.list); SAFE_FREE(ctx->local.uri); SAFE_FREE(ctx->remote.uri); SAFE_FREE(ctx->options.config_dir); SAFE_FREE(ctx->statedb.file); SAFE_FREE(ctx); SAFE_FREE(lock); return 0; }
void cleanupTestCase() { SAFE_FREE(_ctx.statedb.file); csync_statedb_close((CSYNC*)(&_ctx)); }