dav/finfo.c

branch
dav-2
changeset 891
4d58cbcc9efa
parent 872
d24de29ad1fe
equal deleted inserted replaced
890:e77ccf1c4bb3 891:4d58cbcc9efa
48 #include "libxattr.h" 48 #include "libxattr.h"
49 49
50 uint32_t parse_finfo_settings(const char *str, char **error) { 50 uint32_t parse_finfo_settings(const char *str, char **error) {
51 cxstring s = cx_str(str); 51 cxstring s = cx_str(str);
52 52
53 if(!cx_strcmp(s, CX_STR("*")) || !cx_strcmp(s, CX_STR("a")) || !cx_strcmp(s, CX_STR("all"))) { 53 if(!cx_strcmp(s, cx_str("*")) || !cx_strcmp(s, cx_str("a")) || !cx_strcmp(s, cx_str("all"))) {
54 return FINFO_MTIME|FINFO_OWNER|FINFO_MODE|FINFO_XATTR; 54 return FINFO_MTIME|FINFO_OWNER|FINFO_MODE|FINFO_XATTR;
55 } 55 }
56 56
57 CxStrtokCtx fs = cx_strtok(s, CX_STR(","), INT_MAX); 57 CxStrtokCtx fs = cx_strtok(s, cx_str(","), INT_MAX);
58 cxstring f; 58 cxstring f;
59 uint32_t finfo = 0; 59 uint32_t finfo = 0;
60 char *err = NULL; 60 char *err = NULL;
61 while(cx_strtok_next(&fs, &f)) { 61 while(cx_strtok_next(&fs, &f)) {
62 if(!cx_strcasecmp(f, CX_STR("mtime"))) { 62 if(!cx_strcasecmp(f, cx_str("mtime"))) {
63 finfo |= FINFO_MTIME; 63 finfo |= FINFO_MTIME;
64 } else if(!cx_strcasecmp(f, CX_STR("owner"))) { 64 } else if(!cx_strcasecmp(f, cx_str("owner"))) {
65 finfo |= FINFO_OWNER; 65 finfo |= FINFO_OWNER;
66 } else if(!cx_strcasecmp(f, CX_STR("mode"))) { 66 } else if(!cx_strcasecmp(f, cx_str("mode"))) {
67 finfo |= FINFO_MODE; 67 finfo |= FINFO_MODE;
68 } else if(!cx_strcasecmp(f, CX_STR("xattr"))) { 68 } else if(!cx_strcasecmp(f, cx_str("xattr"))) {
69 finfo |= FINFO_XATTR; 69 finfo |= FINFO_XATTR;
70 } else if(error && !err) { 70 } else if(error && !err) {
71 err = cx_strdup(f).ptr; 71 err = cx_strdup(f).ptr;
72 continue; 72 continue;
73 } 73 }
128 128
129 return 0; 129 return 0;
130 } 130 }
131 131
132 132
133 static void* array_realloc(void *array,
134 size_t capacity,
135 size_t elem_size,
136 struct cx_array_reallocator_s *alloc)
137 {
138 return realloc(array, capacity * elem_size);
139 }
140 133
141 XAttributes* xml_get_attributes(DavXmlNode *xml) { 134 XAttributes* xml_get_attributes(DavXmlNode *xml) {
142 XAttributes *attributes = calloc(1, sizeof(XAttributes)); 135 XAttributes *attributes = calloc(1, sizeof(XAttributes));
143 size_t x_names_size = 0; 136 size_t x_names_size = 0;
144 size_t x_names_alloc = 8; 137 size_t x_names_alloc = 8;
159 hash = dav_xml_getstring(node->children); 152 hash = dav_xml_getstring(node->children);
160 } else if(!strcmp(node->name, "xattr")) { 153 } else if(!strcmp(node->name, "xattr")) {
161 char *xattr_name = dav_xml_get_attr(node, "name"); 154 char *xattr_name = dav_xml_get_attr(node, "name");
162 if(xattr_name) { 155 if(xattr_name) {
163 char *xname = strdup(xattr_name); 156 char *xname = strdup(xattr_name);
164 cx_array_copy( 157 if(x_names_size >= x_names_alloc) {
165 (void**)&attributes->names, 158 x_names_alloc += 16;
166 &x_names_size, 159 attributes->names = realloc(attributes->names, sizeof(char*) * x_names_alloc);
167 &x_names_alloc, 160 }
168 sizeof(size_t), 161 attributes->names[x_names_size++] = xname;
169 count,
170 &xname,
171 sizeof(void*),
172 1,
173 cx_array_default_reallocator);
174 162
175 char *text = dav_xml_getstring(node->children); 163 char *text = dav_xml_getstring(node->children);
176 if(!text) { 164 if(!text) {
177 text = ""; 165 text = "";
178 } 166 }
182 170
183 cxmutstr value; 171 cxmutstr value;
184 value.ptr = val; 172 value.ptr = val;
185 value.length = len; 173 value.length = len;
186 174
187 cx_array_copy( 175 if(x_values_size >= x_values_alloc) {
188 (void**)&attributes->values, 176 x_values_alloc += 16;
189 &x_values_size, 177 attributes->values = realloc(attributes->values, sizeof(cxmutstr) * x_values_alloc);
190 &x_values_alloc, 178 }
191 sizeof(size_t), 179 attributes->values[x_values_size++] = value;
192 count,
193 &value,
194 sizeof(cxmutstr),
195 1,
196 cx_array_default_reallocator);
197 180
198 count++; 181 count++;
199 } 182 }
200 } 183 }
201 } 184 }

mercurial