mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-25 14:36:01 +03:00
Fill stat and add it to the red black tree.
Update detection needs still to be done.
This commit is contained in:
parent
fac0ba914f
commit
2ea310ab54
1 changed files with 72 additions and 9 deletions
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue