| 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 } |