dav/libxattr.c

changeset 815
1f40ca07ae1b
parent 814
0ce45bdc48bc
equal deleted inserted replaced
814:0ce45bdc48bc 815:1f40ca07ae1b
71 71
72 static char ** parse_xattrlist(char *buf, ssize_t length, ssize_t *nelm) { 72 static char ** parse_xattrlist(char *buf, ssize_t length, ssize_t *nelm) {
73 size_t arraylen = LIST_ARRAY_LEN; 73 size_t arraylen = LIST_ARRAY_LEN;
74 size_t arraypos = 0; 74 size_t arraypos = 0;
75 char **array = malloc(LIST_ARRAY_LEN * sizeof(char*)); 75 char **array = malloc(LIST_ARRAY_LEN * sizeof(char*));
76 if(!array) {
77 *nelm = -1;
78 return NULL;
79 }
76 80
77 char *begin = buf; 81 char *begin = buf;
78 char *name = NULL; 82 char *name = NULL;
79 for(int i=0;i<length;i++) { 83 for(int i=0;i<length;i++) {
80 if(!name && buf[i] == '.') { 84 if(!name && buf[i] == '.') {
81 name = buf + i + 1; 85 name = buf + i + 1;
82 } 86 }
83 if(buf[i] == '\0') { 87 if(buf[i] == '\0') {
84 char *attrname = strdup(name); 88 char *attrname = strdup(name);
89 if(!attrname) {
90 strarray_free(array, arraypos);
91 *nelm = -1;
92 return NULL;
93 }
85 if(strarray_add(&array, &arraypos, &arraylen, attrname)) { 94 if(strarray_add(&array, &arraypos, &arraylen, attrname)) {
86 strarray_free(array, arraypos); 95 strarray_free(array, arraypos);
87 *nelm = -1; 96 *nelm = -1;
88 return NULL; 97 return NULL;
89 } 98 }
144 153
145 static char* name2nsname(const char *name) { 154 static char* name2nsname(const char *name) {
146 // add the 'user' namespace to the name 155 // add the 'user' namespace to the name
147 size_t namelen = strlen(name); 156 size_t namelen = strlen(name);
148 char *attrname = malloc(8 + namelen); 157 char *attrname = malloc(8 + namelen);
158 if(!attrname) {
159 return NULL;
160 }
149 memcpy(attrname, "user.", 5); 161 memcpy(attrname, "user.", 5);
150 memcpy(attrname+5, name, namelen + 1); 162 memcpy(attrname+5, name, namelen + 1);
151 return attrname; 163 return attrname;
152 } 164 }
153 165
154 char * xattr_get(const char *path, const char *attr, ssize_t *len) { 166 char * xattr_get(const char *path, const char *attr, ssize_t *len) {
155 char *attrname = name2nsname(attr); 167 char *attrname = name2nsname(attr);
168 if(!attrname) {
169 *len = -1;
170 return NULL;
171 }
156 172
157 char *buf = malloc(ATTR_BUF_LEN); 173 char *buf = malloc(ATTR_BUF_LEN);
158 if(!buf) { 174 if(!buf) {
159 *len = -1; 175 *len = -1;
176 free(attrname);
160 return NULL; 177 return NULL;
161 } 178 }
162 ssize_t vlen = getxattr(path, attrname, buf, ATTR_BUF_LEN - 1); 179 ssize_t vlen = getxattr(path, attrname, buf, ATTR_BUF_LEN - 1);
163 if(vlen < 0) { 180 if(vlen < 0) {
164 switch(errno) { 181 switch(errno) {
193 return buf; 210 return buf;
194 } 211 }
195 212
196 int xattr_set(const char *path, const char *name, const void *value, size_t len) { 213 int xattr_set(const char *path, const char *name, const void *value, size_t len) {
197 char *attrname = name2nsname(name); 214 char *attrname = name2nsname(name);
215 if(!attrname) {
216 return 1;
217 }
198 int ret = setxattr(path, attrname, value, len, 0); 218 int ret = setxattr(path, attrname, value, len, 0);
199 free(attrname); 219 free(attrname);
200 return ret; 220 return ret;
201 } 221 }
202 222
203 int xattr_remove(const char *path, const char *name) { 223 int xattr_remove(const char *path, const char *name) {
204 char *attrname = name2nsname(name); 224 char *attrname = name2nsname(name);
225 if(!attrname) {
226 return 1;
227 }
205 int ret = removexattr(path, attrname); 228 int ret = removexattr(path, attrname);
206 free(attrname); 229 free(attrname);
207 return ret; 230 return ret;
208 } 231 }
209 232

mercurial