133 switch(errno) { |
133 switch(errno) { |
134 case ERANGE: { |
134 case ERANGE: { |
135 ssize_t attrlen = getxattr(path, attrname, NULL, 0); |
135 ssize_t attrlen = getxattr(path, attrname, NULL, 0); |
136 if(attrlen > 0) { |
136 if(attrlen > 0) { |
137 free(buf); |
137 free(buf); |
138 buf = malloc(attrlen); |
138 buf = malloc(attrlen + 1); |
139 vlen = getxattr(path, attrname, buf, attrlen); |
139 vlen = getxattr(path, attrname, buf, attrlen); |
140 if(vlen > 0) { |
140 if(vlen > 0) { |
141 break; |
141 break; |
142 } |
142 } |
143 } |
143 } |
236 if(attrlen < 0) { |
237 if(attrlen < 0) { |
237 *len = -1; |
238 *len = -1; |
238 return NULL; |
239 return NULL; |
239 } |
240 } |
240 |
241 |
241 char *buf = malloc(attrlen); |
242 char *buf = malloc(attrlen + 1); |
242 ssize_t vlen = getxattr(path, attr, buf, attrlen, 0, 0); |
243 ssize_t vlen = getxattr(path, attr, buf, attrlen, 0, 0); |
243 if(vlen < 0) { |
244 if(vlen < 0) { |
244 *len = -1; |
245 *len = -1; |
245 free(buf); |
246 free(buf); |
246 return NULL; |
247 return NULL; |
247 } |
248 } |
248 |
249 |
|
250 buf[attrlen] = 0; |
249 *len = vlen; |
251 *len = vlen; |
250 return buf; |
252 return buf; |
251 } |
253 } |
252 |
254 |
253 int xattr_set(const char *path, const char *name, const void *value, size_t len) { |
255 int xattr_set(const char *path, const char *name, const void *value, size_t len) { |
325 close(attrfile); |
327 close(attrfile); |
326 return NULL; |
328 return NULL; |
327 } |
329 } |
328 |
330 |
329 size_t bufsize = (size_t)s.st_size; |
331 size_t bufsize = (size_t)s.st_size; |
330 char *buf = malloc(bufsize); |
332 char *buf = malloc(bufsize + 1); |
|
333 buf[bufsize] = 0; |
331 |
334 |
332 char *b = buf; |
335 char *b = buf; |
333 size_t cur = 0; |
336 size_t cur = 0; |
334 while(cur < bufsize) { |
337 while(cur < bufsize) { |
335 ssize_t r = read(attrfile, buf + cur, bufsize - cur); |
338 ssize_t r = read(attrfile, buf + cur, bufsize - cur); |
394 static char ** parse_xattrlist(char *buf, ssize_t length, ssize_t *nelm) { |
397 static char ** parse_xattrlist(char *buf, ssize_t length, ssize_t *nelm) { |
395 size_t arraylen = LIST_ARRAY_LEN; |
398 size_t arraylen = LIST_ARRAY_LEN; |
396 size_t arraypos = 0; |
399 size_t arraypos = 0; |
397 char **array = malloc(LIST_ARRAY_LEN * sizeof(char*)); |
400 char **array = malloc(LIST_ARRAY_LEN * sizeof(char*)); |
398 |
401 |
399 char *name = buf; |
|
400 for(int i=0;i<length;i++) { |
402 for(int i=0;i<length;i++) { |
401 char namelen = buf[i]; |
403 char namelen = buf[i]; |
402 char *name = buf + i + 1; |
404 char *name = buf + i + 1; |
403 char *attrname = malloc(namelen + 1); |
405 char *attrname = malloc(namelen + 1); |
404 memcpy(attrname, name, namelen); |
406 memcpy(attrname, name, namelen); |
444 if(attrlen < 0) { |
446 if(attrlen < 0) { |
445 *len = -1; |
447 *len = -1; |
446 return NULL; |
448 return NULL; |
447 } |
449 } |
448 |
450 |
449 char *buf = malloc(attrlen); |
451 char *buf = malloc(attrlen + 1); |
450 ssize_t vlen = extattr_get_file(path, EXTATTR_NAMESPACE_USER, attr, buf, attrlen); |
452 ssize_t vlen = extattr_get_file(path, EXTATTR_NAMESPACE_USER, attr, buf, attrlen); |
451 if(vlen < 0) { |
453 if(vlen < 0) { |
452 *len = -1; |
454 *len = -1; |
453 free(buf); |
455 free(buf); |
454 return NULL; |
456 return NULL; |
455 } |
457 } |
456 |
458 buf[attrlen] = 0; |
457 *len = vlen; |
459 *len = vlen; |
458 return buf; |
460 return buf; |
459 } |
461 } |
460 |
462 |
461 int xattr_set(const char *path, const char *name, const void *value, size_t len) { |
463 int xattr_set(const char *path, const char *name, const void *value, size_t len) { |