summaryrefslogtreecommitdiff
path: root/include/tar/tar.h
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2022-06-29 18:21:58 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2022-07-08 19:17:35 +0200
commite6a19ba1a05f77f051187a6b1a828ee6d39ce052 (patch)
treec8a1566b10883edbe4a8bc9a724461f4003aaa10 /include/tar/tar.h
parent359d71e90050a8b83f7bc7d2ecd4ff29c477cc22 (diff)
Cleanup: split libtar header, move to sub directory
Some of the on-disk format internals are moved to a separate header and some of the stuff from internal.h is moved to that format header. C++ guards are added in addtion. Everything PAX related is moved to pax_header.c, some internal functions are marked as static. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'include/tar/tar.h')
-rw-r--r--include/tar/tar.h92
1 files changed, 92 insertions, 0 deletions
diff --git a/include/tar/tar.h b/include/tar/tar.h
new file mode 100644
index 0000000..128464e
--- /dev/null
+++ b/include/tar/tar.h
@@ -0,0 +1,92 @@
+/* SPDX-License-Identifier: GPL-3.0-or-later */
+/*
+ * tar.h
+ *
+ * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
+ */
+#ifndef TAR_H
+#define TAR_H
+
+#include "config.h"
+#include "compat.h"
+#include "io/istream.h"
+#include "io/ostream.h"
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+
+typedef struct sparse_map_t {
+ struct sparse_map_t *next;
+ sqfs_u64 offset;
+ 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;
+ sparse_map_t *sparse;
+ sqfs_u64 actual_size;
+ sqfs_u64 record_size;
+ bool unknown_record;
+ bool is_hard_link;
+ tar_xattr_t *xattr;
+
+ sqfs_u16 mode;
+ sqfs_u64 uid;
+ sqfs_u64 gid;
+ sqfs_u64 devno;
+ sqfs_s64 mtime;
+} tar_header_decoded_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ Returns < 0 on failure, > 0 if cannot encode, 0 on success.
+ Prints error/warning messages to stderr.
+
+ The counter is an incremental record counter used if additional
+ 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,
+ unsigned int counter);
+
+int write_hard_link(ostream_t *fp, const struct stat *sb, const char *name,
+ const char *target, unsigned int counter);
+
+/* calcuate and skip the zero padding */
+int skip_padding(istream_t *fp, sqfs_u64 size);
+
+/* round up to block size and skip the entire entry */
+int skip_entry(istream_t *fp, sqfs_u64 size);
+
+int read_header(istream_t *fp, tar_header_decoded_t *out);
+
+void clear_header(tar_header_decoded_t *hdr);
+
+/*
+ Write zero bytes to an output file to padd it to the tar record size.
+ Returns 0 on success. On failure, prints error message to stderr.
+*/
+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
+
+#endif /* TAR_H */