Add caller-defined xattr handling features to private libarchive.
This commit is contained in:
parent
9ecbbbafd0
commit
08a30d270d
2 changed files with 61 additions and 0 deletions
|
@ -498,6 +498,15 @@ __LA_DECL void archive_entry_xattr_add_entry(struct archive_entry *,
|
||||||
const char * /* name */, const void * /* value */,
|
const char * /* name */, const void * /* value */,
|
||||||
size_t /* size */);
|
size_t /* size */);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Interfaces to support tagging archive entries with caller-defined xattrs.
|
||||||
|
*/
|
||||||
|
__LA_DECL void archive_entry_xattr_delete_entry(struct archive_entry *,
|
||||||
|
const char * /* name */);
|
||||||
|
__LA_DECL int archive_entry_has_xattr(struct archive_entry *entry,
|
||||||
|
const char * /* name */, const void ** /* value */,
|
||||||
|
size_t * /* size */)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* To retrieve the xattr list, first "reset", then repeatedly ask for the
|
* To retrieve the xattr list, first "reset", then repeatedly ask for the
|
||||||
* "next" entry.
|
* "next" entry.
|
||||||
|
|
|
@ -109,6 +109,58 @@ archive_entry_xattr_add_entry(struct archive_entry *entry,
|
||||||
entry->xattr_head = xp;
|
entry->xattr_head = xp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Delete the named extended attribute, if present.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
archive_entry_xattr_delete_entry(struct archive_entry *entry,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
struct ae_xattr *xp, *pxp;
|
||||||
|
|
||||||
|
pxp = NULL;
|
||||||
|
for (xp = entry->xattr_head; xp != NULL; xp = xp->next)
|
||||||
|
{
|
||||||
|
if (strcmp(name, xp->name) == 0) {
|
||||||
|
free(xp->name);
|
||||||
|
if (xp->size > 0)
|
||||||
|
free(xp->value);
|
||||||
|
if (pxp == NULL) {
|
||||||
|
/*
|
||||||
|
* Free at head.
|
||||||
|
*/
|
||||||
|
entry->xattr_head = xp->next;
|
||||||
|
free(xp);
|
||||||
|
} else {
|
||||||
|
pxp->next = xp->next;
|
||||||
|
free(xp);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pxp = xp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Search for the named extended attribute. Return it's value and size
|
||||||
|
* if present.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
archive_entry_has_xattr(struct archive_entry *entry,
|
||||||
|
const char *name, const void **value, size_t *size)
|
||||||
|
{
|
||||||
|
struct ae_xattr *xp;
|
||||||
|
|
||||||
|
for (xp = entry->xattr_head; xp != NULL; xp = xp->next)
|
||||||
|
{
|
||||||
|
if (strcmp(name, xp->name) == 0) {
|
||||||
|
*value = xp->value;
|
||||||
|
*size = xp->size;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* returns number of the extended attribute entries
|
* returns number of the extended attribute entries
|
||||||
|
|
Loading…
Reference in a new issue