From e6a19ba1a05f77f051187a6b1a828ee6d39ce052 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Wed, 29 Jun 2022 18:21:58 +0200 Subject: 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 --- include/tar/format.h | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 include/tar/format.h (limited to 'include/tar/format.h') diff --git a/include/tar/format.h b/include/tar/format.h new file mode 100644 index 0000000..53a4665 --- /dev/null +++ b/include/tar/format.h @@ -0,0 +1,105 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * format.h + * + * Copyright (C) 2019 David Oberhollenzer + */ +#ifndef TAR_FORMAT_H +#define TAR_FORMAT_H + +#include "sqfs/predef.h" + +typedef struct { + char name[100]; + char mode[8]; + char uid[8]; + char gid[8]; + char size[12]; + char mtime[12]; + char chksum[8]; + char typeflag; + char linkname[100]; + char magic[6]; + char version[2]; + char uname[32]; + char gname[32]; + char devmajor[8]; + char devminor[8]; + union { + struct { + char prefix[155]; + char padding[12]; + } posix; + + struct { + char atime[12]; + char ctime[12]; + char offset[12]; + char deprecated[4]; + char unused; + struct { + char offset[12]; + char numbytes[12]; + } sparse[4]; + char isextended; + char realsize[12]; + char padding[17]; + } gnu; + } tail; +} tar_header_t; + +typedef struct { + struct { + char offset[12]; + char numbytes[12]; + } sparse[21]; + char isextended; + char padding[7]; +} gnu_sparse_t; + +#define TAR_TYPE_FILE '0' +#define TAR_TYPE_LINK '1' +#define TAR_TYPE_SLINK '2' +#define TAR_TYPE_CHARDEV '3' +#define TAR_TYPE_BLOCKDEV '4' +#define TAR_TYPE_DIR '5' +#define TAR_TYPE_FIFO '6' + +#define TAR_TYPE_GNU_SLINK 'K' +#define TAR_TYPE_GNU_PATH 'L' +#define TAR_TYPE_GNU_SPARSE 'S' + +#define TAR_TYPE_PAX 'x' +#define TAR_TYPE_PAX_GLOBAL 'g' + +#define TAR_MAGIC "ustar" +#define TAR_VERSION "00" + +#define TAR_MAGIC_OLD "ustar " +#define TAR_VERSION_OLD " " + +#define TAR_RECORD_SIZE (512) + +/* artificially imposed implementation limits */ +#define TAR_MAX_SYMLINK_LEN (65536) +#define TAR_MAX_PATH_LEN (65536) +#define TAR_MAX_PAX_LEN (65536) +#define TAR_MAX_SPARSE_ENT (65536) + +#ifdef __cplusplus +extern "C" { +#endif + +int read_octal(const char *str, int digits, sqfs_u64 *out); + +int read_number(const char *str, int digits, sqfs_u64 *out); + +void update_checksum(tar_header_t *hdr); + +bool is_checksum_valid(const tar_header_t *hdr); + +#ifdef __cplusplus +} +#endif + +#endif /* TAR_FORMAT_H */ -- cgit v1.2.3