dav/sync.h

Sun, 17 Dec 2023 14:25:34 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 17 Dec 2023 14:25:34 +0100
changeset 797
edbb20b1438d
parent 789
378b5ab86f77
child 816
839fefbdedc7
permissions
-rw-r--r--

[Makefile] fix missing rules preventing dry-runs

We have to support dry-runs, because many IDEs are using
dry-runs to collect build information.

Some rules have dependencies that expect certain files or
directories to be just present. We added respective build
rules which invoke the test program. This way, the behavior
when running make normally is exactly the same, but dry-runs
are also not failing now.

/*
 * 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 <cx/list.h>
#include <cx/hash_map.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);

#ifndef _WIN32
pthread_t start_sighandler(pthread_mutex_t *mutex) ;
void stop_sighandler(pthread_mutex_t *mutex, pthread_t tid);
#else
// TODO: just dummies at the moment
int start_sighandler(int* mutex);
int stop_sighandler(int* mutex, int tid);
#endif

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

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

void log_printf(const char *fmt, ...);

void print_outgoing(
        CmdArgs *args,
        CxList *ls_new,
        CxList *ls_modified,
        CxList *ls_conflict,
        CxList *ls_update,
        CxList *ls_delete,
        CxList *ls_move,
        CxList *ls_copy,
        CxList *ls_mkcol);

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,
        DavBool update_local,
        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);

CxList* local_scan(SyncDirectory *dir, SyncDatabase *db);
CxList* 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,
        CxMap *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);
int resource_path_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);
CxBuffer* sync_get_file_tag_data(SyncDirectory *dir, LocalResource *res);
CxList* sync_get_file_tags(SyncDirectory *dir, LocalResource *res, DavBool *changed, char **newhash);
int sync_tags_equal(CxList *tags1, CxList *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, CxList *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, CxList *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, CxList *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