aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGao Xiang <hsiangkao@linux.alibaba.com>2023-09-20 11:51:41 +0800
committerGao Xiang <hsiangkao@linux.alibaba.com>2023-09-20 19:35:12 +0800
commitc58fa46e949f419fdb02669c1e0f4e2665042173 (patch)
treeffd1d43012c894cfef532033ea06922237c00fde
parentc60712e595273bb3035d1789a3b8c2a8f8130cb1 (diff)
downloaderofs-utils-c58fa46e949f419fdb02669c1e0f4e2665042173.tar.gz
erofs-utils: mkfs: support exporting GNU tar archive labels
GNU tar volume labels (by using `-V`) will be applied to EROFS. Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com> Link: https://lore.kernel.org/r/20230920035141.533474-1-hsiangkao@linux.alibaba.com
-rw-r--r--lib/tar.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/lib/tar.c b/lib/tar.c
index 29fa15d..54acba5 100644
--- a/lib/tar.c
+++ b/lib/tar.c
@@ -17,6 +17,9 @@
#include "erofs/blobchunk.h"
#include "erofs/rebuild.h"
+/* This file is a tape/volume header. Ignore it on extraction. */
+#define GNUTYPE_VOLHDR 'V'
+
struct tar_header {
char name[100]; /* 0-99 */
char mode[8]; /* 100-107 */
@@ -634,12 +637,6 @@ restart:
goto restart;
}
- if (memcmp(th->magic, "ustar", 5)) {
- erofs_err("invalid tar magic @ %llu", tar_offset);
- ret = -EIO;
- goto out;
- }
-
/* chksum field itself treated as ' ' */
csum = tarerofs_otoi(th->chksum, sizeof(th->chksum));
if (errno) {
@@ -665,6 +662,21 @@ restart:
goto out;
}
+ if (th->typeflag == GNUTYPE_VOLHDR) {
+ if (th->size[0])
+ erofs_warn("GNUTYPE_VOLHDR with non-zeroed size @ %llu",
+ tar_offset);
+ /* anyway, strncpy could cause some GCC warning here */
+ memcpy(sbi->volume_name, th->name, sizeof(sbi->volume_name));
+ goto restart;
+ }
+
+ if (memcmp(th->magic, "ustar", 5)) {
+ erofs_err("invalid tar magic @ %llu", tar_offset);
+ ret = -EIO;
+ goto out;
+ }
+
st.st_mode = tarerofs_otoi(th->mode, sizeof(th->mode));
if (errno)
goto invalid_tar;