diff options
author | Gao Xiang <hsiangkao@linux.alibaba.com> | 2023-09-20 11:51:41 +0800 |
---|---|---|
committer | Gao Xiang <hsiangkao@linux.alibaba.com> | 2023-09-20 19:35:12 +0800 |
commit | c58fa46e949f419fdb02669c1e0f4e2665042173 (patch) | |
tree | ffd1d43012c894cfef532033ea06922237c00fde | |
parent | c60712e595273bb3035d1789a3b8c2a8f8130cb1 (diff) | |
download | erofs-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.c | 24 |
1 files changed, 18 insertions, 6 deletions
@@ -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; |