Wed, 20 Mar 2019 10:23:39 +0100
implements list-versions for deltav syncdirs
/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2018 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 "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; } MetadataHashes; 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 }; 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, struct stat *s); int sync_get_resource( CmdArgs *a, SyncDirectory *dir, DavResource *res, SyncDatabase *db, int *counter); 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); 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, int *isdir); LocalResource* local_resource_copy(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); int resource_pathlen_cmp(LocalResource *res1, LocalResource *res2, void *n); 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_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); int sync_update_metadata( SyncDirectory *dir, DavSession *sn, DavResource *res, LocalResource *local); void remove_deleted_conflicts(SyncDirectory *dir, SyncDatabase *db); 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); #ifdef __cplusplus } #endif #endif /* SYNC_H */