summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2021-10-22 17:19:34 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2022-03-30 22:31:30 +0200
commit916c8f6e26140cf3c03e58726b57dc4f86e18316 (patch)
tree59603136d62ef2b7ca3626e26929e848db7ab3f1 /lib
parenta0e9956f931e28eeb430bd2459668fd96a69c676 (diff)
Cleanup: remove struct stat from libtar
The idea was originally to use struct stat in the libfstree code, so we can simply hose data read from a directory into the fstree_t. The struct was then also used with libtar, for simpler interoperation, but it turned out to introduce a lot of platform quirks and causes more trouble than it's worth. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib')
-rw-r--r--lib/tar/pax_header.c4
-rw-r--r--lib/tar/read_header.c40
2 files changed, 15 insertions, 29 deletions
diff --git a/lib/tar/pax_header.c b/lib/tar/pax_header.c
index 71b849b..d24def0 100644
--- a/lib/tar/pax_header.c
+++ b/lib/tar/pax_header.c
@@ -10,13 +10,13 @@
static int pax_uid(tar_header_decoded_t *out, sqfs_u64 id)
{
- out->sb.st_uid = id;
+ out->uid = id;
return 0;
}
static int pax_gid(tar_header_decoded_t *out, sqfs_u64 id)
{
- out->sb.st_gid = id;
+ out->gid = id;
return 0;
}
diff --git a/lib/tar/read_header.c b/lib/tar/read_header.c
index ecba0bc..d1790de 100644
--- a/lib/tar/read_header.c
+++ b/lib/tar/read_header.c
@@ -74,27 +74,27 @@ static int decode_header(const tar_header_t *hdr, unsigned int set_by_pax,
if (!(set_by_pax & PAX_UID)) {
if (read_number(hdr->uid, sizeof(hdr->uid), &field))
return -1;
- out->sb.st_uid = field;
+ out->uid = field;
}
if (!(set_by_pax & PAX_GID)) {
if (read_number(hdr->gid, sizeof(hdr->gid), &field))
return -1;
- out->sb.st_gid = field;
+ out->gid = field;
}
if (!(set_by_pax & PAX_DEV_MAJ)) {
if (read_number(hdr->devmajor, sizeof(hdr->devmajor), &field))
return -1;
- out->sb.st_rdev = makedev(field, minor(out->sb.st_rdev));
+ out->devno = makedev(field, minor(out->devno));
}
if (!(set_by_pax & PAX_DEV_MIN)) {
if (read_number(hdr->devminor, sizeof(hdr->devminor), &field))
return -1;
- out->sb.st_rdev = makedev(major(out->sb.st_rdev), field);
+ out->devno = makedev(major(out->devno), field);
}
if (!(set_by_pax & PAX_MTIME)) {
@@ -111,7 +111,7 @@ static int decode_header(const tar_header_t *hdr, unsigned int set_by_pax,
if (read_octal(hdr->mode, sizeof(hdr->mode), &field))
return -1;
- out->sb.st_mode = field & 07777;
+ out->mode = field & 07777;
if (hdr->typeflag == TAR_TYPE_LINK ||
hdr->typeflag == TAR_TYPE_SLINK) {
@@ -131,42 +131,31 @@ static int decode_header(const tar_header_t *hdr, unsigned int set_by_pax,
case '\0':
case TAR_TYPE_FILE:
case TAR_TYPE_GNU_SPARSE:
- out->sb.st_mode |= S_IFREG;
+ out->mode |= S_IFREG;
break;
case TAR_TYPE_LINK:
out->is_hard_link = true;
break;
case TAR_TYPE_SLINK:
- out->sb.st_mode = S_IFLNK | 0777;
+ out->mode = S_IFLNK | 0777;
break;
case TAR_TYPE_CHARDEV:
- out->sb.st_mode |= S_IFCHR;
+ out->mode |= S_IFCHR;
break;
case TAR_TYPE_BLOCKDEV:
- out->sb.st_mode |= S_IFBLK;
+ out->mode |= S_IFBLK;
break;
case TAR_TYPE_DIR:
- out->sb.st_mode |= S_IFDIR;
+ out->mode |= S_IFDIR;
break;
case TAR_TYPE_FIFO:
- out->sb.st_mode |= S_IFIFO;
+ out->mode |= S_IFIFO;
break;
default:
out->unknown_record = true;
break;
}
- if (sizeof(time_t) * CHAR_BIT < 64) {
- if (out->mtime > (sqfs_s64)INT32_MAX) {
- out->sb.st_mtime = INT32_MAX;
- } else if (out->mtime < (sqfs_s64)INT32_MIN) {
- out->sb.st_mtime = INT32_MIN;
- } else {
- out->sb.st_mtime = out->mtime;
- }
- } else {
- out->sb.st_mtime = out->mtime;
- }
return 0;
}
@@ -268,12 +257,9 @@ int read_header(istream_t *fp, tar_header_decoded_t *out)
goto fail;
}
- if (out->sparse != NULL) {
- out->sb.st_size = out->actual_size;
- } else {
- out->sb.st_size = out->record_size;
+ if (out->sparse == NULL)
out->actual_size = out->record_size;
- }
+
return 0;
out_eof:
clear_header(out);