aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bin/sqfs2tar/src/sqfs2tar.h2
-rw-r--r--bin/sqfs2tar/src/write_tree.c4
-rw-r--r--bin/sqfs2tar/src/xattr.c23
-rw-r--r--bin/tar2sqfs/src/process_tarball.c2
-rw-r--r--include/io/xattr.h17
-rw-r--r--include/tar/tar.h15
-rw-r--r--lib/io/Makemodule.am3
-rw-r--r--lib/io/src/xattr.c40
-rw-r--r--lib/tar/src/cleanup.c13
-rw-r--r--lib/tar/src/pax_header.c36
-rw-r--r--lib/tar/src/write_header.c6
-rw-r--r--lib/tar/test/tar_write_simple.c41
12 files changed, 96 insertions, 106 deletions
diff --git a/bin/sqfs2tar/src/sqfs2tar.h b/bin/sqfs2tar/src/sqfs2tar.h
index 4bf5428..88185ee 100644
--- a/bin/sqfs2tar/src/sqfs2tar.h
+++ b/bin/sqfs2tar/src/sqfs2tar.h
@@ -48,7 +48,7 @@ char *assemble_tar_path(char *name, bool is_dir);
/* xattr.c */
int get_xattrs(const char *name, const sqfs_inode_generic_t *inode,
- tar_xattr_t **out);
+ dir_entry_xattr_t **out);
/* write_tree.c */
int write_tree(const sqfs_tree_node_t *n);
diff --git a/bin/sqfs2tar/src/write_tree.c b/bin/sqfs2tar/src/write_tree.c
index 354ec21..150bac1 100644
--- a/bin/sqfs2tar/src/write_tree.c
+++ b/bin/sqfs2tar/src/write_tree.c
@@ -68,7 +68,7 @@ static void inode_stat(const sqfs_tree_node_t *node, struct stat *sb)
static int write_tree_dfs(const sqfs_tree_node_t *n)
{
sqfs_hard_link_t *lnk = NULL;
- tar_xattr_t *xattr = NULL;
+ dir_entry_xattr_t *xattr = NULL;
char *name, *target;
struct stat sb;
size_t len;
@@ -134,7 +134,7 @@ static int write_tree_dfs(const sqfs_tree_node_t *n)
target = S_ISLNK(sb.st_mode) ? (char *)n->inode->extra : NULL;
ret = write_tar_header(out_file, &sb, name, target, xattr,
record_counter++);
- free_xattr_list(xattr);
+ dir_entry_xattr_list_free(xattr);
if (ret > 0)
goto out_skip;
diff --git a/bin/sqfs2tar/src/xattr.c b/bin/sqfs2tar/src/xattr.c
index abec4fb..8d21cd8 100644
--- a/bin/sqfs2tar/src/xattr.c
+++ b/bin/sqfs2tar/src/xattr.c
@@ -6,32 +6,25 @@
*/
#include "sqfs2tar.h"
-static tar_xattr_t *mkxattr(const sqfs_xattr_entry_t *key,
- const sqfs_xattr_value_t *value)
+static dir_entry_xattr_t *mkxattr(const sqfs_xattr_entry_t *key,
+ const sqfs_xattr_value_t *value)
{
- tar_xattr_t *ent;
-
- ent = calloc(1, sizeof(*ent) + strlen((const char *)key->key) +
- value->size + 2);
+ dir_entry_xattr_t *ent;
+ ent = dir_entry_xattr_create((const char *)key->key,
+ value->value, value->size);
if (ent == NULL) {
perror("creating xattr entry");
return NULL;
}
- ent->key = ent->data;
- ent->value = (sqfs_u8 *)ent->key + strlen((const char *)key->key) + 1;
- ent->value_len = value->size;
-
- strcpy(ent->key, (const char *)key->key);
- memcpy(ent->value, value->value, value->size + 1);
return ent;
}
int get_xattrs(const char *name, const sqfs_inode_generic_t *inode,
- tar_xattr_t **out)
+ dir_entry_xattr_t **out)
{
- tar_xattr_t *list = NULL, *ent;
+ dir_entry_xattr_t *list = NULL, *ent;
sqfs_xattr_value_t *value;
sqfs_xattr_entry_t *key;
sqfs_xattr_id_t desc;
@@ -86,6 +79,6 @@ int get_xattrs(const char *name, const sqfs_inode_generic_t *inode,
*out = list;
return 0;
fail:
- free_xattr_list(list);
+ dir_entry_xattr_list_free(list);
return -1;
}
diff --git a/bin/tar2sqfs/src/process_tarball.c b/bin/tar2sqfs/src/process_tarball.c
index 2ba018d..bcc60db 100644
--- a/bin/tar2sqfs/src/process_tarball.c
+++ b/bin/tar2sqfs/src/process_tarball.c
@@ -41,7 +41,7 @@ static int write_file(istream_t *input_file, sqfs_writer_t *sqfs,
static int copy_xattr(sqfs_writer_t *sqfs, tree_node_t *node,
const tar_header_decoded_t *hdr)
{
- tar_xattr_t *xattr;
+ dir_entry_xattr_t *xattr;
int ret;
ret = sqfs_xattr_writer_begin(sqfs->xwr, 0);
diff --git a/include/io/xattr.h b/include/io/xattr.h
index d912fad..cf35bca 100644
--- a/include/io/xattr.h
+++ b/include/io/xattr.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: LGPL-3.0-or-later */
+/* SPDX-License-Identifier: GPL-3.0-or-later */
/*
* xattr.h
*
@@ -7,6 +7,8 @@
#ifndef IO_XATTR_H
#define IO_XATTR_H
+#include "sqfs/predef.h"
+
typedef struct dir_entry_xattr_t {
struct dir_entry_xattr_t *next;
char *key;
@@ -15,4 +17,17 @@ typedef struct dir_entry_xattr_t {
char data[];
} dir_entry_xattr_t;
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+dir_entry_xattr_t *dir_entry_xattr_create(const char *key, const sqfs_u8 *value,
+ size_t value_len);
+
+void dir_entry_xattr_list_free(dir_entry_xattr_t *list);
+
+#ifdef __cplusplus
+}
+#endif
+
#endif /* IO_XATTR_H */
diff --git a/include/tar/tar.h b/include/tar/tar.h
index 7c4faa7..21ded7d 100644
--- a/include/tar/tar.h
+++ b/include/tar/tar.h
@@ -11,6 +11,7 @@
#include "compat.h"
#include "io/istream.h"
#include "io/ostream.h"
+#include "io/dir_iterator.h"
#include <stdbool.h>
#include <stdint.h>
@@ -22,14 +23,6 @@ typedef struct sparse_map_t {
sqfs_u64 count;
} sparse_map_t;
-typedef struct tar_xattr_t {
- struct tar_xattr_t *next;
- char *key;
- sqfs_u8 *value;
- size_t value_len;
- char data[];
-} tar_xattr_t;
-
typedef struct {
char *name;
char *link_target;
@@ -38,7 +31,7 @@ typedef struct {
sqfs_u64 record_size;
bool unknown_record;
bool is_hard_link;
- tar_xattr_t *xattr;
+ dir_entry_xattr_t *xattr;
sqfs_u16 mode;
sqfs_u64 uid;
@@ -59,7 +52,7 @@ extern "C" {
headers need to be generated.
*/
int write_tar_header(ostream_t *fp, const struct stat *sb, const char *name,
- const char *slink_target, const tar_xattr_t *xattr,
+ const char *slink_target, const dir_entry_xattr_t *xattr,
unsigned int counter);
int write_hard_link(ostream_t *fp, const struct stat *sb, const char *name,
@@ -83,8 +76,6 @@ int padd_file(ostream_t *fp, sqfs_u64 size);
void free_sparse_list(sparse_map_t *sparse);
-void free_xattr_list(tar_xattr_t *list);
-
#ifdef __cplusplus
}
#endif
diff --git a/lib/io/Makemodule.am b/lib/io/Makemodule.am
index 841febf..3be208f 100644
--- a/lib/io/Makemodule.am
+++ b/lib/io/Makemodule.am
@@ -3,7 +3,8 @@ libio_a_SOURCES = include/io/istream.h include/io/ostream.h include/io/xfrm.h \
include/io/dir_iterator.h include/io/xattr.h \
lib/io/src/internal.h lib/io/src/ostream.c \
lib/io/src/istream.c lib/io/src/get_line.c lib/io/src/xfrm/ostream.c \
- lib/io/src/xfrm/istream.c lib/io/src/dir_tree_iterator.c
+ lib/io/src/xfrm/istream.c lib/io/src/dir_tree_iterator.c \
+ lib/io/src/xattr.c
libio_a_CFLAGS = $(AM_CFLAGS) $(ZLIB_CFLAGS) $(XZ_CFLAGS)
libio_a_CFLAGS += $(ZSTD_CFLAGS) $(BZIP2_CFLAGS)
diff --git a/lib/io/src/xattr.c b/lib/io/src/xattr.c
new file mode 100644
index 0000000..dd9a338
--- /dev/null
+++ b/lib/io/src/xattr.c
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: GPL-3.0-or-later */
+/*
+ * xattr.c
+ *
+ * Copyright (C) 2023 David Oberhollenzer <goliath@infraroot.at>
+ */
+#include "io/xattr.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+dir_entry_xattr_t *dir_entry_xattr_create(const char *key, const sqfs_u8 *value,
+ size_t value_len)
+{
+ size_t key_len = strlen(key);
+ dir_entry_xattr_t *out = calloc(1, sizeof(*out) + key_len + 1 +
+ value_len + 1);
+
+ if (out != NULL) {
+ out->key = out->data;
+ out->value = (sqfs_u8 *)(out->data + key_len + 1);
+
+ memcpy(out->key, key, key_len);
+ memcpy(out->value, value, value_len);
+ out->value_len = value_len;
+ }
+
+ return out;
+}
+
+void dir_entry_xattr_list_free(dir_entry_xattr_t *list)
+{
+ dir_entry_xattr_t *old;
+
+ while (list != NULL) {
+ old = list;
+ list = list->next;
+ free(old);
+ }
+}
diff --git a/lib/tar/src/cleanup.c b/lib/tar/src/cleanup.c
index 9f33336..3ba8019 100644
--- a/lib/tar/src/cleanup.c
+++ b/lib/tar/src/cleanup.c
@@ -21,20 +21,9 @@ void free_sparse_list(sparse_map_t *sparse)
}
}
-void free_xattr_list(tar_xattr_t *list)
-{
- tar_xattr_t *old;
-
- while (list != NULL) {
- old = list;
- list = list->next;
- free(old);
- }
-}
-
void clear_header(tar_header_decoded_t *hdr)
{
- free_xattr_list(hdr->xattr);
+ dir_entry_xattr_list_free(hdr->xattr);
free_sparse_list(hdr->sparse);
free(hdr->name);
free(hdr->link_target);
diff --git a/lib/tar/src/pax_header.c b/lib/tar/src/pax_header.c
index b61aab6..81f6ad4 100644
--- a/lib/tar/src/pax_header.c
+++ b/lib/tar/src/pax_header.c
@@ -141,7 +141,7 @@ fail:
}
static int pax_xattr_schily(tar_header_decoded_t *out,
- tar_xattr_t *xattr)
+ dir_entry_xattr_t *xattr)
{
xattr->next = out->xattr;
out->xattr = xattr;
@@ -149,7 +149,7 @@ static int pax_xattr_schily(tar_header_decoded_t *out,
}
static int pax_xattr_libarchive(tar_header_decoded_t *out,
- tar_xattr_t *xattr)
+ dir_entry_xattr_t *xattr)
{
int ret;
@@ -184,7 +184,8 @@ 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, tar_xattr_t *xattr);
+ int (*xattr)(tar_header_decoded_t *out,
+ dir_entry_xattr_t *xattr);
} cb;
} pax_fields[] = {
{ "uid", PAX_UID, PAX_TYPE_UINT, { .uint = pax_uid } },
@@ -234,33 +235,11 @@ static const struct pax_handler_t *find_handler(const char *key)
return NULL;
}
-static tar_xattr_t *mkxattr(const char *key,
- const char *value, size_t valuelen)
-{
- size_t keylen = strlen(key);
- tar_xattr_t *xattr;
-
- xattr = calloc(1, sizeof(*xattr) + keylen + 1 + valuelen + 1);
- if (xattr == NULL)
- return NULL;
-
- xattr->key = xattr->data;
- memcpy(xattr->key, key, keylen);
- xattr->key[keylen] = '\0';
-
- xattr->value = (sqfs_u8 *)xattr->key + keylen + 1;
- memcpy(xattr->value, value, valuelen);
- xattr->value[valuelen] = '\0';
-
- xattr->value_len = valuelen;
- return xattr;
-}
-
static int apply_handler(tar_header_decoded_t *out,
const struct pax_handler_t *field, const char *key,
const char *value, size_t valuelen)
{
- tar_xattr_t *xattr;
+ dir_entry_xattr_t *xattr;
sqfs_s64 s64val;
sqfs_u64 uval;
char *copy;
@@ -295,8 +274,9 @@ static int apply_handler(tar_header_decoded_t *out,
}
break;
case PAX_TYPE_PREFIXED_XATTR:
- xattr = mkxattr(key + strlen(field->name) + 1,
- value, valuelen);
+ xattr = dir_entry_xattr_create(key + strlen(field->name) + 1,
+ (const sqfs_u8 *)value,
+ valuelen);
if (xattr == NULL) {
perror("reading pax xattr field");
return -1;
diff --git a/lib/tar/src/write_header.c b/lib/tar/src/write_header.c
index 6876c38..f5473ca 100644
--- a/lib/tar/src/write_header.c
+++ b/lib/tar/src/write_header.c
@@ -144,11 +144,11 @@ static size_t prefix_digit_len(size_t len)
}
static int write_schily_xattr(ostream_t *fp, const struct stat *orig,
- const char *name, const tar_xattr_t *xattr)
+ const char *name, const dir_entry_xattr_t *xattr)
{
static const char *prefix = "SCHILY.xattr.";
size_t len, total_size = 0;
- const tar_xattr_t *it;
+ const dir_entry_xattr_t *it;
char *buffer, *ptr;
int ret;
@@ -184,7 +184,7 @@ static int write_schily_xattr(ostream_t *fp, const struct stat *orig,
}
int write_tar_header(ostream_t *fp, const struct stat *sb, const char *name,
- const char *slink_target, const tar_xattr_t *xattr,
+ const char *slink_target, const dir_entry_xattr_t *xattr,
unsigned int counter)
{
const char *reason;
diff --git a/lib/tar/test/tar_write_simple.c b/lib/tar/test/tar_write_simple.c
index c78565b..738b469 100644
--- a/lib/tar/test/tar_write_simple.c
+++ b/lib/tar/test/tar_write_simple.c
@@ -52,29 +52,7 @@ static const char *buffer_get_filename(ostream_t *strm)
#define TIME_STAMP (1057296600)
-static tar_xattr_t *mkxattr(const char *key, const sqfs_u8 *value,
- size_t value_len)
-{
- size_t key_len = strlen(key);
- tar_xattr_t *out = malloc(sizeof(*out) + key_len + 1 + value_len + 1);
-
- TEST_NOT_NULL(out);
-
- out->next = NULL;
- out->key = out->data;
- out->value = (sqfs_u8 *)(out->data + key_len + 1);
- out->value_len = value_len;
-
- memcpy(out->data, key, key_len);
- out->data[key_len] = '\0';
-
- memcpy(out->data + key_len + 1, value, value_len);
- out->data[key_len + 1 + value_len] = '\0';
-
- return out;
-}
-
-static tar_xattr_t *mkxattr_chain(void)
+static dir_entry_xattr_t *mkxattr_chain(void)
{
static const uint8_t value[] = {
0x00, 0x00, 0x00, 0x02,
@@ -83,17 +61,20 @@ static tar_xattr_t *mkxattr_chain(void)
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
};
- tar_xattr_t *list;
-
- list = mkxattr("user.mime_type", (const sqfs_u8 *)"blob/magic", 10);
- list->next = mkxattr("security.capability", value, sizeof(value));
-
+ dir_entry_xattr_t *list;
+
+ list = dir_entry_xattr_create("user.mime_type",
+ (const sqfs_u8 *)"blob/magic", 10);
+ TEST_NOT_NULL(list);
+ list->next = dir_entry_xattr_create("security.capability",
+ value, sizeof(value));
+ TEST_NOT_NULL(list->next);
return list;
}
int main(int argc, char **argv)
{
- tar_xattr_t *xattr;
+ dir_entry_xattr_t *xattr;
struct stat sb;
istream_t *fp;
int ret;
@@ -173,7 +154,7 @@ int main(int argc, char **argv)
ret = write_tar_header(&mem_stream, &sb, "home/goliath/test.exe",
NULL, xattr, 11);
TEST_EQUAL_I(ret, 0);
- free_xattr_list(xattr);
+ dir_entry_xattr_list_free(xattr);
ret = ostream_append(&mem_stream, ":-)\n", 4);
TEST_EQUAL_I(ret, 0);