dav/finfo.c

Sat, 22 Jun 2019 16:36:52 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 22 Jun 2019 16:36:52 +0200
changeset 607
5dc7fe41e8f8
parent 539
8deb52292c99
child 614
e72d2b99b0f6
permissions
-rw-r--r--

move some properties to new namespace

for properties encryption we need to decide which props must be encrypted and the plan is, to decide by namespace

517
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2019 Olaf Wintermann. All rights reserved.
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "finfo.h"
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #include <stdio.h>
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 #include <stdlib.h>
520
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
33 #include <string.h>
517
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34 #include <unistd.h>
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
35 #include <errno.h>
517
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 #include <sys/stat.h>
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 #include <ucx/string.h>
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
39 #include <ucx/list.h>
520
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
40 #include <libidav/crypto.h>
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
41 #include <libidav/utils.h>
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
42
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
43 #include "libxattr.h"
517
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
45 uint32_t parse_finfo_settings(const char *str, char **error) {
517
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 scstr_t s = scstr(str);
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 if(!sstrcmp(s, SC("*")) || !sstrcmp(s, SC("a")) || !sstrcmp(s, SC("all"))) {
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 return FINFO_DATE|FINFO_OWNER|FINFO_MODE;
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 }
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51
539
8deb52292c99 fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
52 ssize_t count = 0;
517
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 sstr_t *fs = sstrsplit(s, SC(","), &count);
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54
522
46f96dcd6eab adds metadata config element for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 520
diff changeset
55 char *err = NULL;
46f96dcd6eab adds metadata config element for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 520
diff changeset
56
517
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57 uint32_t finfo = 0;
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58 for(int i=0;i<count;i++) {
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59 sstr_t f = fs[i];
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 if(!sstrcasecmp(f, SC("date"))) {
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 finfo |= FINFO_DATE;
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 } else if(!sstrcasecmp(f, SC("owner"))) {
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 finfo |= FINFO_OWNER;
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 } else if(!sstrcasecmp(f, SC("mode"))) {
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 finfo |= FINFO_MODE;
520
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
66 } else if(!sstrcasecmp(f, SC("xattr"))) {
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
67 finfo |= FINFO_XATTR;
522
46f96dcd6eab adds metadata config element for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 520
diff changeset
68 } else if(error && !err) {
46f96dcd6eab adds metadata config element for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 520
diff changeset
69 err = fs[i].ptr;
46f96dcd6eab adds metadata config element for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 520
diff changeset
70 continue;
517
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 }
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 free(f.ptr);
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 }
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 free(fs);
522
46f96dcd6eab adds metadata config element for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 520
diff changeset
76 return err ? 0 : finfo;
517
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 }
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 int resource_set_finfo(const char *path, DavResource *res, uint32_t finfo) {
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 if(!path || finfo == 0) {
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81 return 0;
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 }
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84 struct stat s;
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 if(stat(path, &s)) {
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86 fprintf(stderr, "failed to stat: %s\n", path);
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87 return 1;
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
88 }
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 return resource_set_finfo_s(&s, res, finfo);
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 }
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 int resource_set_finfo_s(struct stat *s, DavResource *res, uint32_t finfo) {
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93 if(finfo == 0) {
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94 return 0;
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95 }
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 DavXmlNode *content = NULL;
519
ac5ac55b1b2e adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 517
diff changeset
98 DavXmlNode *last = NULL;
517
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99
539
8deb52292c99 fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
100 if((finfo & FINFO_DATE) == FINFO_DATE) {
517
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 char str[32];
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 struct tm *date = gmtime(&s->st_mtime);
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 strftime(str, 32, "%a, %d %b %Y %H:%M:%S GMT", date);
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
104 DavXmlNode *mtime = dav_xml_createnode_with_text(DAV_PROPS_NS, "mtime", str);
517
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105 content = mtime;
519
ac5ac55b1b2e adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 517
diff changeset
106 last = mtime;
517
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107 }
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 #ifndef _WIN32
539
8deb52292c99 fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
109 if((finfo & FINFO_OWNER) == FINFO_OWNER) {
517
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110 // TODO
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 }
539
8deb52292c99 fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
112 if((finfo & FINFO_MODE) == FINFO_MODE) {
519
ac5ac55b1b2e adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 517
diff changeset
113 mode_t mode = s->st_mode & 07777;
ac5ac55b1b2e adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 517
diff changeset
114 char str[32];
ac5ac55b1b2e adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 517
diff changeset
115 snprintf(str, 32, "%o", (int)mode);
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
116 DavXmlNode *xmode = dav_xml_createnode_with_text(DAV_PROPS_NS, "mode", str);
519
ac5ac55b1b2e adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 517
diff changeset
117 if(last) {
ac5ac55b1b2e adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 517
diff changeset
118 last->next = xmode;
ac5ac55b1b2e adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 517
diff changeset
119 } else {
ac5ac55b1b2e adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 517
diff changeset
120 content = xmode;
ac5ac55b1b2e adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 517
diff changeset
121 }
ac5ac55b1b2e adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 517
diff changeset
122 last = xmode;
517
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123 }
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124 #endif
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
125
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
126
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
127 dav_set_property_ns(res, DAV_PROPS_NS, "finfo", content);;
517
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129 return 0;
8531b63accae adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
130 }
520
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
131
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
132 XAttributes* xml_get_attributes(DavXmlNode *xml) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
133 UcxList *names = NULL;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
134 UcxList *values = NULL;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
135
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
136 size_t count = 0;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
137
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
138 char *hash = NULL;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
139
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
140 DavXmlNode *node = xml;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
141 while(node) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
142 if(node->type == DAV_XML_ELEMENT) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
143 if(!strcmp(node->name, "hash")) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
144 hash = dav_xml_getstring(node->children);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
145 } else if(!strcmp(node->name, "xattr")) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
146 char *xattr_name = dav_xml_get_attr(node, "name");
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
147 if(xattr_name) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
148 names = ucx_list_append(names, strdup(xattr_name));
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
149
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
150 char *text = dav_xml_getstring(node->children);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
151 if(!text) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
152 text = "";
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
153 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
154
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
155 int len = 0;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
156 char *val = util_base64decode_len(text, &len);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
157
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
158 sstr_t *value = malloc(sizeof(sstr_t));
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
159 value->ptr = val;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
160 value->length = len;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
161
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
162 values = ucx_list_append(values, value);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
163
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
164 count++;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
165 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
166 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
167 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
168
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
169 node = node->next;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
170 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
171
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
172 XAttributes *attributes = NULL;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
173 if(count > 0) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
174 attributes = calloc(1, sizeof(XAttributes));
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
175 attributes->hash = hash ? strdup(hash) : NULL;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
176 attributes->nattr = count;
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
177 attributes->names = calloc(count, sizeof(char*));
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
178 attributes->values = calloc(count, sizeof(sstr_t));
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
179 int i=0;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
180 UCX_FOREACH(elm, names) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
181 attributes->names[i] = elm->data;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
182 i++;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
183 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
184 i=0;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
185 UCX_FOREACH(elm, values) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
186 attributes->values[i] = *(sstr_t*)elm->data;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
187 i++;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
188 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
189 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
190 return attributes;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
191 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
192
520
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
193 XAttributes* file_get_attributes(const char *path) {
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
194 ssize_t nelm = 0;
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
195 char **attributes = xattr_list(path, &nelm);
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
196 if(nelm <= 0) {
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
197 return NULL;
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
198 }
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
199
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
200 XAttributes *xattr = malloc(sizeof(XAttributes));
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
201 xattr->nattr = 0;
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
202 xattr->names = calloc(nelm, sizeof(char*));
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
203 xattr->values = calloc(nelm, sizeof(sstr_t));
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
204
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
205 DAV_SHA_CTX *sha256 = dav_hash_init();
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
206
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
207 size_t nattr = 0;
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
208 for(int i=0;i<nelm;i++) {
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
209 ssize_t valuelen = 0;
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
210 char *value = xattr_get(path, attributes[i], &valuelen);
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
211 if(valuelen >= 0) {
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
212 dav_hash_update(sha256, attributes[i], strlen(attributes[i]));
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
213 dav_hash_update(sha256, value, valuelen);
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
214 // add name and value
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
215 xattr->names[nattr] = attributes[i];
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
216 sstr_t v;
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
217 v.ptr = value;
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
218 v.length = valuelen;
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
219 xattr->values[nattr] = v;
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
220 nattr++;
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
221 } else {
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
222 // discard not readable attributes
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
223 free(attributes[i]);
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
224 }
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
225 }
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
226
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
227 xattr->nattr = nattr;
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
228
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
229 unsigned char hash[DAV_SHA256_DIGEST_LENGTH];
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
230 dav_hash_final(sha256, hash);
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
231 xattr->hash = util_hexstr(hash, DAV_SHA256_DIGEST_LENGTH);
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
232
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
233 free(attributes);
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
234
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
235 if(nattr > 0) {
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
236 return xattr;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
237 } else {
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
238 xattributes_free(xattr);
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
239 return NULL;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
240 }
520
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
241 }
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
242
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
243 int resource_set_xattr(DavResource *res, XAttributes *xattr) {
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
244 if(!xattr || xattr->nattr == 0) {
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
245 return 0;
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
246 }
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
247
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
248 DavXmlNode *content = dav_xml_createnode_with_text(DAV_PROPS_NS, "hash", xattr->hash);
520
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
249 DavXmlNode *last = content;
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
250
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
251 for(int i=0;i<xattr->nattr;i++) {
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
252 DavXmlNode *attr = dav_xml_createnode(DAV_PROPS_NS, "xattr");
520
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
253 dav_xml_add_attr(attr, "name", xattr->names[i]);
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
254 last->next = attr;
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
255 last = attr;
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
256
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
257 sstr_t value = xattr->values[i];
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
258 if(value.length > 0) {
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
259 char *encval = util_base64encode(value.ptr, value.length);
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
260 attr->children = dav_xml_createtextnode(encval);
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
261 free(encval);
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
262 }
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
263 }
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
264
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
265 dav_set_property_ns(res, DAV_PROPS_NS, "xattributes", content);
520
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
266
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
267 return 0;
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
268 }
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
269
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
270 void xattributes_free(XAttributes *xattr) {
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
271 free(xattr->hash);
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
272 for(int i=0;i<xattr->nattr;i++) {
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
273 free(xattr->names[i]);
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
274 free(xattr->values[i].ptr);
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
275 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
276 free(xattr);
520
da2b0cc44e4f adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 519
diff changeset
277 }
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
278
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
279 char* get_xattr_hash(DavXmlNode *finfo) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
280 DavXmlNode *node = finfo;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
281 while(node) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
282 if(node->type == DAV_XML_ELEMENT && !strcmp(node->name, "hash")) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
283 return dav_xml_getstring(node->children);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
284 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
285 node = node->next;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
286 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
287 return NULL;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
288 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
289
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
290 void finfo_get_values(DavXmlNode *xml, FileInfo *outval) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
291 memset(outval, 0, sizeof(FileInfo));
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
292 DavXmlNode *node = xml;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
293 while(node) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
294 if(node->type == DAV_XML_ELEMENT) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
295 if(!strcmp(node->name, "mtime")) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
296 char *mtime = dav_xml_getstring(node->children);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
297 if(mtime) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
298 outval->last_modified = util_parse_lastmodified(mtime);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
299 outval->date_set = TRUE;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
300 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
301 } else if(!strcmp(node->name, "mode")) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
302 char *mode_str = dav_xml_getstring(node->children);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
303 if(mode_str) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
304 char *end;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
305 errno = 0;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
306 long int mode = strtol(mode_str, &end, 8);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
307 if(errno == 0) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
308 mode &= 07777;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
309 outval->mode = mode;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
310 outval->mode_set = TRUE;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
311 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
312 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
313 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
314 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
315 node = node->next;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
316 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
317
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
318 }

mercurial