diff --git a/src/csync_update.c b/src/csync_update.c index 06da71885..b387c0ada 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -29,8 +29,11 @@ #include "c_lib.h" #include "c_jhash.h" -#include "csync_update.h" + +#include "csync_private.h" #include "csync_exclude.h" +#include "csync_update.h" + #include "vio/csync_vio.h" #define CSYNC_LOG_CATEGORY_NAME "csync.updater" @@ -38,24 +41,84 @@ static int csync_detect_update(CSYNC *ctx, const char *file, const csync_vio_file_stat_t *fs, const int type) { uint64_t h; + size_t len; + const char *path = NULL; + csync_file_stat_t *st = NULL; if ((file == NULL) || (fs == NULL)) { errno = EINVAL; return -1; } - h = c_jhash64((uint8_t *) file, strlen(file), 0); - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "jhash for %s is: %lu", file, h); + switch (ctx->current) { + case LOCAL_REPLICA: + path = file + strlen(ctx->local.uri) + 1; + break; + case REMOTE_REPLCIA: + path = file + strlen(ctx->remote.uri) + 1; + break; + default: + break; + } + if (path == NULL) { + return -1; + } + len = strlen(path); + + h = c_jhash64((uint8_t *) path, len, 0); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Detect update for %s", path, h); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, " hash:\t\t%lu", h); + + st = c_malloc(sizeof(csync_file_stat_t) + len + 1); + if (st == NULL) { + return -1; + } + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, " stat size:\t%d", sizeof(csync_file_stat_t) + len + 1); + + /* Check if file is excluded */ + if (csync_excluded(ctx, path)) { + st->instruction = CSYNC_INSTRUCTION_IGNORE; + goto out; + } + + /* TODO: Update detection */ + /* if current replica, search for inode and compare hash */ + st->instruction = CSYNC_INSTRUCTION_NONE; + +out: + st->inode = fs->inode; + st->mode = fs->mode; + st->modtime = fs->mtime; + st->uid = fs->uid; + st->gid = fs->gid; + st->nlink = fs->link_count; + st->type = type; + + st->phash = h; + st->pathlen = len; + memcpy(st->path, (len ? path : ""), len + 1); + + switch (ctx->current) { + case LOCAL_REPLICA: + if (c_rbtree_insert(ctx->local.tree, (void *) st) < 0) { + SAFE_FREE(st); + return -1; + } + break; + case REMOTE_REPLCIA: + if (c_rbtree_insert(ctx->remote.tree, (void *) st) < 0) { + SAFE_FREE(st); + return -1; + } + break; + default: + break; + } return 0; } int csync_walker(CSYNC *ctx, const char *file, const csync_vio_file_stat_t *fs, enum csync_ftw_flags_e flag) { - /* Check if file is excluded */ - if (csync_excluded(ctx, file)) { - return 0; - } - switch (flag) { case CSYNC_FTW_FLAG_FILE: case CSYNC_FTW_FLAG_SLINK: @@ -140,7 +203,7 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, unsigned int dept flag = CSYNC_FTW_FLAG_NSTAT; } - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Walking %s", filename); + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Walking %s", filename); /* Call walker function for each file */ rc = fn(ctx, filename, fs, flag);