# HG changeset patch # User Olaf Wintermann # Date 1552499010 -3600 # Node ID 46f96dcd6eab4d1e57572fa667adb80721f2540c # Parent c5bbae4b3ccadd95ca5a7520890d6bbf883c8caf adds metadata config element for dav-sync diff -r c5bbae4b3cca -r 46f96dcd6eab dav/db.c --- a/dav/db.c Wed Mar 13 15:05:40 2019 +0100 +++ b/dav/db.c Wed Mar 13 18:43:30 2019 +0100 @@ -329,7 +329,7 @@ } } - if(settings & DB_STORE_USER == DB_STORE_USER) { + if(settings & DB_STORE_OWNER == DB_STORE_OWNER) { r = xmlTextWriterWriteFormatElement( writer, BAD_CAST "uid", diff -r c5bbae4b3cca -r 46f96dcd6eab dav/db.h --- a/dav/db.h Wed Mar 13 15:05:40 2019 +0100 +++ b/dav/db.h Wed Mar 13 18:43:30 2019 +0100 @@ -41,8 +41,8 @@ extern "C" { #endif -#define DB_STORE_MODE 1 -#define DB_STORE_USER 2 +#define DB_STORE_MODE 1 +#define DB_STORE_OWNER 2 typedef struct LocalResource LocalResource; typedef struct SyncDatabase SyncDatabase; diff -r c5bbae4b3cca -r 46f96dcd6eab dav/finfo.c --- a/dav/finfo.c Wed Mar 13 15:05:40 2019 +0100 +++ b/dav/finfo.c Wed Mar 13 18:43:30 2019 +0100 @@ -40,7 +40,7 @@ #include "libxattr.h" -uint32_t parse_finfo(const char *str) { +uint32_t parse_finfo(const char *str, char **error) { scstr_t s = scstr(str); if(!sstrcmp(s, SC("*")) || !sstrcmp(s, SC("a")) || !sstrcmp(s, SC("all"))) { @@ -50,6 +50,8 @@ size_t count = 0; sstr_t *fs = sstrsplit(s, SC(","), &count); + char *err = NULL; + uint32_t finfo = 0; for(int i=0;iline; node = node->children; @@ -340,6 +342,13 @@ database = value; } else if(xstreq(node->name, "tagconfig")) { tagconfig = parse_tagconfig(node); + } else if(xstreq(node->name, "metadata")) { + char *error = NULL; + metadata = parse_finfo(value, &error); + if(error) { + print_error(node->line, "unknown metadata: %s\n", error); + free(error); + } } else if(xstreq(node->name, "versioning")) { versioning = parse_versioning_config(node); } else if(xstreq(node->name, "max-retry")) { @@ -427,6 +436,14 @@ dir->lockpull = lockpull; dir->lockpush = lockpush; dir->lock_timeout = lock_timeout; + dir->metadata = metadata; + if(metadata & FINFO_MODE == FINFO_MODE) { + dir->db_settings = DB_STORE_MODE; + } + if(metadata & FINFO_OWNER == FINFO_OWNER) { + dir->db_settings |= DB_STORE_OWNER; + } + if (include) { dir->include = include; } else { diff -r c5bbae4b3cca -r 46f96dcd6eab dav/scfg.h --- a/dav/scfg.h Wed Mar 13 15:05:40 2019 +0100 +++ b/dav/scfg.h Wed Mar 13 18:43:30 2019 +0100 @@ -64,6 +64,7 @@ UcxList *include; UcxList *exclude; UcxList *tagfilter; + uint32_t metadata; int max_retry; int allow_cmd; time_t lock_timeout; diff -r c5bbae4b3cca -r 46f96dcd6eab dav/sync.c --- a/dav/sync.c Wed Mar 13 15:05:40 2019 +0100 +++ b/dav/sync.c Wed Mar 13 18:43:30 2019 +0100 @@ -1682,12 +1682,18 @@ res->etag = NULL; res->last_modified = s.st_mtime; res->size = s.st_size; + res->mode = s.st_mode & 07777; + res->uid = s.st_uid; + res->gid = s.st_gid; return res; } else { *isdir = 1; LocalResource *res = calloc(1, sizeof(LocalResource)); res->path = util_concat_path(path, "/"); res->last_modified = s.st_mtime; + res->mode = s.st_mode & 07777; + res->uid = s.st_uid; + res->gid = s.st_gid; res->isdirectory = 1; return res; } @@ -2122,7 +2128,7 @@ int versioning_begin(SyncDirectory *dir, DavResource *res, int *exists) { int ret = 0; - if(dir->versioning->type == VERSIONING_SIMPLE) { + if(dir->versioning->type == VERSIONING_SIMPLE && *exists) { DavResource *history_collection = dav_resource_new( res->session, dir->versioning->collection); @@ -2217,7 +2223,7 @@ } dav_resource_free(history_collection); - } else { + } else if(dir->versioning->type == VERSIONING_DELTAV){ // DeltaV is so much easier :) if(dav_checkout(res)) { ret = VBEGIN_ERROR_CHECKOUT; @@ -2239,6 +2245,7 @@ if(dir->versioning->type == VERSIONING_SIMPLE) { // TODO } + return 0; } int sync_put_resource(