This is just a quick hack for now, but we need something like it in
order to correctly extract some newer tars with correct timestamps, in
particular python-generated ones like
https://pypi.io/packages/source/w/wheel/wheel-0.36.2.tar.gz
Index: tar.c
===================================================================
RCS file: /cvs/src/bin/pax/tar.c,v
retrieving revision 1.69
diff -u -p -r1.69 tar.c
--- tar.c 14 Jun 2021 00:36:13 -0000 1.69
+++ tar.c 15 Oct 2021 21:40:49 -0000
@@ -784,12 +784,17 @@ reset:
arcn->sb.st_mode = (mode_t)(asc_ul(hd->mode, sizeof(hd->mode), OCT) &
0xfff);
arcn->sb.st_size = (off_t)asc_ull(hd->size, sizeof(hd->size), OCT);
- val = asc_ull(hd->mtime, sizeof(hd->mtime), OCT);
- if (val > MAX_TIME_T)
- arcn->sb.st_mtime = INT_MAX; /* XXX 2038 */
- else
- arcn->sb.st_mtime = val;
- arcn->sb.st_ctime = arcn->sb.st_atime = arcn->sb.st_mtime;
+ if (arcn->sb.st_mtime == 0) {
+ val = asc_ull(hd->mtime, sizeof(hd->mtime), OCT);
+ if (val > MAX_TIME_T)
+ arcn->sb.st_mtime = INT_MAX; /* XXX 2038 */
+ else
+ arcn->sb.st_mtime = val;
+ }
+ if (arcn->sb.st_ctime == 0)
+ arcn->sb.st_ctime = arcn->sb.st_mtime;
+ if (arcn->sb.st_atime == 0)
+ arcn->sb.st_atime = arcn->sb.st_mtime;
/*
* If we can find the ascii names for gname and uname in the password
@@ -1266,6 +1271,13 @@ rd_xheader(ARCHD *arcn, int global, off_
if (!strcmp(keyword, "path")) {
arcn->nlen = strlcpy(arcn->name, p,
sizeof(arcn->name));
+ } else if (!strcmp(keyword, "mtime")) {
+ /* XXX error handling, and should parse
nanoseconds */
+ arcn->sb.st_mtime = strtoull(p, NULL, 10);
+ } else if (!strcmp(keyword, "atime")) {
+ arcn->sb.st_atime = strtoull(p, NULL, 10);
+ } else if (!strcmp(keyword, "ctime")) {
+ arcn->sb.st_ctime = strtoull(p, NULL, 10);
} else if (!strcmp(keyword, "linkpath")) {
arcn->ln_nlen = strlcpy(arcn->ln_name, p,
sizeof(arcn->ln_name));