aboutsummaryrefslogtreecommitdiff
path: root/lib/tar/src/pax_header.c
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2023-06-05 19:06:42 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2023-06-05 16:01:34 +0200
commitc9a8adc15f9de110771156fdc85fb98533648a53 (patch)
treecdd6300b1c69a002628a76c4bac45ac6664111d9 /lib/tar/src/pax_header.c
parent57ca46cdd74fd1004a3b0476c136e1f26fcf002d (diff)
Move dir_entry_xattr_t from libio to libsquashfs
The structure and functions are renamed to sqfs_xattr_* instead, an additional helper is added to accept an encoded xattr. Documentation and unit test are added as well. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/tar/src/pax_header.c')
-rw-r--r--lib/tar/src/pax_header.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/lib/tar/src/pax_header.c b/lib/tar/src/pax_header.c
index 81f6ad4..74a1b24 100644
--- a/lib/tar/src/pax_header.c
+++ b/lib/tar/src/pax_header.c
@@ -7,6 +7,7 @@
#include "config.h"
#include "internal.h"
+#include "sqfs/xattr.h"
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
@@ -140,27 +141,27 @@ fail:
return -1;
}
-static int pax_xattr_schily(tar_header_decoded_t *out,
- dir_entry_xattr_t *xattr)
+static int pax_xattr_schily(tar_header_decoded_t *out, sqfs_xattr_t *xattr)
{
xattr->next = out->xattr;
out->xattr = xattr;
return 0;
}
-static int pax_xattr_libarchive(tar_header_decoded_t *out,
- dir_entry_xattr_t *xattr)
+static int pax_xattr_libarchive(tar_header_decoded_t *out, sqfs_xattr_t *xattr)
{
+ char *key = (char *)xattr->data;
+ sqfs_u8 *value = xattr->data + (size_t)(xattr->value - xattr->data);
int ret;
ret = base64_decode((const char *)xattr->value, xattr->value_len,
- xattr->value, &xattr->value_len);
+ value, &xattr->value_len);
if (ret)
return -1;
- urldecode(xattr->key);
+ urldecode(key);
+ value[xattr->value_len] = '\0';
- xattr->value[xattr->value_len] = '\0';
xattr->next = out->xattr;
out->xattr = xattr;
return 0;
@@ -184,8 +185,7 @@ static const struct pax_handler_t {
int (*uint)(tar_header_decoded_t *out, sqfs_u64 uval);
int (*str)(tar_header_decoded_t *out, char *str);
int (*cstr)(tar_header_decoded_t *out, const char *str);
- int (*xattr)(tar_header_decoded_t *out,
- dir_entry_xattr_t *xattr);
+ int (*xattr)(tar_header_decoded_t *out, sqfs_xattr_t *xattr);
} cb;
} pax_fields[] = {
{ "uid", PAX_UID, PAX_TYPE_UINT, { .uint = pax_uid } },
@@ -239,7 +239,7 @@ static int apply_handler(tar_header_decoded_t *out,
const struct pax_handler_t *field, const char *key,
const char *value, size_t valuelen)
{
- dir_entry_xattr_t *xattr;
+ sqfs_xattr_t *xattr;
sqfs_s64 s64val;
sqfs_u64 uval;
char *copy;
@@ -274,9 +274,9 @@ static int apply_handler(tar_header_decoded_t *out,
}
break;
case PAX_TYPE_PREFIXED_XATTR:
- xattr = dir_entry_xattr_create(key + strlen(field->name) + 1,
- (const sqfs_u8 *)value,
- valuelen);
+ xattr = sqfs_xattr_create(key + strlen(field->name) + 1,
+ (const sqfs_u8 *)value,
+ valuelen);
if (xattr == NULL) {
perror("reading pax xattr field");
return -1;