dav/sync.h

Sat, 26 Oct 2019 11:32:27 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 26 Oct 2019 11:32:27 +0200
changeset 672
4bfe452a2665
parent 663
888aa263c0f1
child 679
0d352b79363a
permissions
-rw-r--r--

fix dav-sync copy with enabled metadata sync

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2019 Olaf Wintermann. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef SYNC_H
#define	SYNC_H

#include <curl/curl.h>
#include <libidav/webdav.h>
#include <ucx/list.h>

#include <pthread.h>

#include "scfg.h"
#include "config.h"
#include "sopt.h"
#include "system.h"

#include "version.h"

#ifdef _WIN32
// TODO: thread includes
#else
#include <pthread.h>
#endif /* _WIN32 */

#ifdef	__cplusplus
extern "C" {
#endif

#define STDIN_BUF_SIZE 2048
    
#define VERSION_PATH_PROPERTY "version-collection"

typedef struct SyncFile {
    SyncDirectory *dir;
    char *path;
} SyncFile;

typedef struct MetadataHashes {
    char *tags;
    char *tags_remote;
    char *xattr;
    DavBool update_tags;
    DavBool update_tags_remote;
    DavBool update_xattr;
} MetadataHashes;

typedef struct MovedFile {
    DavResource *resource;
    LocalResource *content;
    DavBool copy;
} MovedFile;

enum RemoteChangeType {
    REMOTE_NO_CHANGE = 0,
    REMOTE_CHANGE_MODIFIED,
    REMOTE_CHANGE_NEW,
    REMOTE_CHANGE_DELETED,
    REMOTE_CHANGE_CONFLICT_LOCAL_MODIFIED,
    REMOTE_CHANGE_METADATA,
    REMOTE_CHANGE_MKDIR,
    REMOTE_CHANGE_LINK
};
typedef enum RemoteChangeType RemoteChangeType;

typedef struct RemoteChange {
    DavResource      *resource;
    RemoteChangeType type;
} RemoteChange;

void print_usage(char *cmd);

pthread_t start_sighandler(pthread_mutex_t *mutex) ;
void stop_sighandler(pthread_mutex_t *mutex, pthread_t tid);

void res2map(DavResource *root, UcxMap *map);

int cmd_pull(CmdArgs *args);
int cmd_push(CmdArgs *args, DavBool archive);
int cmd_restore(CmdArgs *args);

RemoteChangeType resource_get_remote_change(
        CmdArgs *a,
        DavResource *res,
        SyncDirectory *dir,
        SyncDatabase *db);

void sync_set_metadata_from_stat(LocalResource *local, SYS_STAT *s);
int sync_move_resource(
        CmdArgs *a,
        SyncDirectory *dir,
        DavResource *res,
        LocalResource *content,
        DavBool copy,
        SyncDatabase *db,
        int *counter);
int sync_get_resource(
        CmdArgs *a,
        SyncDirectory *dir,
        const char *path,
        DavResource *res,
        SyncDatabase *db,
        int *counter);
int sync_get_collection(
        CmdArgs *a,
        SyncDirectory *dir,
        DavResource *res,
        SyncDatabase *db);
int sync_remove_local_resource(SyncDirectory *dir, LocalResource *res);
int sync_remove_local_directory(SyncDirectory *dir, LocalResource *res);
void rename_conflict_file(SyncDirectory *dir, SyncDatabase *db, char *path, DavBool copy);
char* create_tmp_download_path(char *path);
void move_to_trash(SyncDirectory *dir, char *path);

UcxList* local_scan(SyncDirectory *dir, SyncDatabase *db);
UcxList* read_changes(SyncDirectory *dir, SyncDatabase *db);
LocalResource* local_resource_new(SyncDirectory *dir, SyncDatabase *db, char *path);
char* local_resource_path(LocalResource *res);
int local_resource_is_changed(
        SyncDirectory *dir,
        SyncDatabase *db,
        LocalResource *res,
        UcxMap *svrres,
        DavBool restore_deleted,
        DavBool restore_modified);
int remote_resource_is_changed(
        DavSession *sn,
        SyncDirectory *dir,
        SyncDatabase *db,
        DavResource *remote,
        LocalResource *res,
        DavBool *equal);
int local_resource_load_metadata(SyncDirectory *dir, LocalResource *res);

void local_resource_set_etag(LocalResource *local, const char *etag);

char* resource_local_path(DavResource *res);

size_t resource_get_blocksize(SyncDirectory *dir, LocalResource *local, DavResource *res, off_t filesize);

int resource_pathlen_cmp(LocalResource *res1, LocalResource *res2, void *n);

DavResource *versioning_simple_find(DavResource *res, const char *version);
DavResource *versioning_deltav_find(DavResource *res, const char *version);

int sync_set_status(DavResource *res, char *status);
int sync_remove_status(DavResource *res);
UcxBuffer* sync_get_file_tag_data(SyncDirectory *dir, LocalResource *res);
UcxList* sync_get_file_tags(SyncDirectory *dir, LocalResource *res, DavBool *changed, char **newhash);
int sync_tags_equal(UcxList *tags1, UcxList *tags2);
int sync_store_metadata(SyncDirectory *dir, const char *path, LocalResource *local, DavResource *res);
int sync_store_xattr(SyncDirectory *dir, const char *path, XAttributes *xattr);
int sync_store_tags(SyncDirectory *dir, const char *path, LocalResource *local, DavResource *res);
int sync_store_tags_local(SyncDirectory *dir, LocalResource *local, const char *path, UcxList *tags);
int sync_put_resource(
        SyncDirectory *dir,
        DavResource *res,
        LocalResource *local,
        int *counter);
int sync_mkdir(SyncDirectory *dir, DavResource *res, LocalResource *local);
int sync_move_remote_resource(
        SyncDirectory *dir,
        SyncDatabase *db,
        DavResource *origin,
        LocalResource *local,
        DavBool copy,
        int *counter);
int sync_delete_remote_resource(SyncDirectory *dir, DavSession *sn, LocalResource *res, int *counter, UcxList **cols);
MetadataHashes sync_set_metadata_properties(
        SyncDirectory *dir,
        DavSession *sn,
        DavResource *res,
        LocalResource *local,
        DavBool force);
int sync_update_metadata(
        SyncDirectory *dir,
        DavSession *sn,
        DavResource *res,
        LocalResource *local);

void update_parts(LocalResource *local, UcxList *updates, uint64_t numparts);

void remove_deleted_conflicts(SyncDirectory *dir, SyncDatabase *db);

int cmd_list_conflicts(CmdArgs *args);
int cmd_resolve_conflicts(CmdArgs *args);
int cmd_delete_conflicts(CmdArgs *args);

int cmd_list_versions(CmdArgs *args);

int cmd_trash_info(CmdArgs *args);
int cmd_empty_trash(CmdArgs *args);

int cmd_add_tag(CmdArgs *args);
int cmd_remove_tag(CmdArgs *args);
int cmd_set_tags(CmdArgs *args);
int cmd_list_tags(CmdArgs *args);
int cmd_tagop(CmdArgs *args, int cmd);

/*
 * gets the syncdir and resource path for a given file path
 * 
 * returns 0 or error code:
 * 1: file not found
 * 2: file permission error
 * 3: stat error
 * 4: file is not in any syncdir
 * 5: file is in multiple syncdirs
 * 6: syncdir not found
 */
int sync_get_file(CmdArgs *args, const char *path, SyncFile *f, DavBool dostat);
void sync_print_get_file_err(const char *path, int err);

int isfileindir(SyncDirectory *dir, const char *path, SyncFile *f);

int cmd_add_directory(CmdArgs *args);
int cmd_list_dirs();
int cmd_check_repositories();

char* create_locktoken_file(const char *syncdirname, const char *locktoken);

/*
 * if encryption is enabled, the crypto-hash is returned as hex string
 * otherwise the content-hash is returned                 
 */
char* sync_get_content_hash(DavResource *res);

/*
 * if encryption is enabled, sets the crypto-hash property
 * otherwise it sets the content-hash property
 * 
 * hashdata must be raw sha256 data and 32 bytes long
 */
void sync_set_content_hash(DavResource *res, const unsigned char *hashdata);

#ifdef	__cplusplus
}
#endif

#endif	/* SYNC_H */

mercurial