UNIXworkcode

/* * 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(CmdArgs *args); 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 */